AWS ECS로 ECR이미지 배포 자동화 구축하기

박형석·2022년 4월 3일
10
post-thumbnail

📝배포 자동화 개략도

코드를 푸쉬 하기만 해도 자동으로 배포가 되는 아키텍쳐 다이어그램이다.

우리는 이러한 아키텍쳐를 만들어서 CI/CD를 잘 이해하는 것을 목표로 진행을 해보자.

오른쪽의 목차를 참고바람

📌깃헙 레포지토리 만들기

깃허브에 레포지토리를 만드는 것은 잘 하시리라고 믿고 깃헙 레포지토리를 만든 후 로컬에 깃클론 해서 생성된 폴더 안에서 다음과정을 진행 하자.

  • fastify를 이용하여 "root: true"를 띄우기 위해서 다음 명령어들을 실행
    npm install fastify-cli -g
    fastify generate .
    npm i
    npm run start

이 명령어들을 순차적으로 실행시키게 되면 다음과 같은 화면이 뜬다. 그리고 localhost:3000 을 브라우저에서 검색하면 "root: true" 가 뜨게 된다.

  • 도커파일 생성
    레포지포리 내의 최상위 디렉토리에 생성해준다.
#Dockerfile

FROM node:16

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 3000

CMD [ "npm", "run", "start" ]
  • package.json 수정

    scripts의 start 부분에 FASTIFY_ADRESS=0.0.0.0 을 그림과 같이 추가 해 준다.
    이것을 추가하는 이유는 fastify특성상 로컬에서만 연결 가능하게 되어 있는데 저 코드를 추가 해주면 모든 tcp로부터 실행이 가능하다.

📌깃헙 액션으로 AWS ECR에 이미지 빌드 자동화

yaml파일 만들기

우리는 서울 리전을 이용할 것이다.

  • 깃헙 레포지토리에 액션탭으로 가서 New workflow를 클릭후 set up a workflow yourself 를 클릭해서 수동으로 yml파일을 만들어준다.
name: Deploy to ECR

on:
 
  push:
    branches: [ main ]

jobs:

  build:

    name: Build Image
    runs-on: ubuntu-latest

    steps:

    - name: Check out code
      uses: actions/checkout@v2

    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: ap-northeast-2

    - name: Login to Amazon ECR
      id: login-ecr
      uses: aws-actions/amazon-ecr-login@v1
      
    - name: Build, tag, and push image to Amazon ECR
      run: |
        push command 1.
		push command 2.
        push command 3.
        

우선 jobs-build-step-Configure AWS credentials 의 aws-access-key-idaws-secret-access-key의 값을 환경변수로 설정 해준다.

이 키페어를 받기 위해서는 aws콘솔 로그인 - 오른쪽 위의 본인의 아이디 클릭 - 보안자격 증명 - 엑세스 키 에서 받을 수 있다.

키페어를 받은 후 레포지토리 Setting에 들어가서 Secrets -> actions 에서 만들어준다.

name: AWS_ACCESS_KEY_ID
Value: 키 값

ECR 레포지토리 만들기

레포지토리를 생성한다.(프라이빗으로 만들자)

오른쪽 위에 보이는 푸시명령보기를 선택한다. 다음에 나올 사진들은 예시를 위한 사진들이다.

2번부터 4번까지 차례대로 복사하여 아까 만들었던 yaml파일에 push command 부분을 수정한다.

        push command 1. <-2번
		push command 2. <- 3번
        push command 3. <- 4번
        

그러면

docker build -t abcdef .
docker tag abcdef:latest 568004044946.dkr.ecr.ap-northeast-2.amazonaws.com/abcdef:latest
docker push 568004044946.dkr.ecr.ap-northeast-2.amazonaws.com/abcdef:latest

와 같이 만들어 지게 되는데 위의 세가지 명령어가 차례대로 실행이 된다.

그러면 깃헙 액션이 실행되게 된다.

잘 업로드가 되었다. 이제 코드 푸쉬를 하게되면 자동으로 새로운 이미지가 만들어지게 된다.(latest 라는 태그는 고정이다)

ECR에 올려져 있는 이미지 ECS로 실행 하기

기억해두자
1. 작업정의
2. 로드밸런서
3. 서비스 생성

