외부 third party api 이용시 넘겨받는 외부 웹훅 상태 데이터를 넘겨받아,
해당 값을 기준으로 내부 프로젝트의 상태값을 변경해야했다.
그래서
aws sam / aws mq / aws lambda / aws secret manager 를 사용해
웹훅수신 lambda를 로컬에서 간편하게 배포/빌드/테스트 하였다
작업에 앞서 간단하게 설명하자면
👉 serverless?
개발자가 서버를 관리할 필요 없이 app을 빌드하고 실행할 수 있도록하는 클라우드 네이티브 개발 모델이다.
serverless(= 서버가 없음)이지만 실제로 서버가 존재하지 않는 것은 아니다.
다만 serverless의 경우에는 application이 구동될 때에만 활성화가 된다.
즉, 이벤트가 발생될 때에만 resource가 할당되며 실행이 종료되면 resource가 비활성화되기 때문에 비용적인 측면에서도 효율성을 가질 수 있다.
👉 SAM
SAM은 Serverless Application Model의 줄임말로 aws에서 제공하는 serverless application 생성를 위한 resource 중 하나이다.
lambda를 이용하여 배포를 진행할 때 CloudFormation을 사용하게 된다면 배포를 할 서비스에 비해 CloudFormation은 방대한데 SAM은 이런 CloudFormation을 간단하게, web 개발에 쓰이는 것들만 사용할 수 있도록 해준다.
간편하게 생성할 수 있으나 제약 사항이 많다는 단점이 존재한다.
Api gateway 와 lambda를 따로 생성한 뒤 연결하여 같은 기능을 하도록 구현할 수 있으나, SAM을 사용하면 생성 및 연결 작업을 모두 진행해주기 때문에 훨씬 간편하게 구현이 가능하다.
SAM을 터미널에서 사용하기 위해서는 aws-sam-cli를 설치해야 사용할 수 있다.
작업 순서
1. mq 생성 및 확인
2. 시크릿매니저 env에서 생성한 mq 확인
3. 시크릿매니저 capa_rabbitmq_url 에서 신규 mq 확인
4. sam 을 이용한 lambda 빌드/테스트/배포
5. 외부api 가 4.에서 생성한 lambda로 요청을보내도록 설정
6. lambda 레포에서 mq 주소로 웹훅데이터 publish하도록 로직
7. mq 데이터를 수신하여 필요(각 비지니스 로직)에 맞게 데이터 가공....
명령어 입력 순서
1.brew tap aws/tap
2.brew install aws-sam-cli
3.sam init

