- ECR은 Elastic Container Registry의 약자이다.
- ECR은 aws 관리형 컨테이너 이미지 레지스트리 서비스이다. ECR은 리소스 기반 권한을 가진 프라이빗 레포지토리를 지원하며, 지정된 사용자 또는 EC2 인스턴스는 컨테이너 레포지토리 및 이미지에 엑세스 할 수 있다.
원하는 CLI를 이용해서 도커 이미지를 푸시, 풀, 관리할 수 있다(도커 이미지 외에도 Open Container Initiative(OCI) 이미지 및 OCI 호환 아티팩트도 가능)
(레지스트리: 윈도우계열 시스템에서 사용하는 시스템 구성 정보를 저장한 데이터베이스)
수명 주기 정책: 이미지의 수명 주기를 관리한다.
→ 사용하지 않는 이미지를 정리하는 규칙을 정의한다.
이미지 스캔: 컨테이너 이미지의 소프트웨어 취약성을 식별하는 데 도움을 준다.
→ 각 레포지토리는 푸시 시 스캔하도록 구성되어 있어서 푸시된 새 이미지가 스캔된다.
→ 이미지 스캔 결과도 검색할 수 있다.
교차 리전 및 교차 계정 복제를 통해서 이미지를 필요한 곳에 쉽게 배치할 수 있다.
이미지를 푸시하려는 amazon ECR 레지스트리에 대해 docker 클라이언트 인증
→ 인증 토큰은 사용되는 레지스트리마다 필요하고, 12시간 동안 유효하다.
→ aws ecr get-login-password 명령을 실행하면 된다.
→ docker login 명령에 전달시 사용자 이름으로 ‘AWS’ 값을 사용하고, 인증하려는 ECR 레지스트리 URI를 지정한다.
⇒ 만약 여러 레지스트리에 대해 인증하려면 각 레지스트리에 대해 명령을 반복해야 한다.
aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <aws_account_id>.dkr.ecr.region.amazonaws.com
푸시하려는 레지스트리에 이미지 레포지토리가 없으면 명령어 실행시 하나 생성된다.
이미지 태그 생성(선택 사항)
→ 이미지 태그를 생략하면 태그가 latest인 것으로 간주된다.
→ 아래의 예시에서는 <image_name>에 태그를 붙이라는 뜻이 되되며 my-repository:tagname 같은 형식으로 붙게 된다.
docker tag <image_name> aws_account_id.dkr.ecr.region.amazonaws.com/my-repository:<tag_name>
docker push 명령을 통해 이미지 푸시
docker push <aws_account_id>.dkr.ecr.region.amazonaws.com/my-repository:<tag_name>
위의 명령어들을 한꺼번에 사용하면 아래와 같이 쓸 수 있다.
아래의 내용들을 ".sh" 스크립트로 관리하면 명령어들을 반복해서 사용하지 않아도 되어 편리할 것이다.
# docker image build and tagging
TAG=`date +"%Y-%m-%d-%H-%M-%S"`
cp ./<file_name>.dockerignore ./.dockerignore # ignore 정의
docker build -t <img_name>:$TAG . -f <file_name>.Dockerfile
docker tag <img_name>:$TAG <aws_account_id>.dkr.ecr.ap-northeast-2.amazonaws.com/<repository_name>:$TAG
# ecr push
docker run --rm -it -v ~/.aws:/root/.aws -v $(pwd):/aws amazon/aws-cli ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin <aws_account_id>.dkr.ecr.ap-northeast-2.amazonaws.com/<repository_name>
docker push <aws_account_id>.dkr.ecr.ap-northeast-2.amazonaws.com/<repository_name>:$TAG
aws에서 lambda에 container image를 지원하겠다고 선언하였고(2020), 그 덕분에 ECR에 업로드 된 image를 이용해 lambda 함수를 deploy 할 수 있게 되었다.
따라서, 기존에 S3에 업로드 된 zip file을 이용한 deploy를 하지 않아도 된다. 이 방법의 이점은 파일 사이즈 문제(컨테이너 이미지는 최대 10GB까지 가능함)를 해결할 수 있게 해준다는 것과, 여러 dependency 이슈에서 해방시켜 준다는 것이다.
lambda로 업로드 하기 위해 Dockerfile은 다음과 같이 작성할 수 있다.
FROM amazon/aws-lambda-python:3.8
ARG FUNCTION_DIR="/var/task/"
COPY ./ ${FUNCTION_DIR}
# Setup Python environment
# 이 부분은 본인이 사용하는 프레임워크 환경에 따라 다르게 구성하면 된다.
RUN pip install poetry
RUN POETRY_VIRTUALENVS_CREATE=false poetry install --no-root
# Grab the zappa handler.py and put it in the working directory
# handler.py는 본인이 커스텀 해서 만들어야 한다.
RUN ZAPPA_HANDLER_PATH=$( \
python -c "from zappa import handler; print (handler.__file__)" \
) \
&& echo $ZAPPA_HANDLER_PATH \
&& cp $ZAPPA_HANDLER_PATH ${FUNCTION_DIR}
CMD [ "handler.lambda_handler" ]
이미지를 빌드한다.
zappa save-python-settings-file lambda_docker_flask
docker build -t lambda-docker-flask:latest .
첫 번째 줄의 의미
zappa handler는 기존의 zip 기반 배포에서 자동으로 생성되는 python 설정 파일에 의존한다. “zappa save-python-settings-file” 명령은 이와 똑같은 파일을 생성해 작업 디렉토리의 zappa_settings.py에 저장하는 역할을 한다.
두 번째 줄의 의미
그런 다음, docker 빌드 명령을 실행하면 zappa_settings.py 파일이 나머지 앱들 코드와 함께 복사된다.
ecr 레포지토리를 직접 생성하지 않았다면 아래의 방법을 사용할 수 있다.
# create the ECR repository
❯ aws ecr create-repository --repository-name lambda-docker-flask --image-scanning-configuration scanOnPush=true
{
"repository": {
"repositoryArn": "arn:aws:ecr:us-east-1:XXXXX:repository/lambda-docker-flask",
"registryId": "XXXXX",
"repositoryName": "lambda-docker-flask",
"repositoryUri": "XXXXX.dkr.ecr.us-east-1.amazonaws.com/lambda-docker-flask",
"createdAt": 1609279281.0,
"imageTagMutability": "MUTABLE",
"imageScanningConfiguration": {
"scanOnPush": true
},
"encryptionConfiguration": {
"encryptionType": "AES256"
}
}
}
그러면 이제 docker 이미지를 ECR 레포지토리로 push할 수 있다.
# re-tag it
❯ docker tag lambda-docker-flask:latest XXXXX.dkr.ecr.us-east-1.amazonaws.com/lambda-docker-flask:latest
# get authenticated to push to ECR
❯ aws ecr get-login-password | docker login --username AWS --password-stdin XXXXX.dkr.ecr.us-east-1.amazonaws.com
Login Succeeded
# push it
❯ docker push XXXXX.dkr.ecr.us-east-1.amazonaws.com/lambda-docker-flask:latest
만약 나중에 코드를 수정하고 새롭게 배포하고 싶을 때는 ‘zappa update’ 명령을 이용해 다시 image를 푸쉬할 수 있으며 전체 명령은 아래의 방법을 이용하면 된다.
zappa save-python-settings-file lambda_docker_flask
docker build -t lambda-docker-flask:latest .
docker tag lambda-docker-flask:latest XXXXX.dkr.ecr.us-east-1.amazonaws.com/lambda-docker-flask:latest
docker push XXXXX.dkr.ecr.us-east-1.amazonaws.com/lambda-docker-flask:latest
zappa update lambda_docker_flask -d XXXXX.dkr.ecr.us-east-1.amazonaws.com/lambda-docker-flask:latest
참고