Github Actions으로 Lambda Layer를 자동 배포하기 (AWS CLI)

이플 (Dongsik Ga)·2024년 7월 1일
0

기술

목록 보기
2/11
post-thumbnail

저번 포스팅에 이어 이번에도 Github Actions을 사용한 Lambda(이하 람다)로의 자동 배포인데요.
Lambda Function에 대해서 자동 배포하도록 설정을 했지만, 이는 람다 함수 내의 코드만 자동 배포가 될 뿐이지, Lambda Layer는 따로 python 다운로드 받아서... 압축을 하고... s3에 올리고... Layer에 올리는... 패키지를 추가할 때마다 이러한 귀찮은 과정을 반복해야 합니다. (심지어 에러도 많이 발생한다는 점..)

이전에 세팅 안하고 썼을 때에는 진짜 때려치고 싶었습니다.


Lambda Layer 자동 배포

다음과 같은 단계로 진행됩니다.
1. IAM에서 사용자 생성 후 액세스 키 발급
2. Github Repository 생성
3. Github Actions 설정
4. 자동 배포 테스트

이전 포스팅과 다르게 람다를 생성하지 않아도 Layer를 생성할 수 있습니다. Layer는 람다에 종속되어있는게 아닌, 독립적으로 존재하기 때문에 여러 람다에 같은 Layer를 추가해서 사용할 수도 있다는 것이죠!

이제 설명을 진행할건데, 1번 2번은 저번 포스팅과 중복이기 때문에 3번 4번만 진행하겠습니다.

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

링크에서 확인할 수 있습니다.
하지만 간략하게 설명해둔 것이라 자세한 설명은 따로 다른 사이트를 찾아보는것을 추천합니다!

2. Github Repository 생성

Github Actions을 쓸 정도라면 충분히 할 수 있을 것이라 생각하기 때문에 이 부분도 패스하겠습니다.

3. Github Actions 설정

핵심입니다!

해당 Github Actions은 레포지토리의 README.md가 있는 파일위치, 즉 최상위에 requirements.txt가 있다는 것을 가정하고 진행합니다.

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

name: Lambda Layer Deploy
on:
  push:
    paths:
      - "requirements.txt"
jobs:
  layer-deploy:
    runs-on: ubuntu-latest
    env:
      AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
      AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
      AWS_REGION: ${{ secrets.AWS_REGION }}

    steps:
    - uses: actions/checkout@v3

    - name: Python 설정
      uses: actions/setup-python@v4
      with:
        python-version: '3.11'

    - name: 패키지 설치
      run: |
        python -m venv venv
        source venv/bin/activate
        pip install -r requirements.txt -t python

    - name: Layer ZIP 파일 생성
      run: zip -r python_layer.zip python

    - name: Lambda Layer 배포
      run: |
        LAYER_NAME="infoyou-backend-layer"
        aws lambda publish-layer-version \
          --layer-name $LAYER_NAME \
          --zip-file fileb://python_layer.zip \
          --compatible-runtimes python3.11 \
          --region $AWS_REGION

    - name: CleanUp
      run: |
        rm -rf venv python python_layer.zip

이렇게 생겼습니다. 이전 포스팅과는 약간 다르게 생긴 모습입니다.

각 부분별로 설명을 하면

name: Lambda Layer Deploy
on:
  push:
    paths:
      - "requirements.txt"
  • 처음 기본 설정을 진행합니다.
  • Lambda Layer Deploy라는 Github Actions 이름을 지정합니다.
  • Github Actions의 trigger는 requirements.txt의 경로에 있는 파일이 push 되었을 때입니다.
  • 이렇게 설정하면 해당 파일에 변경사항이 생겼을 때에만 Github Actions를 진행하게 됩니다.