✏️ 빌드하기
sam build --template-file your.yaml
✏️ 배포하기
$> sam build
우선 위와 같은 명령어를 통해 template.yaml에 적혀진 명세대로 프로젝트를 build한 후,
최초 수행 시
sam deploy --guided
이후 수행 시
sam deploy
deploy 명령을 통해 배포를 진행한다.
최초 배포를 진행할 때에는 꼭 --guided 옵션을 사용해주어야한다.
해당 옵션을 사용하면, 프로젝트의 argument들을 설정시켜준 뒤 배포가 진행된다.
✏️배포 응용
sam deploy --debug --config-file your.toml --no-fail-on-empty-changeset
해당 명령어는 AWS SAM 프로젝트를 배포하는 데 사용되며,아래는 각 옵션의 설명이다.
sam deploy: SAM 프로젝트를 배포하는 명령어.
--debug: 디버그 모드로 실행하도록 지정하는 옵션으로, 추가 정보와 로그를 표시하여 배포 작업을 디버깅할 수 있다.
--config-file your.toml: SAM 프로젝트의 설정 파일을 지정하는 옵션으로, your.toml에 해당하는 설정 파일을 사용하여 배포를 수행. 이 설정 파일에는 배포에 필요한 구성 정보가 포함된다.
--no-fail-on-empty-changeset: 변경 내용이 없을 때 배포를 실패로 처리하지 않도록 지정하는 옵션. 변경 내용이 없는 경우에도 배포가 계속 진행된다.
빌드와 배포를 하기 위해서는 .toml,yaml 파일을 잘 확인해야한다.
samconfig.development.toml 파일 예시
version = 0.1
[default][default.deploy]
[default.deploy.parameters]
stack_name = "test-dev"
s3_bucket = "sam-lambda-dev"
s3_prefix = "test-dev"
region = "ap-northeast-2"
capabilities = "CAPABILITY_IAM"
image_repositories = []
이 파일은 AWS SAM (Serverless Application Model) 프로젝트의 설정 파일 중 하나인 samconfig.development.toml 이다.
이 파일은 개발 환경용으로 AWS SAM 프로젝트를 배포할 때 사용되는 설정 정보를 포함하고 있다.
여기에서 중요한 설정 옵션은 다음과 같다
stack_name: CloudFormation 스택의 이름을 지정. 이 스택은 SAM 프로젝트를 배포할 때 생성. 여기서는 "test-dev"로 설정되어 있다.
s3_bucket: 배포된 SAM 애플리케이션 패키지 및 템플릿을 저장할 Amazon S3 버킷의 이름을 지정. 이 예제에서는 "sam-lambda-dev"로 설정.
s3_prefix: S3 버킷 내에서 SAM 애플리케이션 패키지 및 템플릿의 저장 위치를 지정. 예를 들어, "test-dev"로 설정하면 S3 버킷 내에서 "test-dev" 폴더에 해당 자원이 저장.
region: SAM 애플리케이션을 배포할 AWS 리전을 지정. 이 예제에서는 "ap-northeast-2"로 설정되어 있다.
capabilities: AWS CloudFormation 스택을 배포할 때 필요한 권한을 지정. 일반적으로 "CAPABILITY_IAM"을 사용하여 IAM 리소스와 관련된 권한을 부여.
image_repositories: (이 설정은 빈 배열로 설정되어 있다) SAM 애플리케이션에서 사용하는 컨테이너 이미지 저장소의 정보를 지정. 여기에 컨테이너 이미지를 빌드 및 푸시하는 관련 정보를 추가할 수 있다.
이 설정 파일은 SAM 프로젝트를 배포할 때 사용되며, 각각의 설정 항목은 해당 프로젝트의 배포 및 관리에 영향을 미친다.
✏️ template-development.yaml 파일 예시 및 설명
이 코드는 AWS SAM (Serverless Application Model)을 사용하여 AWS Lambda 함수와 API Gateway를 배포하는 서버리스 애플리케이션을 정의하는 CloudFormation 템플릿이다.
이 서버리스 애플리케이션은 "test-dev"이라는 이름의 Lambda 함수를 생성하고, "/webhook" 경로의 POST 메서드를 트리거로 하는 API Gateway를 생성합니다.
여기서 주요한 구성 요소와 역할은 다음과 같다
Globals: 이 부분에서는 함수 및 API의 일반적인 구성을 정의. 예를 들어 함수의 실행 시간 제한 및 추적 활성화를 설정.
Resources: Lambda 함수 및 API Gateway 리소스를 정의. HelloWorldFunction은 AWS Lambda 함수를 정의하며, 해당 함수는 런타임으로 Node.js 18.x를 사용하며 /webhook 경로의 POST 메서드를 처리.
Outputs: 스택을 배포한 후에는 이 부분에서 스택 내에서 생성한 리소스에 대한 출력 값을 정의. 예를 들어 API Gateway의 엔드포인트 URL과 Lambda 함수의 ARN을 출력으로 제공.
이 서버리스 애플리케이션의 주요 목적은 "/webhook" 엔드포인트로 POST 요청이 들어올 때 Lambda 함수를 트리거하여 특정 로직을 실행하는 것일 것.
이것은 주로 웹훅을 통한 외부 시스템과의 통합이나 백엔드 작업을 자동화하기 위해 사용될 수 있다.
자동 배포시 git action에서 해당 sh파일을 호출해 쉘을 실행시켰다.
- name: sam build & deploy
if: ${{ github.ref == 'refs/heads/dev' }}
run: |
cd ./esang-webhook
bash sam.deploy.sh dev
자동배포 쉘스크립트코드 (sam.deploy.sh)
STAGE=${1}
STACK_NAME=''
TEMPLATE_FILE=''
CONFIG_FILE=''
if [ "${STAGE}" == 'dev' ]; then
echo ${STAGE}
ENV='dev'
echo ${ENV}
STACK_NAME='test-dev'
TEMPLATE_FILE='test-dev.yaml'
CONFIG_FILE='test-dev.toml'
fi
echo "====================="
echo " $ sam build start $ "
echo "====================="
if ! sam build --template-file ${TEMPLATE_FILE} ; then
echo " $ sam build failed ❌ $ "
exit 1
fi
if [[ -f ".aws-sam/build/HelloWorldFunction/app.js.map" ]] ; then
rm -rf .aws-sam/build/HelloWorldFunction/app.js.map
fi
echo "============================================"
echo " $ sam build finished, sam deploy start $ "
echo "============================================"
if ! sam deploy --debug --config-file ${CONFIG_FILE} --no-fail-on-empty-changeset ; then
echo " $ sam deploy failed ❌ $ "
exit 1
fi
## rm -rf nodejs-dependency.zip
echo "========================"
echo " $ sam deploy success ⭕️ $ "
echo "========================"