민프

[AWS][EC2] ECS + Docker +ECR + CICD(github actions)를 이용하여 nestjs를 배포해보자 본문

DevOps/[AWS]

[AWS][EC2] ECS + Docker +ECR + CICD(github actions)를 이용하여 nestjs를 배포해보자

민프야 2025. 4. 6. 16:45

이전 포스팅에서는 CICD를 하지 않고 nestjs를 배포하는 것을 해보았습니다.

https://minf.tistory.com/entry/AWSEC2-EC2%EC%97%90-Nestjs-ECR%EC%A0%81%EC%9A%A9%ED%95%B4%EB%B3%B4%EA%B8%B0#google_vignette

 

[AWS][EC2] EC2 + Docker + ECR로 Nestjs 어플리케이션 배포하기 (feat. WARNING: The requested image's platform (linux/ar

준비물 - Docker- nestjs Docker Image- IAM (AccessKey, Secret Accesskey)- ECR - EC2 과정- 로컬에서 Nestjs Docker image 생성- ECR에 PUSH- EC2(ubuntu)에 적용  1. EC2(ubuntu) - Docker 설치 (SSH) sudo apt update -y sudo apt install -y dock

minf.tistory.com

 

이번 포스팅에서는 이전 포스팅에서 배포때 하였던 아래 과정을 github actions으로 진행해보도록 하겠습니다.

'로컬에서 빌드 후, 잘 동작하는지 확인하고 -> 다시 ECR에 push -> EC2 - ECR latest Image pull -> EC2 -성공적으로 Docker 가 실행중인지 확인 (docker ps) -> http://<EC2 퍼블릭 IP>:3000 접근 확인' -> EC2 - 기존 컨테이너 중지 -> EC2 -> 기존 컨테이너 삭제 -> 새로운 컨테이너 실행

 


1. 전체 흐름 요약

github actions를 사용해서 다음 순서로 자동화 할 예정입니다.

 

1. 코드가 push 되면 

2. Docker 이미지 빌드 

3. AWS ECR에 Push 

4. EC2에서 ECR 이미지 Pull (docker pull)

5. EC2에서 기존 컨테이너 중지 (docker stop)

6. EC2에서 기존 컨테이너 삭제 (docker rm)

7. EC2에서 새로운 컨테이너 실행 (docker run)

 

 

1-1.  ✅  사전 준비사항

0. IAM 'AmazonEC2ContainerRegistryFullAccess' 권한추가

1. EC2에 SSH Key 등록 완료

2. EC2 인스턴스에 Docker 설치 완료

3. GitHub에 아래 4가지 Secret 등록 

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY
  • ECR_REGISTRY(주소) → 예: 123456778.dkr.ecr.ap-northeast-2.amazonaws.com
    • ECR_REGISTRY 주소입니다.
      간혹 ECR_REPOSITORY 경로랑 헷갈리시는 분들이 있는데 
      아래 full Image URI로 간단하게 말씀드려보면
      full Image URI (전체 이미지 경로)
      - 123412341234.dkr.ecr.ap-northeast-2.amazonaws.com/abc/test

      ECR Registry ('어느 AWS 계정의 ECR인가?' 를 의미합니다.)
      -123412341234.dkr.ecr.ap-northeast-2.amazonaws.com

      ECR Repository (Docker 이미지가 저장 될 경로)
      -abc/test
  • EC2_HOST → 퍼블릭 IP
  • EC2_USER → ubuntu 또는 ec2-user
  • EC2_SSH_KEY → .pem 파일 내용 (Base64 인코딩하거나 GitHub Secret에 그대로 복붙)

Github에서 Secret를 등록하는 방법은 아래와 같습니다.

GitHub > your-repo > Settings > Secrets and variables > Actions > New repository secret

 

EC2_SSH_KEY는 EC2 인스턴스를 처음 만들 때 만든 '키 페어' 입니다. .pem파일이 이 SSH Private Key입니다.

이게 필요한 이유는 Github가 EC2에 직접 SSH에 접속해서 Docker 명령을 실행하기 위함 입니다.

 

 


2. workflow 작성하기

경로 : 루트디렉토리/.github/workflows/depoly.yml

name: Deploy to EC2 from ECR

on:
  push:
    branches: [ main ]

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: ✅ Checkout source code
        uses: actions/checkout@v3

      - name: ✅ Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v2
        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
        run: |
          aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin ${{ secrets.ECR_REGISTRY }}
        
      - name: 🐳 Build and push Docker image
        run: |
          docker buildx build --platform linux/amd64 --no-cache -t test/test .
          docker tag test/test:latest ${{ secrets.ECR_REGISTRY }}/test/test:latest
          docker push ${{ secrets.ECR_REGISTRY }}/test/test:latest

      - name: 🚀 Deploy to EC2 via SSH
        uses: appleboy/ssh-action@v1.0.0
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ${{ secrets.EC2_USER }}
          key: ${{ secrets.EC2_SSH_KEY }}
          script: |
            docker pull ${{ secrets.ECR_REGISTRY }}/test/test:latest
            docker stop test-container || true
            docker rm test-container || true
            docker run -d -p 3000:3000 --name test-container ${{ secrets.ECR_REGISTRY }}/test/test:latest

 

ECR에 로그인

Docker를 사용해서 빌드한 Image를 ECR에 업로드하기 위해서는 ECR에 먼저 로그인해줘야하는데,

저는 위 코드와 같은 방식으로 했지만

아래 aws-actions에서 제공해주는 amazon-ecr-login을 사용해줘도 됩니다. 

https://github.com/aws-actions/amazon-ecr-login

 

GitHub - aws-actions/amazon-ecr-login: Logs into Amazon ECR with the local Docker client.

Logs into Amazon ECR with the local Docker client. - aws-actions/amazon-ecr-login

github.com

 

ssh-action

appleboy/ssh-action@master는 배포된 최신 기능을 사용할 수 있지만, 안정성이 떨어질 수도 있으니 설제 서비스를 하시는 분들은 안정화된 버전을 사용하시는걸 추천드립니다. 

 

https://github.com/appleboy/ssh-action

 

GitHub - appleboy/ssh-action: GitHub Actions for executing remote ssh commands.

GitHub Actions for executing remote ssh commands. Contribute to appleboy/ssh-action development by creating an account on GitHub.

github.com


3. 실행 결과

push를 하면 github - repository - Actions에 들어가보면 과정을 볼 수 있습니다.

저는 에러가 나왔네요

 

원인은 appleboy/ssh-action@1.0.0이라는 버전은 존재하지 않기 때문에 발생한 오류입니다.

github actions에서 해당 버전의 action을 다운로드 할 수 없어서 실패하였습니다. 

v1.0.0인데.. 1.0.0으로 넣어서 못찾은거네요.

v1.2.2로 진행해보겠습니다.

 

지원 버전은 아래에 들어가셔서 찾아보시면 됩니다. 

https://github.com/appleboy/ssh-action/releases

 

Releases · appleboy/ssh-action

GitHub Actions for executing remote ssh commands. Contribute to appleboy/ssh-action development by creating an account on GitHub.

github.com

 

고치고 해보니 일단 업로드는 잘되었고, 실제로 nestjs배포가 잘 되었는지 확인해보겠습니다.

github actions 성공

 

EC2에서 Container가 실행중인지 확인해보았는데 Container가 잘 실행중인 것을 확인하실 수 있습니다. 

EC2 Docker Container 동작 성공

ECR에서도 이미지가 잘 생성된 것을 확인하실 수 있습니다.

ECR 이미지 업로드 성공

웹 페이지도 잘 업데이트 된 것을 확인하실 수 있습니다. 

Comments