jobs:
  layer-deploy:
    runs-on: ubuntu-latest
    env:
      AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
      AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
      AWS_REGION: ${{ secrets.AWS_REGION }}
  • jobs에서 lambda deploy라는 job을 진행합니다.
  • 환경은 ubuntu-latest입니다.
  • 환경변수를 총 3개를 설정하고 갑니다
  • AWS_ACCESS_KEY_ID 액세스 키입니다.
  • AWS_SECRET_ACCESS_KEY 시크릿 키입니다.
  • AWS_REGION 레이어를 추가할 리전입니다.
  • env에서 실행 환경에서의 환경변수를 추가할 수 있습니다.
  • 위처럼 AWS KEY를 환경변수로 설정해두면, 별도의 설정 없이 aws 명령어에서 자동으로 사용하게 됩니다.
    -> 따라서 별도의 Credential 과정이 없습니다
    steps:
    - uses: actions/checkout@v3
  • Checkout 단계입니다.
  • Repository에 존재하는 모든 파일을 Github Actions 실행 환경에서 사용할 수 있도록 가져오는 역할을 합니다.
  • 일반적인 거의 모든 Github Actions에서 사용됩니다.
  • name 없이 uses만으로도 Checkout을 할 수 있습니다.
    - name: Python 설정
      uses: actions/setup-python@v4
      with:
        python-version: '3.11'
  • python 버전을 세팅합니다.
  • 현재 저는 3.11 버전으로 프로젝트를 진행하고 있습니다.
    - name: 패키지 설치
      run: |
        python -m venv venv
        source venv/bin/activate
        pip install -r requirements.txt -t python
  • requirements.txt에 적힌대로 python package를 설치합니다.
  • python package를 설치할 때 python 폴더에 설치합니다.
    - name: Layer ZIP 파일 생성
      run: zip -r python_layer.zip python
  • python 폴더에 설치된 패키지를 python_layer.zip으로 압축합니다.
    - name: Lambda Layer 배포
      run: |
        LAYER_NAME="infoyou-backend-layer"
        aws lambda publish-layer-version \
          --layer-name $LAYER_NAME \
          --zip-file fileb://python_layer.zip \
          --compatible-runtimes python3.11 \
          --region $AWS_REGION
  • 압축 파일을 layer로 배포합니다.
  • publish-layer-version을 통해 버전을 추가해가며 관리할 수 있습니다. (Layer를 배포할 때바다 버전 번호가 증가합니다)
  • compatible-runtimes로 실행 런타임을 선택할 수 있습니다. (본인 람다의 런타임을 선택하지 않으면 레이어를 추가할 수 없습니다.)
    - name: CleanUp
      run: |
        rm -rf venv python python_layer.zip
  • Github Actions에서 모든 단계를 끝낸 후에 권장되는 마무리 단계입니다.
  • 사용한 파일은 지우는 과정입니다.
  • 굳이? 싶으면 안해도 됩니다.

4. 자동 배포 테스트

실제로 push 해보게 되면 다음과 같이 진행됩니다.
Git Action 실행
Requirement.txt 파일이 업데이트될 때마다 실행되게 됩니다.

Lambda Layer 버전
위 사진처럼 실행될 때마다 새로운 버전으로 layer가 배포됩니다.


마무리

이번에는 이렇게 Lambda Layer를 자동 배포하는 코드를 작성하였고 진행해보았습니다. 이전 포스팅과 같이 하면 총 2개의 Github Actions를 하나의 프로젝트에서 현재 사용하고 있는건데요. 람다를 개발하다보면 코드를 짜고 항상 람다에서 체크를 해야한다는 아주아주 귀찮은 단점 때문에 좀 꺼려지게 됩니다만, 이렇게 코드 자동 배포, 패키지 자동 배포를 통해서 귀찮은 작업을 줄인다면 그나마 쾌적한 환경에서 개발을 할 수 있지 않을까 싶습니다.
(SAM을 사용하면 로컬에서 테스트를 할 수 있다고는 하는데, 현재 프로젝트에서는 그 권한이 없는지라... 할수가 없네요 ㅎㅎ)

이렇게 자동 배포를 세팅해두고 람다 개발을 하는데, push 한 번당 20~25초의 배포 시간이 소요되는 것 같습니다. 한번 배포하고 눈 운동 한번 해주면... 충분히 기다릴 수 있는 매우 짧은 시간인 것 같아서 현재 환경을 구축한거에 매우 만족하고 있습니다! 여러분도 한번 해보세요 ^^ (진짜임~)

근데 사실 짧은 에러 수정은 push 말고 람다 코드에서 직접 바꿔주는게 더 빠르긴 합니다...ㅎㅎ 대신 로컬이랑 코드를 똑같이 하기 위해 노력해야하지만요~

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

0개의 댓글

관련 채용 정보