Github Actions로 Lambda에 자동 배포하기 (AWS CLI)

이플 (Dongsik Ga)·2024년 6월 26일
0

기술

목록 보기
1/11
post-thumbnail

Github Blog를 쓰다가 Velog가 더 이뻐서 넘어왔다는 사실...(더 있긴 하지만)

최근 새로운 프로젝트(티끌)를 시작하면서 환경 세팅에서 좀 자동화 설정하고 진행하고 싶어서 Github Actions으로 자동 배포를 세팅하고 가고자 했습니다.

이전에는 항상 프로젝트를 한다 하면 우선 EC2부터 설치하고 진행하곤 했는데요. 프리티어 EC2는 비용의 걱정이 없지만, 프리티어가 아닌 세상에서는 EC2의 비용이 가혹하다는 것을 깨달아서 이번에는 Serverless로 구성하려고 합니다.

Serverless로 구성하게 되었을 때 가장 자주 사용되는게 바로 Lambda인데요. 이에 대한 설명은 나중에 다른 게시글로 포스팅하는걸로 하고, 바로 Github Actions으로 자동 배포하는 과정을 정리하겠습니다.


제가 Lambda에서 자동 배포를 하고자 하는 것은 다음과 같습니다.

  • lambda handler와 같은 Code 단의 자동 배포
  • lambda layer의 자동 배포 + 레이어 버전 적용

이렇게 두 종류를 진행할 계획입니다.
사실 레이어 버전을 자동으로 적용하는건...아직..

그리고 lambda를 자동으로 배포하는 방식이 2가지가 있습니다.
1. AWS CLI 명령어로 배포하기
2. Serverless Framework를 사용하여 배포하기

우선은 AWS CLI로 진행하겠습니다. (바로 다음 포스트가 Serverless Framework를 사용하는 방법일지도...)


Lambda Handler Code 자동 배포

이를 진행하기 위해서는 다음과 같은 단계를 거칩니다.
1. IAM에서 사용자 생성 후 액세스 키 발급
2. 원하는 사양으로 람다 생성 (여기서는 Python 3.11)
3. Github Repository 생성
4. Github Actions 설정
5. 자동 배포 테스트

사실 별거 없습니다.

1. IAM에서 사용자 생성 후 액세스 키 발급

이 과정은 현재 설명에서 TMI인거같긴 합니다만, 간략하게 설명하자면!

  • AWS에 로그인해서 IAM을 들어간다.
  • 사용자를 생성한다 + 권한을 설정한다.
  • 아래 화면에서 보안자격증명에 들어가서 액세스 키를 생성한다.
    보안자격증명
  • 발급된 액세스 키와 시크릿 키를 모두 다른 곳에 복사해둔다.

(시크릿 키는 재발급이 불가해서 만일 까먹으면 지우고 다시 만들어야하니 주의!)

위 과정을 거치면 쉽게 계정을 만들 수 있습니다!

추후에 IAM에서 사용자 생성하는 포스팅을 하면 링크 거는걸로... ㅎㅎ

2. 원하는 사양으로 람다 생성

람다 생성도 간단하게 해보자면, 우선 람다 생성을 누르게 되었을 때 다음과 같은 화면이 나옵니다.
람다생성화면
선택해야할 옵션은 크게 3가지가 있다고 봅니다.

새로 작성 / 컨테이너 이미지

배포 옵션 방식입니다.

  • 새로 작성: 코드를 직접 람다 콘솔에 올리거나, AWS CLI를 통해서 배포가 가능합니다.
  • 컨테이너 이미지: Docker 컨테이너 이미지를 생성해서 ECR에 푸시 후 Lambda로 배포가 가능합니다.

    ECR이란?
    Elastic Container Registry, Docker Hub와 비슷한 이미지 버전 관리 시스템

서버리스를 구성할 때 간단한 환경에서라면 Lambda함수로 코드를 작성해서 배포하는 것이 초기에는 빠르고 편합니다. 하지만 어느정도 복잡해진다면 좀 더 다양한 관리가 가능한 컨테이너를 통한 배포가 좋은 것 같습니다.

이번 프로젝트에서는 컨테이너를 사용하기보다는 직접 함수로 배포하는 방식으로 우선 진행을 할 것이기 때문에 새로 작성을 선택했습니다. 그리고 해당 포스트 또한 단순 람다 함수 배포에서의 자동 배포를 설명하고 있습니다.

이름 설정

람다 함수를 구분하는 명칭을 설정합니다. 이 이름을 통하여 람다를 구별하며 Github Actions에서도 사용하게 됩니다.

런타임 설정

람다 함수 생성 방식에서 사용할 수 있는 런타임의 목록을 선택합니다.
본 포스팅에서 사용할 Python에서 시작해서 NodeJS, Ruby, Java, Go 등 여러 런타임이 존재하며 이 중 사용할 수 있는 것으로 선택하면 됩니다. 만약 Python이 아닌 다른 런타임을 사용하게 된다면, Github Actions에서 배포 이전 설정에 차이가 있을 수 있습니다.

3. Github Repository 생성

이 부분도 TMI이고, Github Actions 설정하려는 분들은 거의 아는 내용일테니 패스! 입니다..!

이후에 깃 관련 포스팅을 하게 된다면 (안할것 같긴 하지만...) 하이퍼링크 연결하겠습니다.

4. Github Actions 설정

사실 순서대로 설명하는거같지만, 나머진 대부분 생략이네요 ^^
이제 핵심인 Github Actions 설정 부분입니다!

