앞서 만들었던,
1. AWS Lambda에 넣을 Autogluon 이미지 모델 배포하기
2. boto3를 활용하여 AWS ECR에서 Lambda로 배포하기
선행 작업으로 AutoGluon으로 만들었던 코드를 CodeCommit에 넣어주시면 되겠습니다.
이 두가지 글을 활용해서 Autogluon과 ECR을 Lambda로 배포하는 것을 진행을 하였다면, 이제 이 프로세스를 이용하여 CodeBuild에 배포하는 프로세스를 만들어 보도록 하겠습니다.
간단하게 프로세스는 다음과 같죠.
프로세스는 다음과 같습니다.
빌드 생성
프로젝트 이름
단일 빌드
Source(CodeCommit에서 만든 소스) - 브런치, 리포지토리 설정
이미지 정의 (aws/codebuild/amazonlinux2-x86_64-standard:4.0
)
Buildspec
version: 0.2
phases:
pre_build:
commands:
- echo Logging in to Amazon ECR...
- aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin {}.dkr.ecr.ap-northeast-2.amazonaws.com
build:
commands:
- echo Build started on `date`
- echo Building the Docker image...
- docker build -t {} .
- docker tag {}:latest {}.dkr.ecr.ap-northeast-2.amazonaws.com/{}:latest
post_build:
commands:
- echo Build completed on `date`
- echo Pushing the Docker image...
- docker push {}.dkr.ecr.ap-northeast-2.amazonaws.com/{}:latest
- IMAGES_TO_DELETE=$( aws ecr list-images --region ap-northeast-2 --repository-name {} --filter "tagStatus=UNTAGGED" --query 'imageIds[*]' --output json )
- aws ecr batch-delete-image --region ap-northeast-2 --repository-name {} --image-ids "$IMAGES_TO_DELETE" || true
이미지를 만들고, 생성하고, ecr 푸시, untagged 정리 이렇게 구성되어있습니다.
그이후 빌드를 하게되면 완성입니다.
그다음 IAM으로 권한을 설정 해주면 되겠습니다.
각각 설명을 해야하지만,
AmazonEC2ContainerRegistryFullAccess / AmazonEC2ContainerRegistryPowerUser은 ECR로 배포하기 위한 것
AWSCodeDeployFullAccess는 나중에 CodePipeline에 배포하기 위한 용도라고 보시면 되겠습니다.
이상으로 모든 설정이 끝났으니 설정하시면 되고,
$IMAGES_TO_DELETE 같이 이런 변수를 외부로 설정하고 싶다면,
환경 편집에서 환경 변수를 넣어주시면 되겠습니다.
기존 1에서 만들었던 부분은 동일하구요. Buildspec만 수정합니다. (1 과정을 한 이후기 때문에 소스도 등록하지 않습니다.)
version: 0.2
phases:
pre_build:
commands:
# AWS CLI 구성
- aws configure set region ap-northeast-2
- $(aws ecr get-login --no-include-email)
build:
commands:
- aws lambda update-function-code --function-name {} --image-uri {}.dkr.ecr.ap-northeast-2.amazonaws.com/{}:latest --publish
- >
while true; do STATUS=$(aws lambda get-function --function-name {} --query Configuration.LastUpdateStatus); if [[ "$STATUS" == "\"Successful\"" ]]; then echo "Lambda 함수 업데이트가 완료되었습니다."; break; elif [[ "$STATUS" == "\"Failed\"" ]]; then echo "Lambda 함수 업데이트가 실패하였습니다."; break; else echo "Lambda 함수 업데이트 중입니다. 현재 상태: $STATUS"; sleep 5; fi; done
설명을 하자면 Lambda에 진행했던 image를 새 image로 업데이트를 한 후 상태 체크를 하는 스크립트를 삽입하여 완료가 되면 종료하도록 되어있다고 생각하시면 되겠습니다.
이상으로 아키텍처에 나와있는 부분을 완성하였습니다.
감사합니다.