
이번 포스팅에서는 Docker Hub가 아닌 AWS의 ECR에 이미지를 push 하기 까지를 GitHub Actions로 자동화를 해보려한다
먼저 테스트를 하기위한 간단한 express를 만들고 시작해보겠다
Express 어플리케이션 생성
간단한 Hellow World 어플리케이션이며 아래의 명령어로 초기화해주고 express를 설치해주자
$ npm init
$ npm install express
const express = require('express');
const app = express();
const port = 8080;
app.get('/', (req, res) => {
res.send('Hellow World');
});
app.listen(port, () => {
console.log(`listening ar:${port} `);
});
먼저 로컬에서 정상적으로 이미지가 빌드가되고 컨테이너가 실행이되는지 확인 하기위해 Dockerfile을 만들어주자 Dockerfile을 생성하고 빌드하는 방법은 이전포스팅을 참고해서 빌드를 참고하면되겠다
빌드를 하고 컨테이너를 띄워서 localhost:8080으로 확인해보면 Hello World가 문제없이 return된걸 확인할 수있다.
이번에는 ECR을 사용하기위해 리포지토리를 만들어보자
ECR 프라이빗 리포지토리 생성
ECR 서비스로 이동해서 주황색의 리포지토리 생성을 클릭해주자

생성을 누르게된다면 리포지토리를 프라이빗으로 할건지 퍼블릭으로 할건지 선택할수있는데 필자는 사용자가 정해져있는 사람만 리포지토리를 사용 할 수있게 프라이빗으로 설정하겠다 설정을 했으면 리포지토리 이름을 정해줘야하는데 마음대로 정해주면 되겠으며 필자는 my-test로 정하겠다 정했으면 아래로 내려서 리포지토리 생성을 클릭해주자

생성했다면 아래의 그림처럼 리포지토리가 정상적으로 생성이되었다 GitHub Actions로 진행하기전에 먼저 로컬에서 aws CLI로 push를 해보겠다

ECR을 사용 하기위해서는 사용자를 생성해줘야한다 IAM에 사용자에게 권한을 부여해야하는데
AmazonEC2ContainerRegistryFullAccess 권한을 추가해주고 아래의 명령어처럼 aws configure를 입력하고 access key와 secret key를 입력해주자
$ aws configure
AWS Access Key ID [****************ABCD]: ***************ABCD
AWS Secret Access Key [****************ABCD]: **************************ABCD
Default region name [ap-northeast-2]: ap-nortehast-2
Default output format [json]: json
입력했다면 다시 위에서 생성한 리포지토리로 이동해서 리포지토리를 선택하고 오른쪽 상단에 푸시명령 보기를 클릭한다면 아래의 그림처럼 푸시명령에 대해 자세하게 설명이되어있다 먼저 토큰을 검증 하고 아래의 명렁어를 진행 해보겠다

위에서 aws configure를 작성했다면 아래의 그림처럼 로그인이 성공한 걸 확인 할 수있다

my-test 라는 테그로 이미지를 빌드하는 이유는 리포지토리를 생성 했을 때 my-test로 만들었기 때문이다
확인해보면 이미지가 잘생성된걸 확인할수있다
$ docker build -t <설정한 리포지토리이름>

빌드가 완료되었다면 이미지를 다시 태그를 지정해서 ECR 리포지토리에 푸시해보자 푸시를 했다면 ECR에서 확인해보겠다
$ docker tag my-test:latest 222026462311.dkr.ecr.ap-northeast-2.amazonaws.com/my-test:latest
$ docker push 222026462311.dkr.ecr.ap-northeast-2.amazonaws.com/my-test:latest

확인해보면 이미지가 push된걸 확인 할 수있다 이번에는 GitHub Actions로 자동화를 하기위해서 push한 이미지를 삭제 해보도록 하자

workflows 작성
아래의 .yaml 파일을 확인해보면 secret.으로 된 secrets.AWS_ACCESS_KEY_ID 와secrets.AWS_SECRET_ACCESS_KEY
를 확인할 수있는데 외부로 노출되면 안되는 키와 데이터메이스 환경변수 등 중요한 정보를 GitHub에서 따로 관리 하기위해 secret라는 곳에 환경변수를 등록할 수있다 여기서는 자세하게 다루지않고 secret를 적용 하는방법은 이 포스팅을 참고하면되겠다
name: Deploy to Amazon ECR
on:
push:
branches:
- main
pull_request:
branches:
- main
env:
AWS_REGION: ap-northeast-2 # aws 리전
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
environment: production
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Configure AWS credentials # 위에서 생성한 IAM 사용자 설정
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: ${{ env.AWS_REGION }}
- name: Login to Amazon ECR #ECR 로그인
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1
- name: Build, tag, and push image to Amazon ECR
id: build-image # ECR에 푸시하기위해 빌드하고 푸시하기위한 스탭
env:
ECR_REPOSITORY: my-test
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
IMAGE_TAG: latest
run: |
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
echo "::set-output name=image::$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG"
이제 위에서 생성한 간단한 express앱을 간단하게 수정해보고 푸시를 해보자 푸시를 한다면 GitHub Actions를 확인 해보면 정상적으로 ECR에 푸시된걸 확인 할 수있다 푸시가되었으니 리포지토리를 확인해보자

아래의 그림과같이 이미지가 푸시된걸 다시한번 확인 할 수있다

'DevOps > AWS' 카테고리의 다른 글
[AWS] SAM으로 API Gateway와 lambda, dynamoDB 배포 (0) | 2023.02.03 |
---|---|
[AWS] GitHub Actions로 AWS ECS 배포 자동화 하기 (0) | 2023.01.20 |
[AWS] AWS ECS 개념 (0) | 2023.01.10 |
[AWS] Route53에 외부 도메인(가비아) 연결, SSL 인증서 (0) | 2023.01.09 |
[AWS] VPC구성하기(퍼블릭 서브넷, 프라이빗 서브넷) (0) | 2023.01.05 |