순서로 진행한다고 생각하면서 진행을 하면 헷갈리지 않을 것이다.

먼저 클러스터작업정의를 만들어준다.

다음

생성

작업정의

새 작업정의

Fargate

여기서 테스크 역할을 만들어야 선택을 할 수 있는데 따라하면 된다.
태스크 역할밑의 IAM콘솔 클릭(레퍼런스)


역할만들기 - 아무것도 건들지말고 맨밑에 다른AWS 서비스의 사용 사례 에서 Elastic container Service 선택 - Elastic container Service Task 선택


다음

AmazonECSTaskExecutionRolePolicy 검색 후 선택

역할 이름을 ecsTaskExecutionRole 로 설정하고 생성

돈 나가니까 젤 작은걸로 생성

컨테이너 추가

이름설정 -> ECR 이미지의 latest의 url을 복붙 -> 포트매핑: -> 추가

작업정의 생성

로드밸런서 생성


애플리케이션 로드밸런서 생성

로드밸런서 이름 생성

네트워크 매핑 4가지 다 체크

보안그룹 생성

선택


타겟그룹 생성


ip adress로 생성 -> 이름설정 -> 생성

-> 로드밸런서 생성

서비스 생성


생성


FARGATE선택 -> 서비스이름 설정 -> 서비스개수 과감하게 3개(수평확장을 위해)


나머지 기본값 -> 다음

'
VPC 선택 -> 서브넷 전부 선택 -> 보안그룹 아까 우리가 만들었던 보안그룹 선택


애플리케이션 로드밸런서 선택


아까 만들어 놓은거 선택


다음 -> 서비스 생성

그러면 프로비저닝이 시작된다. 그리고 Running 상태로 바뀌면 대상그룹이 초기화 되며 시작된다.

그 다음 확인해야 할 것은 로드밸런서의 타겟그룹이 Healthy상태가 되었는지 체크해야 한다.

건강한 상태


브라우저 검색시 잘 나옴. (우리는 3000번 포트를 매핑 해 놓았기 때문에 로드밸런서 주소 마지막에 :3000을 붙혀야 뜬다.

파이프라인 구축

브라우저에 검색이 잘 되면 파이프라인을 구축할 차례이다.


Codepipeline 에 가서 파이프라인을 생성 한다.

이름 설정

우리의 소스는 ECR에 있는 이미지 이다.

프로젝트생성을 클릭한다.

이름 입력

이건 아무거나 해도 상관없지만 사진처럼 해보자

여기서 빌드스펙을 빌드명령 삽입을 선택하고 편집기로 전환을 눌러준다.
여기 를 클릭하면 Amazon ECS 표준 배포 작업을 위한 imagedefinitions.json 파일이라는 부분에서

printf '[{"name":"container_name","imageUri":"image_URI"}]' >
imagedefinitions.json

이라는 명령어를 추가해야 한다. imagedefinitions.json을 배포를 위한 소스로 사용하기 위함이다.


40~42번째 줄을 다음과 같이 수정해 준다.

여기서 42번째 줄에 container_name는 작업정의에서 등록한 컨테이너 이름 이고

image_URI는 ECR의 latest URI이다.


그리고 52~54도 다음과 같이 수정해 준다.


미리 만들어둔 클러스터와 서비스들을 선택하여 다음

생성
이제 잘 되기를 기도하면 된다.

와우 굉장히 굉장하다.

이제 확인 할 차례
우리가 깃클론한 디렉토리에서 /route/root.js 를 다음과 같이 바꿔준다.

'use strict'

module.exports = async function (fastify, opts) {
  fastify.get('/', async function (request, reply) {
    reply
    .code(200)
    .send("congratulation!!")
  })
}

그리고 깃허브에 푸쉬한다. 나는 커밋메세지를 pipeline complete 라고 적겠다.

주황색으로 ECR에 빌드중

파이프라인도 잘 반응한다.


성공.

profile
Better Than Yesterday

3개의 댓글

comment-user-thumbnail
2022년 6월 24일

혹시 iamge-deploy 라고 작성하셨는데 일부러 그런신건가용 ?? 오타인건가요 ??
image-deploy

1개의 답글