저번 포스팅에 이어 이번에도 Github Actions
을 사용한 Lambda(이하 람다)로의 자동 배포인데요.
Lambda Function
에 대해서 자동 배포하도록 설정을 했지만, 이는 람다 함수 내의 코드만 자동 배포가 될 뿐이지, Lambda Layer
는 따로 python 다운로드 받아서... 압축을 하고... s3에 올리고... Layer에 올리는... 패키지를 추가할 때마다 이러한 귀찮은 과정을 반복해야 합니다. (심지어 에러도 많이 발생한다는 점..)
이전에 세팅 안하고 썼을 때에는 진짜
때려치고 싶었습니다.
다음과 같은 단계로 진행됩니다.
1. IAM에서 사용자 생성 후 액세스 키 발급
2. Github Repository 생성
3. Github Actions 설정
4. 자동 배포 테스트
이전 포스팅과 다르게 람다를 생성하지 않아도 Layer를 생성할 수 있습니다. Layer는 람다에 종속되어있는게 아닌, 독립적으로 존재하기 때문에 여러 람다에 같은 Layer를 추가해서 사용할 수도 있다는 것이죠!
이제 설명을 진행할건데, 1번 2번은 저번 포스팅과 중복이기 때문에 3번 4번만 진행하겠습니다.
링크에서 확인할 수 있습니다.
하지만 간략하게 설명해둔 것이라 자세한 설명은 따로 다른 사이트를 찾아보는것을 추천합니다!
Github Actions
을 쓸 정도라면 충분히 할 수 있을 것이라 생각하기 때문에 이 부분도 패스하겠습니다.
핵심입니다!
해당
Github Actions
은 레포지토리의README.md
가 있는 파일위치, 즉 최상위에requirements.txt
가 있다는 것을 가정하고 진행합니다.
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"
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
입니다.AWS_ACCESS_KEY_ID
액세스 키입니다.AWS_SECRET_ACCESS_KEY
시크릿 키입니다.AWS_REGION
레이어를 추가할 리전입니다.env
에서 실행 환경에서의 환경변수를 추가할 수 있습니다.Credential
과정이 없습니다 steps:
- uses: actions/checkout@v3
- 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
publish-layer-version
을 통해 버전을 추가해가며 관리할 수 있습니다. (Layer를 배포할 때바다 버전 번호가 증가합니다)compatible-runtimes
로 실행 런타임을 선택할 수 있습니다. (본인 람다의 런타임을 선택하지 않으면 레이어를 추가할 수 없습니다.) - name: CleanUp
run: |
rm -rf venv python python_layer.zip
Github Actions
에서 모든 단계를 끝낸 후에 권장되는 마무리 단계입니다.실제로 push 해보게 되면 다음과 같이 진행됩니다.
Requirement.txt 파일이 업데이트될 때마다 실행되게 됩니다.
위 사진처럼 실행될 때마다 새로운 버전으로 layer가 배포됩니다.
이번에는 이렇게 Lambda Layer를 자동 배포하는 코드를 작성하였고 진행해보았습니다. 이전 포스팅과 같이 하면 총 2개의 Github Actions를 하나의 프로젝트에서 현재 사용하고 있는건데요. 람다를 개발하다보면 코드를 짜고 항상 람다에서 체크를 해야한다는 아주아주 귀찮은 단점 때문에 좀 꺼려지게 됩니다만, 이렇게 코드 자동 배포, 패키지 자동 배포를 통해서 귀찮은 작업을 줄인다면 그나마 쾌적한 환경에서 개발을 할 수 있지 않을까 싶습니다.
(SAM을 사용하면 로컬에서 테스트를 할 수 있다고는 하는데, 현재 프로젝트에서는 그 권한이 없는지라... 할수가 없네요 ㅎㅎ)
이렇게 자동 배포를 세팅해두고 람다 개발을 하는데, push 한 번당 20~25초의 배포 시간이 소요되는 것 같습니다. 한번 배포하고 눈 운동 한번 해주면... 충분히 기다릴 수 있는 매우 짧은 시간인 것 같아서 현재 환경을 구축한거에 매우 만족하고 있습니다! 여러분도 한번 해보세요 ^^ (진짜임~)
근데 사실 짧은 에러 수정은 push 말고 람다 코드에서 직접 바꿔주는게 더 빠르긴 합니다...ㅎㅎ 대신 로컬이랑 코드를 똑같이 하기 위해 노력해야하지만요~