람다를 생성하게 되면 다음과 같이 파일이 존재하게 됩니다.
람다파일구성
람다 이름(test)를 폴더로 하며, 그 내부에 lambda_function.py가 존재하는 것을 볼 수 있습니다. 이 중 test 폴더 내부의 파일에 대해서 Github Repository와 연결하여 자동 배포가 되도록 할겁니다.

일단 Github Actions yml 부터 보자면...

name: Lambda Deploy
on:
  push:
    branches:
      - main

jobs:
  lambda-deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - uses: jitterbit/get-changed-files@v1
        id: files
        with:
          format: space-delimited

      - name: AWS 자격 증명 구성
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ secrets.AWS_REGION }}

      - name: Python 설정
        uses: actions/setup-python@v3
        with:
          python-version: '3.12'

      - name: Lambda 빌드 & 업데이트
        run: |
          pip3 install awscli
          zip -r package.zip .
          aws lambda update-function-code --function-name ${{ secrets.LAMBDA_NAME }} --zip-file fileb://package.zip --publish

전체 yml 파일은 위와 같습니다. 실행되는 동작 방식은 생각보다 훨씬 간단합니다. (env를 사용하면 더 깔끔해졌을 것 같긴 한데...)

각 부분별로 설명을 하면

name: Lambda Deploy
on:
  push:
    branches:
      - main
  • 처음에 기본 설정을 진행합니다.
  • Lambda Deploy라는 Github Actions이름을 지정합니다.
  • 해당 Github Actions의 실행 시기는 main branch에서 push가 발생했을 때 입니다.
  • main뿐만 아닌 여러 branch를 트리거로 설정하고 싶다면, 다음 줄에 해당하는 브랜치 이름을 넣어주면 됩니다.
jobs:
  lambda-deploy:
    runs-on: ubuntu-latest
    steps:
  • jobs는 태스크의 큰 실행 단위이며, 여러 step을 가진 job이 나열됩니다.
  • 현재 yml에는 lambda-deploy라는 job만 존재합니다.
  • lambda-deployubuntu-latest 환경에서 실행됩니다.
  • 아래 steps: 내부에서 각 step이 정의되고, 실행됩니다.
      - name: Checkout
        uses: actions/checkout@v3
  • Checkout 단계입니다.
  • Repository에 존재하는 모든 파일을 Github Actions 실행 환경에서 사용할 수 있도록 가져오는 역할을 합니다.
  • 일반적인 거의 모든 Github Actions에서 사용됩니다.
      - name: AWS 자격 증명 구성
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ secrets.AWS_REGION }}
  • AWS 자격 증명 구성 단계입니다.
  • 이 단계에서 위에 발급한 액세스 키를 사용합니다.
  • 액세스 키를 통해 람다에 접근하고, 코드를 반영할 수 있습니다.
  • ${{ secrets.AWS_ACCESS_KEY_ID }} 액세스 키입니다.
  • ${{ secrets.AWS_SECRET_ACCESS_KEY }} 시크릿 키입니다.
  • ${{ secrets.AWS_REGION }} 람다가 있는 리전입니다.
  • ${{ secrets.변수이름 }}의 형식은 Github에서 제공하는 기능으로, 공개되어서 안되는 데이터를 변수로 만들고 사용하는 방식입니다.
      - name: Python 설정
        uses: actions/setup-python@v3
        with:
          python-version: '3.11'
  • python 버전을 설정하는 단계입니다.
  • 현재에는 3.11버전으로 진행하고 있습니다.
      - name: Lambda 빌드 & 업데이트
        run: |
          pip3 install awscli
          zip -r package.zip .
          aws lambda update-function-code --function-name ${{ secrets.LAMBDA_NAME }} --zip-file fileb://package.zip --publish
  • 실제로 yml에 배포하는 단계입니다.
  • Lambda를 배포할 때 package.zip으로 압축하여 업로드를 합니다.
  • AWS CLI 명령어를 사용하기 때문에 해당 명령어를 어느정도 안다면 쉽게 이해가 가능합니다.
  • {{ secrets.LAMBDA_NAME }}로 어떤 람다 함수에 배포할지 구체화할 수 있습니다.

이렇게 하면 간단하게 람다를 배포하는 방법은 완료됩니다. 이를 좀 더 응용한다면 여러 람다 함수에 동시에 배포한다거나, 브랜치에 따라 업데이트할 람다를 고르거나 하는 등을 구현할 수도 있겠죠?

5. 자동 배포 테스트

실제로 push를 해보게 된다면 다음과 같은 응답을 볼 수 있습니다.

정상적으로 모두 마무리된 것을 확인할 수 있습니다.
그리고 실제로 람다에 들어가서 확인해봐도 문제없이 반영되었다는 것을 알 수 있을 것이니 패스하겠습니다.

마무리

이런 Github Actions을 위한 yml을 작성할 때에는 코드를 한줄씩 모두 분석해보는 편입니다. Github Actions의 기능이 워낙 많기도 하고, CI/CD 단에서 유연하고 강력하게 활용할 수 있기 때문이죠.
자료들도 구글에 넘쳐나는 것 같고, 그렇기 때문에 이런 기능이 있음에도 사용하지 않고 손수 직접 하는 방식은 시간적으로 비효율이 아닐까 싶습니다. (개인적인 생각입니다.)
이 글을 보는 여러분들도 코드를 단순히 복사 붙여넣기 하는것이 아닌, 이런 간단한 yml 파일이라도 분석해보고 어떤 방식이 더 나을지를 고민해보는게 어떨까요? (저는 정말 추천합니다.)

profile
어제보다 더 나은 오늘의 나를 위해 노력하는 개발자입니다.

0개의 댓글

관련 채용 정보