AWS Cloud Club을 슬랙 채널에 재밌어 보이는 세션이 올라와서 동아리원과 신청해서 다녀왔다.
건물 정말 좋았다. 특히 엘리베이터에 버튼이 없었는데, 입구에서 QR을 스캔하면 자동으로 그 층으로 이동한다 😨
각설하고
세션의 주제는 GitHub 알람 메시징을 서버리스로 구현해보는 것이였다. 근데 AWS Bedrock(AI 서비스) 활용한 자동 코드리뷰를 곁들인...
우선 2시간이라는 AWS만을 사용해서 짧은 시간안에 신기하고 재미있는 서비스를 구현했기에 정말 놀라웠다. (돈만 있으면 뭐든 만들 수 있는 세상이 된 것 같다)
구현했던 과정과 느낀점을 소개해보고자 한다. (AWS 담당자님이 블로그에 글 작성해도 된다고 허락받았다!)
목표
AWS의 서버리스 서비스인 Lambda, DynamoDB, ApiGateway를 활용해 나만의 GitHub 알리미를 만들어 보기
용어와 각 서비스의 간단한 이해
구현에 앞서 사용할 AWS서비스와 핵심적인 용어와 개념을 짚고 넘어가자
Serverless
- 사용자가 서버를 직접 관리하지 않고 클라우드 제공자가 서버 관리를 전담하는 클라우드 컴퓨팅 모델
- AWS Lambda … 등
서버리스 아키텍처
- 서버리스 모델을 기반으로 애플리케이션을 설계하고 배포하는 방식
- 이벤트 기반으로 동작
- 백엔드 서비스가 필요한 경우에만 동적으로 리소스를 할당하는 패턴
AWS Lambda
- 서버리스 컴퓨팅 서비스로, 이벤트에 따라 코드를 실행하는 역할.
- 이벤트가 발생하면 그 코드를 실행시킴 (서버가 필요없음)
- 디른 서비스들로부터 이벤트를 받을 수 있다.
- 람다에서 라이브러리를 활용하고 싶다면 레이어 기능을 사용해야함.
- 람다에서 환경변수라는 기능을 제공함. 서비스에서 민감한 정보(키값) 같은 것을 스태틱하게 코드에 선언해서 사용하지않고 뭐 스프링으로 치면 yml 파일 같은거 제공함
AWS IAM
- 실행 역할은 람다가 함수가 다른 AWS 서비스 및 리소스에 액세스 할 수 있도록 권한을 부여하는 IAM 역할입니다. 쉽게 말해, Lambda 함수가 특정 작업을수행할 떄 필요한 “허가증” 역할을 합니다.
AWS gateway
- 클라이언트 와 백엔드 서비스의 중간 관문 역할을 하는 AWS 서비스. API 요청을 관리하고 처리하는 입구
- 파라미터 조정, 캐시, 모니터링 등의 이유로 사용
DynamoDB
- AWS에서 제공하는 NoSQL 데이터베이스
- DynamoDB Stream details 기능
- DB는 원래 수동적으로 CURD만 처리하는데
- 뭔가 이벤트가 발생하면 이걸 람다로 보낼 수 있는 기능
- 쉽게말해 DB에 뭔가 변동사항이 생기면 람다로 뭔가 할 수 있다는
SNS
- 메시지를 주고받는 퍼블리시/구독 메시징 서비스
- 뭔가 메시지(앱푸시, 메시지 등) 을 보낼 수 있는 서비스
EventBridge
- 이벤트를 사용자가 지정한 시간에 이벤트를 발생시킬 수 있는 서비스
- 이벤트를 뭐 랜덤하게 발생시키고 람다로 던지기 가능
Bedrock
- 생성형 AI를 간단히 활용할 수 있도록 지원하는 AWs의 서비스
- 학습된 AI 모델을 제공, 이를 기반으로 AI 어플리케이션을 설계할 수 있음
아키텍처 구조
구현 시작
우선 AWS에 로그인합니다. 람다 서비스로 들어가줍니다.
Lambda 생성
Create function 버튼 클릭해 함수를 생성
이름은 'WebhookToDB'로 만들고 런타임을 'Python 3.13'으로 선택합니다. execution role는 기본 세팅으로 그대로 둡니다. 이후 Create Function을 누릅니다.
API Gateway 생성
이제 API Gateway를 람다의 trigger를 추가하면서 생성합니다.
Create a new API를 선택하고, Security는 Open으로 진행합니다. 이후 Add를 눌러줍니다.
이제 Lambda의 메인 화면에서 Configuration -> Triggers를 클릭하면 WebhookToDB-API가 생성된 걸 확인할 수 있습니다.
다시 람다의 메인 화면으로 돌아가서 코드 창에 코드를 한 줄 적습니다. lambda_handler 함수 내부에 적어주시면 됩니다. print("Event: " , json.dumps(event))라고 적어둡니다. 나중에 이벤트를 받은 것을 확인하려는 용도입니다. 작성한 후 꼭 Deploy 버튼을 눌러줍니다.
새로 생긴 API Gateway의 API endpoint를 복사합니다.
이제 GitHub에 들어가서 원하는 Repository에 Webhook을 만듭니다. 🚨 꼭 Public Repo에 만드셔야 합니다. 나중에 GitHub API를 사용하여 comment를 작성하게 되는데 이때 작성이 안 될 수도 있습니다.
Payload URL에 아까 복사해둔 API endpoint를 붙여 넣습니다. Content type은 JSON으로 선택하고 아래의 Let me select individual events를 선택하여 Webhook을 사용하여 받을 event를 선택합니다.
이번 실습에서는 Issue와 Pull Request를 받습니다.
Issue 탭에서 New Issue를 클릭하여 이슈를 생성합니다.
다시 Webhook으로 돌아 가서 event를 잘 보냈는지 확인합니다. 체크 표시가 되어 있으면 잘 보낸 것입니다.
어떤 이벤트를 보냈는지 Payload를 확인하고 싶다면 위의 이미지에서 파란색으로 되어 있는 주소를 클릭하고 Recent Deliveries를 클릭하면 아래와 같은 화면을 확인할 수 있습니다. opened된 이슈 event를 보냈다는 것을 볼 수 있습니다.
이제 AWS에서도 다시 확인해봅니다. CloudWatch를 검색창에서 검색하여 들어갑니다. 왼쪽 사이드 바의 Log groups를 누르면 아까 만든 WebhookToDB 람다가 있는 것을 확인할 수 있습니다. 눌러줍니다.
로그가 두 개가 있을텐데 아래는 람다를 새로 만들었을 때의 로그이고 위의 로그가 issue를 생성했을 때의 이벤트를 받은 로그입니다.
아래의 이미지처럼 로그를 눌러보시면 확인할 수 있습니다.
글이 너무 길어져 2, 3, 4에 나누어 작성하겠습니다.