GitHub Action으로 AWS EC2에 도커 이미지 배포하기

싱판다·2023년 8월 20일
0

프론트엔드 서버를 올려야 한다는 이야길 들었다.
도커 이미지를 만들어서 EC2 인스턴스에 올려야 한단 이야기를 듣고 이를 이왕 하는 김에 자동화하는게 더 안전하고 비용이 덜 들 것 같다는 생각이 들어 작업을 시작하였다.

작업은 gpt와 같이 진행했다.
하지만 gpt와 같이 일할 때 긴장을 풀 수 없었다. 질문을 하고 답변한 내용 중에 궁금한 부분을 질문하고 다시 또 답변한 내용 중 안되는 부분을 물어봤더니 먼저 질문한 내용의 전제를 잊어버려 다시 포함하여 질문해야 했다.

아무튼..

내가 하고자 했던 건 다음과 같다.
1. GitHub 특정 repository의 main 브런치에 푸시할 때, GitHub Action이 실행되며, 해당 소스를 받아 빌드하고 이를 이미지로 만들기
2. 만들어진 도커 이미지를 docker hub에 올리기
3. 도커 이미지를 AWS EC2 인스턴스에서 실행하기 위해 ssh로 접속하기
4. ssh로 접속한 후, docker hub에 올린 이미지를 내려 받아 해당 이미지를 컨테이너로 실행하기

어려운 건 아니라 생각했지만 AWS EC2로 접속이 안되서 애를 먹었다.
내가 직접 붙는 게 아니라 명령어로 작성해서 GitHub Action에서의 배포환경에서 EC2 인스턴스로 붙는 건 생각보다 달랐다. ssh로 붙는 명령어를 쓰는 게 달랐던지 계속해서 인증에 실패하고 접속하지 못했다.
이 때 내가 작성했던 액션 코드다.

  mkdir -p ~/.ssh
  echo '${{ secrets.SSH_PRIVATE_KEY }}' | base64 --decode > ~/.ssh/id_rsa
  chmod 600 ~/.ssh/id_rsa
  touch ~/.ssh/known_hosts
  ssh-keyscan -t rsa ${{ secrets.EC2_HOST }} >> ~/.ssh/known_hosts
  
  ssh -o StrictHostKeyChecking=no -i ~/.ssh/id_rsa ${{ secrets.EC2_USER }}@${{ secrets.EC2_HOST }} "

깃헙 액션으로 배포시, EC2 인스턴스에 SSH 키를 추가하여 접속하는 방법은 되지 않았다. 내가 무얼 잘못하고 있는지는 알 수 없었지만 계속해서 시도해도 되지 않았다.

다른 방법을 모두 시도해본 결과 다음만이 배포에 성공했다.

바로, 깃헙 액션 환경의 아이피와 ssh 포트를 잠시 AWS 보안 그룹에 추가하여 연결, 그리고 모든 작업을 끝내고 다시 AWS 보안 그룹에 추가한 깃헙 액션 환경의 아이피를 제거하는 것이다.
이에 따른 깃헙 액션 플로우는 이렇게 작성했다.
또한 ssh 연결에는 appleboy/ssh-action@v0.1.6 을 사용했다. 사용 방법이 엄청 간단했다.

      - name: Get Github action IP
        id: ip
        uses: haythem/public-ip@v1.3

      - 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_ID }}
          aws-region: ${{ secrets.AWS_REGION }}

      - name: Add Github Actions IP to Security group
        run: |
          aws ec2 authorize-security-group-ingress --group-id ${{ secrets.AWS_SG_ID }} --protocol tcp --port 22 --cidr ${{ steps.ip.outputs.ipv4 }}/32

      - name: SSH Commands
        uses: appleboy/ssh-action@v0.1.6
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ${{ secrets.EC2_USER }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          port: 22
          script_stop: true
          script: |
            docker stop dockerImageName || true
            docker rm dockerImageName || true
            docker pull ${{ secrets.DOCKERHUB_USERNAME }}/dockerImageName:latest
            docker run -d -p 8080:80 --name dockerImageName ${{ secrets.DOCKERHUB_USERNAME }}/dockerImageName:latest

      - name: Remove Github Actions IP From Security Group
        run: |
          aws ec2 revoke-security-group-ingress --group-id ${{ secrets.AWS_SG_ID }} --protocol tcp --port 22 --cidr ${{ steps.ip.outputs.ipv4 }}/32

배포 성공
배포 성공..!

최종 플로우

  1. GitHub 특정 repository의 main 브런치에 푸시할 때, GitHub Action이 실행되며, 해당 소스를 받아 빌드하고 이를 이미지로 만들기
  2. 만들어진 도커 이미지를 docker hub에 올리기
  3. 깃헙 액션 환경의 아이피와 ssh 포트를 잠시 AWS 보안 그룹에 추가
  4. appleboy/ssh-action을 이용해 ssh 접속
  5. docker hub에 올린 이미지를 내려 받기
  6. 해당 이미지를 컨테이너로 실행하기
  7. 모든 작업을 끝내고 다시 AWS 보안 그룹에 추가한 깃헙 액션 환경의 아이피를 제거
profile
뭐든 많이 배우고 싶다

0개의 댓글

관련 채용 정보