devops

Git Actions를 활용한 Lambda 배포 자동화

하리하링웹 2024. 4. 3. 18:32

GitHub Actions 사용하여 AWS Lambda 함수를 자동으로 배포하는 방법을 작성해보겠다. 프로세스를 통해 코드 변경 사항이 main 브랜치에 푸시될 때마다 자동으로 AWS Lambda 함수가 업데이트되도록 설정할 있다. 이는 개발 효율성을 크게 향상시키고, 배포 과정에서 발생할 있는 휴먼 오류를 줄이는 도움이 되며 각 코드에 대한 버전 관리, 무중단 배포도 쉽게 할 수 있다는 장점이 있다.

 

아래 링크를 참고하면 초기 설정등에 더 도움이 될것이다.

[참고링크]

초기 설정

[ECR, Lambda]

먼저 이미지를 올릴 ECR, Lambda 함수를 만들어준다. 위 링크를 참고하여 쉽게 만들 수 있으며 주의할점은 이번 글에서는 docker와 ecr을 사용하여 배포를 진행하는거기 때문에 Lambda 함수 생성 시 반드시 Container Image 방식으로 만들어줘야 한다.

정상적으로 만들었을때의 Pakcage Type

 

[IAM]

 IAM 유저를 따로 생성해준다 root 유저의 id,secret을 사용하는 방안도 있지만 이러한 방식은 보안적으로 권장하지 않는 방식이니 되도록 IAM 유저를 따로 생성하여 Role과 Policy를 따로 부여하여 사용해준다.

 

AWS IAM에 대한 설정 방법과 사용 방법은 하나의 주제라고 생각하기에 다른 글로 작성하도록 하겠다.

 

[Git Actions secrets]

Action을 사용할 repository에 secret을 추가해준다. settings > secrets and variables > actions에서 추가할 수 있다. variables와 secrets는 다른것이니 주의해야한다.

코드 작성

0. GitHub Actions Workflow 파일 추가

GitHub Actions를 사용하기 위해서는 먼저 .github/workflows 디렉토리를 생성하고 그 안에 YAML 파일을 추가해야 한다. 이 파일 안에 아래에 설명한 코드들을 작성할 예정이다. 

1. 코드 체크아웃

- name: Checkout code
  uses: actions/checkout@v2

이 단계는 GitHub Actions가 작업을 시작할 때 현재 GitHub 레포지토리의 소스 코드를 작업 디렉토리로 복사하는 과정이다. 이를 통해 Workflow 내에서 최신 코드에 액세스할 수 있으며, 이는 배포하는 코드가 항상 최신 상태임을 보장해준다.

2. AWS 자격증명 구성

- name: Configure AWS credentials
  uses: aws-actions/configure-aws-credentials@v1
  with:
    role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
    aws-region: ${{ secrets.AWS_REGION }}

여기서는 AWS 리소스에 접근할 수 있도록 필요한 자격 증명을 설정한다. 이 단계는 AWS 서비스(예: ECR, Lambda)에 액세스하기 위한 필수 과정이다. AWS Role ARN과 리전 정보같은 노출되지 않으면 좋은 정보들은 GitHub Secrets에 추가해주어 관리한다.

3. Amazon ECR 로그인

- name: Login to Amazon ECR
  run: aws ecr get-login-password --region ${{ secrets.AWS_REGION }} | docker login --username AWS --password-stdin ${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.${{ secrets.AWS_REGION }}.amazonaws.com

이 단계는 Amazon Elastic Container Registry(ECR)에 로그인하여 Docker 이미지를 저장하고 추출할 수 있게 한다. ECR은 Docker 이미지를 관리하는 데 사용되는 AWS의 서비스로, 이를 통해 이미지를 안전하고 효율적으로 관리할 수 있다.

4. Docker 이미지 빌드 및 푸시

- name: Build Docker image
  run: docker build -t ${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.${{ secrets.AWS_REGION }}.amazonaws.com/${{ secrets.AWS_ECR_REPOSITORY_NAME }}:$GITHUB_SHA .
- name: Push Docker image to Amazon ECR
  run: docker push ${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.${{ secrets.AWS_REGION }}.amazonaws.com/${{ secrets.AWS_ECR_REPOSITORY_NAME }}:$GITHUB_SHA

먼저 Docker 이미지를 빌드하고, 빌드된 이미지를 ECR에 푸시한다. 이 과정을 통해 개발자는 코드의 변화를 Docker 이미지로 쉽게 변환하고, 이를 클라우드에 저장할 수 있다.

5. Lambda 함수 배포

- name: Deploy Lambda function
  run: aws lambda update-function-code --function-name ${{ secrets.LAMBDA_FUNCTION_NAME }} --image-uri ${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.${{ secrets.AWS_REGION }}.amazonaws.com/${{ secrets.AWS_ECR_REPOSITORY_NAME }}:$GITHUB_SHA

마지막으로, 빌드한 Docker 이미지를 사용하여 AWS Lambda 함수를 업데이트한다. 이 단계는 코드의 변경이 Lambda 서비스에 자동으로 반영되도록 하여, 수동으로 배포하는 과정 없이도 서비스를 지속적으로 업데이트할 수 있게 한다.

 

 전체 코드

name: Deploy ECR DOCKER Lambda Function

on:
  push:
    branches:
      - main

permissions:
  id-token: write
  contents: read

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v2

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          role-to-assume: ${{ secrets.AWS_ROLE_ARN }}
          aws-region: ${{ secrets.AWS_REGION }}

      - name: Login to Amazon ECR
        id: login-ecr
        run: aws ecr get-login-password --region ${{ secrets.AWS_REGION }} | docker login --username AWS --password-stdin ${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.${{ secrets.AWS_REGION }}.amazonaws.com

      - name: Build Docker image
        run: docker build -t ${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.${{ secrets.AWS_REGION }}.amazonaws.com/${{ secrets.AWS_ECR_REPOSITORY_NAME }}:$GITHUB_SHA .

      - name: Push Docker image to Amazon ECR
        run: docker push ${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.${{ secrets.AWS_REGION }}.amazonaws.com/${{ secrets.AWS_ECR_REPOSITORY_NAME }}:$GITHUB_SHA

      - name: Deploy Lambda function
        run: aws lambda update-function-code --function-name ${{ secrets.LAMBDA_FUNCTION_NAME }} --image-uri ${{ secrets.AWS_ACCOUNT_ID }}.dkr.ecr.${{ secrets.AWS_REGION }}.amazonaws.com/${{ secrets.AWS_ECR_REPOSITORY_NAME }}:$GITHUB_SHA

 

결론

이러한 자동화 방식은 개발 프로세스를 더욱 효율적이고 신뢰성 있게 만들어 준다. GitHub Actions는 단순한 코드 통합 및 배포를 넘어서, 복잡한 워크플로우를 관리하고 자동화하는 데 큰 장점을 가지고 있다.