AWS/CICD

Gitlab 사용해서 Amazon ECR 로 도커 컨테이너 push 하기

Jaden Park 2021. 10. 8. 17:20

위와 같은 파이프라인을 AWS 위에 구현하기 위한 포스팅 입니다.

해당 이미지 참고자료

해당 포스팅 참고자료

1. Amazon ECR 저장소 생성

AWS ECR 서비스로 이동한 뒤 리포지토리 생성 "시작하기"

 

 

리포지토리 이름: ecr_test

설정 후 생성

 

 

나중에 사용할 수 있도록 저장소 ecr_test URI 복사

 


2. IAM 생성 및 Amazon 컨테이너 레지스트리 액세스 권한 부여

IAM 대시보드로 이동 후 사용자 추가

 

 

사용자 이름: ecr-testuser

AWS 자격 증명 유형 선택: 액세스 키 - 프로그래밍 방식 액세스

 

 

 

기존 정책 직접 연결 선택 후

ECR에서 컨테이너를 읽고 쓰고 수정하기 위한 기본 정책 AmazonEC2ContainerRegistryPowerUser 부여

 

 

사용자 계정 생성하면 액세스 키 ID비밀 액세스 키 부여

해당 페이지를 넘어가면 다시는 다운로드 받을 수 없으니 .csv 다운로드를 통해 안전한 장소에 복사

 

AWS 설정이 완료되었으므로 이제 Gitlab 프로젝트를 생성한 뒤 컨테이너를 빌드하고 ECR에 푸시할 수 있는 변수와 파일을 생성

 


3. Gitlab 프로젝트 생성

로그인 후 New project 클릭

 

 

 

Create blank project 선택

 

 

Project name: ecr-test

선택 후 Create project

 


4. AWS IAM Variables 등록

Docker가 CI 코드의 IAM 자격 증명을 전달하지 않고 AWS에 로그인할 수 있도록 2개의 프로젝트 변수를 생성

이전에 얻은 값으로 AWS_ACCESS_KEY_IDAWS_SECREY_ACCESS_KEY 생성

프로젝트에서 AWS 액세스 요청 시 Gitlab에서 사용할 정규화된 변수

.gitlab-ci.yml 에서 variables 에서 지정가능하지만 편의를 위해 UI 를 사용해 지정.

 

Settings 탭에서 CI/CD 선택

 

 

Variables 에서 Expand하여 Add variable 클릭

 

IAM 계정 생성 시 다운받았던 .csv 를 확인하여 AWS_ACCESS_KEY_ID 및 AWS_SECREY_ACCESS_KEY 각각 입력

Protect Variable: protected branch에서만 활용할 수 있도록 하는 기능.

Mask variable: 로그를 찍었을 때 값이 보이지 않게 마스크를 씌우는 기능. AWS 계정이 노출되면 안되기 때문에 Flags=True

 

 

 

 

 

위와 같이 AWS_ACCESS_KEY_ID 및 AWS_SECREY_ACCESS_KEY 모두 등록 완료.

 


5. Dockerfile 및 index.html 작성

빌드에 필요한 Dockerfile 과 테스트 웹 애플리케이션 생성

Web IDE 클릭.

 

# Dockerfile

FROM nginx:alpine
COPY ./website /usr/share/nginx/html
# index.html

Hello Gitlab world

위 내용과 같이 Dockerfileindex.html 생성 후 Commit -> main으로 바로 Push.

 


6. .gitlab-ci.yml 작성

저장소에 Source Push 가 일어나면

.gitlab-ci.yml 에서 trigger 가 발생.

.gitlab-ci.yml 내용에 맞게 Gitlab Runner 작업을 지시하게 됌.

Gitlab Runner 는 3가지 종류가 있음. 제한적으로 무료 제공하는 Shared Runner 를 사용.

Gitlab Runner 에 대한 이야기는 추후 포스팅 참고바람.

 

 

# Simple example of CI to build a Docker container and push it to Amazon ECR
variables:
  DOCKER_REGISTRY: 000000000000.dkr.ecr.ap-northeast-2.amazonaws.com
  AWS_DEFAULT_REGION: ap-northeast-2
  APP_NAME: ecr_test
  DOCKER_HOST: tcp://docker:2375
  DOCKER_DRIVER: overlay2
  DOCKER_TLS_CERTDIR: ""

publish:
  stage: build
  image: 
    name: docker:latest
  services:
    - docker:19-dind
  before_script:
    - apk add --no-cache curl jq python3 py3-pip
    - pip install awscli
    - aws ecr get-login-password | docker login --username AWS --password-stdin $DOCKER_REGISTRY
    - aws --version
    - docker info
    - docker --version
  script:
    - docker build -t $DOCKER_REGISTRY/$APP_NAME:$CI_PIPELINE_IID .
    - docker push $DOCKER_REGISTRY/$APP_NAME:$CI_PIPELINE_IID

web IDE 를 사용하여 .gitlab-ci.yml 작성

아래 항목은 본인에 맞게 변경하여 작성

DOCKER REGISTRY: 본인이 생성한 ECR 레지스트리 URI 복사한 값 사용. /ecr_test 는 제거.

AWS_DEFAULT_REGION: 레지스트리 생성한 리전값. (서울리전: ap-northeast-2)

APP_NAME: 레지스트리 이름

 

DOCKER_HOST: docker in docker 서비스를 사용할 수 있도록

docker:19-dind: before_script 부분에서 AWS에 로그인하기 위해 Docker in Docker 사용한다는 의미

 

 

before_script

  • apk add --no-cache curl jq python3 py3-pip pip install awscli: awscli 및 awscli 자체에 대한 사전 요구 사항을 설치
  • aws ecr get-login-password | docker login --username AWS --password-stdin $DOCKER_REGISTRY: ECR 레지스트리에 대한 인증된 세션을 생성
  • aws --version, docker info docker --version: 일부 정보 print

 

script

  • 파이프라인 ID를 태그로 사용하여 Docker 컨테이너를 빌드하고 ECR에 푸시

 

 

위와 같이 레포지토리가 구성되어 있으면 됌.

 

 

7. CI/CD 작업 확인

CI/CD 탭에서 Pipelines 항목 클릭

 

 

StatusPassed 인것을 확인할 수 있음.

만약, pending 이거나 failed 라면 오류 메시지 확인.

 

 

파이프라인 속 Build stage 의 publish job이 완료된 것을 확인

 

 

AWS ECR_test 를 보면 이미지가 푸시되어있는 것을 확인할 수 있음.