프론트엔드 서버를 올려야 한다는 이야길 들었다.
도커 이미지를 만들어서 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
배포 성공..!