위와 같은 파이프라인을 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_ID 및 AWS_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
위 내용과 같이 Dockerfile 과 index.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 항목 클릭
Status 가 Passed 인것을 확인할 수 있음.
만약, pending 이거나 failed 라면 오류 메시지 확인.
파이프라인 속 Build stage 의 publish job이 완료된 것을 확인
AWS ECR_test 를 보면 이미지가 푸시되어있는 것을 확인할 수 있음.
'AWS > CICD' 카테고리의 다른 글
[Gitlab] dind 란?, 트러블 슈팅, error during connect: Post http://dind:2375/v1.40/auth: dial tcp: lookup dind on 172.31.0.2:53: no such host (2) | 2021.10.30 |
---|---|
Gitlab runner 란?, AWS EC2 인스턴스 Gitlab Runner 등록하기 (0) | 2021.10.12 |
[AWS] CI/CD를 위한 Cloud9, CodeCommit, CodeBuild, CodeDeploy, CodePipeline 의 개념 (2) | 2021.08.04 |
[AWS] OpsWorks 의 개념 (0) | 2021.08.02 |
[AWS] AWS CloudFormation 의 개념 (0) | 2021.08.02 |