Code

AWS EC2 인스턴스 인바운드 IP 제한 상태에서 Github Action 배포

milC 2023. 1. 5. 00:19
반응형

AWS EC2 인스턴스 인바운드 보안 설정 상태에서 Github Action 배포 자동화하기

일단 먼저 인스턴스를 만드는 방법이 궁금하신 분들은
AWS 프리티어 인스턴스 만들기
에 자세하고 쉽게 설명해놨으니 살펴보시면 됩니다.

인바운드 규칙이란?

EC2 인스턴스는 누구나 접근 가능한 public IP를 부여받습니다. 하지만 모두가 접속할 수 있다면, 해커들로 인해 소중한 인스턴스가 너덜너덜 해지겠죠. 그래서 생성한 인스턴스에 접근할 수 있는 인바운드 규칙을 설정하게 됩니다.

인바운드 규칙이란?

집, 회사 컴퓨터 IP만 인바운드 규칙을 열어놓으면, 집과 회사에서만 인스턴스에 접근할 수 있죠.
RDS 보안그룹에서 인바운드 규칙을 설정하는 것도 같은 맥락입니다. 주로 RDS의 인바운드 규칙은 서버 인스턴스의 IP만 허용해놓는 경우가 많은데, 데이터베이스를 다른 IP에서 접근할 수 있도록 하면 DB가 남아나질 않을 것이기 때문입니다.

보안그룹 인바운드 규칙 설정

Github Action 활용

하지만 Github Action을 활용하여 배포를 자동화하기 위해서는 Github Action의 IP도 인바운드 규칙에서 허용해야하는데, Github Action의 IP는 계속해서 유동적으로 바뀐다는 것이 문제입니다.
이를 해결하기 위한 방법은 여러가지가 있지만, 가장 직관적이고 간단한 해결책을 적용했습니다.
바로 Github Action이 실행될때마다 IP를 얻어와서 보안그룹에 잠깐 동안만 추가하는 것입니다.

EC2에 도커 환경은 구축되어 있어도 되고 없어도 됩니다.
이런 식으로 Github Action CD 파이프가 실행됩니다.


적용한 코드는 다음과 같습니다.

name: remote ssh command for deploy
on:
 push:
   branches: [master]
jobs:
 build:
   name: Build
   runs-on: ubuntu-18.04
   steps:
   
     - name: Get Github action IP
       id: ip
       uses: haythem/public-ip@v1.2
       
     - name: Setting environment variables
       run: |
         echo "AWS_DEFAULT_REGION=ap-northeast-2" >> $GITHUB_ENV
         echo "AWS_SG_NAME=launch-wizard-2" >> $GITHUB_ENV
         
     - 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: ap-northeast-2
     
     - name: Add Github Actions IP to Security group
       run: |
         aws ec2 authorize-security-group-ingress --group-name ${{ env.AWS_SG_NAME }} --protocol tcp --port 22 --cidr ${{ steps.ip.outputs.ipv4 }}/32    
       env:
         AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
         AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
         AWS_DEFAULT_REGION: ap-northeast-2
  
     - name: executing remote ssh commands using key
       uses: appleboy/ssh-action@master
       with:
         host: ${{ secrets.HOST }}
         username: ${{ secrets.USERNAME }}
         key: ${{ secrets.KEY }}
         port: ${{ secrets.PORT }}
         script: |
           ./deploy.sh
           
     - name: Remove Github Actions IP from security group
       run: |
         aws ec2 revoke-security-group-ingress --group-name ${{ env.AWS_SG_NAME }} --protocol tcp --port 22 --cidr ${{ steps.ip.outputs.ipv4 }}/32
       env:
         AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
         AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
         AWS_DEFAULT_REGION: ap-northeast-2

ubuntu18.04 (실행환경)이나 default_region등은 각자 환경에 맞게 설정해주시면 됩니다.
인스턴스 루트 디렉토리에 둔 deploy.sh 쉘 스크립트에는 필수적으로 이정도의 코드만 들어가 있으면 됩니다.

#!/bin/bash

cd ~/{프로젝트 경로}
git pull origin master
sudo docker-compose up --build -d // 1) docker-compose 사용 시
sudo npm restart // 2) 도커 없이 바로 돌릴 경우 설정된 npm 명령어 실행

이 부분을 지나면서 Github Action이 인스턴스에 접속하게되면 배포 파일을 실행해줍니다.

         script: |
           ./deploy.sh

secrets.{변수} 는 settings의 Secrets - Action에서 추가할 수 있습니다.

Action Secrets

궁금하신점은 댓글 남겨주시면 답변해드리겠습니다. 감사합니다.

반응형