aws 서비스 정리 | ECR

Jihun Kim·2021년 12월 29일
0

aws

목록 보기
7/16
post-thumbnail
  • ECR은 Elastic Container Registry의 약자이다.
  • ECR은 aws 관리형 컨테이너 이미지 레지스트리 서비스이다. ECR은 리소스 기반 권한을 가진 프라이빗 레포지토리를 지원하며, 지정된 사용자 또는 EC2 인스턴스는 컨테이너 레포지토리 및 이미지에 엑세스 할 수 있다.

원하는 CLI를 이용해서 도커 이미지를 푸시, 풀, 관리할 수 있다(도커 이미지 외에도 Open Container Initiative(OCI) 이미지 및 OCI 호환 아티팩트도 가능)

(레지스트리: 윈도우계열 시스템에서 사용하는 시스템 구성 정보를 저장한 데이터베이스)


ECR의 구성요소

레지스트리

  • ECR 프라이빗 레지스트리는 각 aws 계정마다 제공된다. 레지스트리에 하나 이상의 레포지토리를 생성하고, 이 레포지토리에 이미지를 저장할 수 있다.

사용자 권한 토큰

  • 클라이언트는 ECR 레지스트리에 aws 사용자로서 인증을 해야 이미지 푸시가 가능하다. → 이 부분은 docker run 명령어 실행 후 인증 명령을 통해 해결할 수 있다.

레포지토리

  • ECR 레포지토리에는 docker 이미지, OCI 이미지 및 OCI 호환 아티팩트가 포함되어 있다.

레포지토리 정책

  • 정책을 통해 레포지토리 및 레포지토리 내의 이미지에 대한 액세스 제어가 가능하다.

이미지

  • 레포지토리에 컨테이너 이미지를 푸시하고 가져올 수 있다.


ECR의 기능

  • 수명 주기 정책: 이미지의 수명 주기를 관리한다.

    → 사용하지 않는 이미지를 정리하는 규칙을 정의한다.

  • 이미지 스캔: 컨테이너 이미지의 소프트웨어 취약성을 식별하는 데 도움을 준다.

    → 각 레포지토리는 푸시 시 스캔하도록 구성되어 있어서 푸시된 새 이미지가 스캔된다.

    → 이미지 스캔 결과도 검색할 수 있다.

  • 교차 리전 및 교차 계정 복제를 통해서 이미지를 필요한 곳에 쉽게 배치할 수 있다.



도커 이지미 푸시하기

  1. 이미지를 푸시하려는 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
  2. 푸시하려는 레지스트리에 이미지 레포지토리가 없으면 명령어 실행시 하나 생성된다.

  3. 이미지 태그 생성(선택 사항)

    → 이미지 태그를 생략하면 태그가 latest인 것으로 간주된다.

    → 아래의 예시에서는 <image_name>에 태그를 붙이라는 뜻이 되되며 my-repository:tagname 같은 형식으로 붙게 된다.

    docker tag <image_name> aws_account_id.dkr.ecr.region.amazonaws.com/my-repository:<tag_name>
  4. 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


ECR의 도커 이미지를 lambda로 update하기

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


참고

https://ianwhitestone.work/serverless-ml-deployments/

https://ianwhitestone.work/zappa-serverless-docker/

profile
쿄쿄

0개의 댓글