안녕하세요. J4J입니다.
이번 포스팅은 AWS Lambda와 API Gateway로 Serverless 구성하기 마지막인 GitLab으로 Lambda 자동배포하는 방법에 대해 적어보는 시간을 가져보려고 합니다.
이전 글
[SpringBoot] AWS Lambda와 API Gateway로 Serverless 구성하기 (1) - Spring 세팅 및 로컬 테스트
[SpringBoot] AWS Lambda와 API Gateway로 Serverless 구성하기 (2) - Lambda 생성해서 배포하기
[SpringBoot] AWS Lambda와 API Gateway로 Serverless 구성하기 (3) - API Gateway에 Lambda 연결하기
IAM 설정
[ 1. IAM 접속 ]
[ 2. 사용자 추가 ]
왼쪽 사용자 메뉴를 선택한 뒤 오른쪽에 있는 사용자 추가 버튼을 클릭해 줍니다.
[ 3. 사용자 상세 설정 ]
사용자 상세 설정은 다음과 같이 진행해 주시면 됩니다.
여기서 필수적으로 해야 되는 것은 AmazonS3FullAccess, AWSLambda_FullAccess 권한들을 추가해줘야 합니다.
[ 4. 사용자 액세스 키 발급 ]
생성한 사용자를 목록에서 선택하여 상세 정보로 들어갑니다.
그리고 보안 자격 증명 탭을 선택한 뒤 액세스 키 만들기를 클릭해 줍니다.
액세스 키 사례는 다음과 같이 "AWS 컴퓨팅 서비스에서 실행되는 애플리케이션"을 선택하여 액세스 키를 생성해 줍니다.
그러면 다음과 같이 액세스 키 값을 확인할 수 있으며 해당 정보는 자동 배포를 위한 GitLab 설정을 할 때 사용되니 백업을 해두셔야 합니다.
GitLab 설정
[ 1. variables 설정 ]
Lambda에 배포할 소스를 관리하는 GitLab Repository로 접속해 줍니다.
그리고 Settings → CI/CD로 이동해 줍니다.
아래로 스크롤하면 Variables가 보이는데 Collapse를 클릭한 뒤 Add variable을 이용하여 총 3개의 변수를 넣어줍니다.
추가해 줄 변수는 총 3개입니다.
- AWS_ACCESS_KEY_ID → IAM 사용자 액세스 키
- AWS_SECRET_ACCESS_KEY → IAM 사용자 비밀 액세스 키
- AWS_DEFAULT_REGION → 사용하는 Region
여기서 주의해야 할 점은 배포되는 branch가 protected (보호모드)가 적용되어 있지 않다면 Flags에서 Protect variable 체크를 해제해야 합니다.
[ 2. .gitlab-ci.yml 작성 ]
Spring 프로젝트 최상단에 .gitlab-ci.yml 파일을 생성하여 이전 글에서 수동으로 한 것처럼 자동 배포 될 수 있게 코드를 작성해 보겠습니다.
# 실행될 stage 지정 (위에서 아래로 차례대로 실행)
stages:
- build
- package
- deploy
variables:
S3_BUCKET_NAME: j4j-lambda-apigateway-bucket
S3_OBJECT_NAME: lambdaApiGateway-0.0.1-SNAPSHOT-aws.jar
LAMBDA_NAME: apigateway-lambda
build: # JOB 이름
# 사용될 이미지 설정
image: gradle:7.6.1-jdk11
# stage 설정
stage: build
# 실행될 script 설정
script:
- chmod +x gradlew
- ./gradlew build
# artifacts 설정 (bulld를 통해 생성된 파일을 job artifacts에 보관하여 다음에 수행되는 JOB에서 가져다 활용할 수 있게 도와줌)
artifacts:
# 보관이 이루어질 경로 설정
paths:
- build/libs/*-aws.jar
# 유효기간 설정
expire_in: 1 days
# JOB이 수행될 branch 설정 (설정된 branch에 push가 발생될 시 JOB 수행)
only:
- master
package: # JOB 이름
# 사용될 이미지 설정
image: docker:latest
# stage 설정
stage: package
# service 설정 (설정한 image가 작업이 이루어지는 동안 실행되는 docker 이미지)
services:
- docker:dind
# 실행될 script 설정
script:
- apk add --no-cache curl jq python3 py3-pip
- pip install awscli
- aws s3 cp build/libs/*-aws.jar s3://$S3_BUCKET_NAME/$S3_OBJECT_NAME
# JOB이 수행될 branch 설정 (설정된 branch에 push가 발생될 시 JOB 수행)
only:
- master
deploy: # JOB 이름
# 사용될 이미지 설정
image: docker:latest
# stage 설정
stage: deploy
# service 설정 (설정한 image가 작업이 이루어지는 동안 실행되는 docker 이미지)
services:
- docker:dind
# 실행될 script 설정
script:
- apk add --no-cache curl jq python3 py3-pip
- pip install awscli
- aws configure set region ap-northeast-2
- aws lambda update-function-code
--function-name $LAMBDA_NAME
--s3-bucket $S3_BUCKET_NAME
--s3-key $S3_OBJECT_NAME
- aws lambda update-function-configuration
--function-name $LAMBDA_NAME
--runtime java11
--handler com.lambda.apigateway.handler.LambdaApiGatewayHandler
--memory-size 512
--timeout 120
--environment "Variables={MAIN_CLASS=com.lambda.apigateway.LambdaApiGatewayApplication, TZ=Asia/Seoul}"
# JOB이 수행될 branch 설정 (설정된 branch에 push가 발생될 시 JOB 수행)
only:
- master
테스트
모든 설정이 끝났다면 Repository에 코드를 push 해줍니다.
그러면 CI/CD Pipelines에 다음과 같이 파이프라인 동작하는 것을 확인할 수 있습니다.
파이프라인 동작이 모두 완료되었다면 올바르게 배포가 되었는지 확인해 주시면 됩니다.
S3, Lambda 코드 소스, 기능 동작 등 테스트를 해보면 정상적으로 모두 적용된 것을 확인해 볼 수 있습니다.
이상으로 AWS Lambda와 API Gateway로 Serverless 구성하기 마지막인 GitLab으로 Lambda 자동배포하는 방법에 대해 간단하게 알아보는 시간이었습니다.
읽어주셔서 감사합니다.
댓글