티스토리 뷰

 

이번에 해볼 내용은 Github Action을 사용하여 ECR에 컨테이너(애플리케이션)를 올리고, 이를 직접 EC2 인스턴스 내에서 Docker를 통해 받아와 구동시켜 볼 예정이다.

 

목차는 아래와 같다.

 


1. 인스턴스 생성

2. 프로젝트 생성

3. Github Action, AWS ECR 관련 script 작성

4. 인스턴스 접속

5. 인스턴스 내 docker 설치

6. 이미지 받기 

7. 프론트 백엔드 라우팅 (revcerse proxying)

8. 컨테이너 실행


1. 인스턴스 생성

인스턴스를 생성한다. pem 키, 보안 그룹등은 편한대로 설정하여 생성하면 된다.

 

 

 


 

2. 프로젝트 생성

배포하고자 하는 프로젝트를 생성한다. 필자는 이전 블로그에서 사용했던 프로젝트를 사용하였다.

 

 


 

3. Github Action, AWS ECR 관련 script 작성

deploy.yml에선 AWS 자격 증명 -> ECR 로그인 -> Docker 이미지 빌드 및 푸시  과정을 거친다. 

deploy.yml 작성 이전에 Dockerfile을 작성한다.

# 1. Build Stage
FROM node:22 AS build

WORKDIR /usr/src/app

COPY package*.json ./
RUN npm install --production

COPY . .

# 2. Production Stage
FROM node:22-slim AS production

WORKDIR /usr/src/app

COPY --from=build /usr/src/app /usr/src/app

ENV PORT=3000

EXPOSE 3000

# 애플리케이션 실행
CMD ["node", "app.js"]

 

 

.dockerignore 도 작성하자. 

node_modules
.git
Dockerfile
.dockerignore

 

 

deploy.yml은 ECR에 이미지를 푸시하는 과정까지 작성해준다. 아래와 같다.

name: Deploy to Amazon Web Service Elastic Beanstalk

on:
  push:
    branches:
      - feature

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
    # 1. 코드 체크아웃
    - name: Checkout code
      uses: actions/checkout@v3

    # 2. AWS 자격 증명 설정
    - 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: us-east-1

    # 3. Amazon ECR Public에 로그인
    - name: Login to Amazon ECR Public
      run: |
        aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/n1b7r8u0

    # 4. Docker 이미지 빌드 및 푸시
    - name: Build, tag, and push image to Amazon ECR Public
      env:
        ECR_REGISTRY: public.ecr.aws/n1b7r8u0
        ECR_REPOSITORY: ${{ secrets.ECR_REPOSITORY_NAME }}
        IMAGE_TAG: ${{ github.sha }}
      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"

 

 

Git action

 

ECR 이미지 올리기 성공!


 

4. 인스턴스 접속

인스턴스에 접속한다.

 

moba x term 화면

 


 

5. 인스턴스 내 docker 설치

ubuntu 기준 명령어는 아래와 같다.

sudo apt update
sudo apt install -y docker.io
sudo systemctl start docker
sudo systemctl enable docker

 

 

이어서 aws cli도 설치해준다.

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
aws --version

 

인증도 해준다.

aws configure
AWS Access Key ID [None]: 
AWS Secret Access Key [None]: 
Default region name [None]: 
Default output format [None]:

 

 


 

6. 이미지 받기 

이미지를 받아준다.

 

 docker pull public.ecr.aws/n1b7r8u0/ktb-study:1fcb30131c5924d63d4ea3e6cd440f63a01b8099

 

 


 

7. 프론트 백엔드 라우팅 (revcerse proxying)

리버스 프록싱을 진행할 것이기 때문에 정적 웹 호스팅 서비스를 지원하는 cloudfront에서 설정을 해준다.
경로는 CloudFront > 배포 > distribution_id > 원본 > 원본 생성 이다.

 

 

 

원본을 생성할 땐 origin을 로드밸런서로 이어준다.

 

 

이 후, 동작 > 동작 생성 을 클릭해준다.

 

 

 

필자의 웹 프로젝트의 경우, 모든 백엔드의 라우팅 함수에는 '/api/'가 앞에 붙어있다.

따라서 동작은 /api/* 로 설정해준다.

 

 

뷰어 프로토콜 정책 > Redirect HTTP to HTTPS


 

8. 컨테이너 실행

 

ec2에서 컨테이너를 실행시키고 통신이 잘 되는지 확인한다. 끝!