본문 바로가기

퍼블릭 클라우드

AWS 보안 그룹에 GitHub Actions IP 추가 및 삭제하는 방법

반응형

AWS 보안 그룹에 GitHub Actions IP 추가 및 삭제하는 방법

AWS EC2 인스턴스에 GitHub Actions로 배포 시 보안을 강화하기 위해 배포 전에는 GitHub Actions의 IP를 보안 그룹에 추가하고 배포 후에는 해당 IP를 보안 그룹에서 삭제하는 방법입니다.

GitHub Actions 워크플로우

전체 워크플로우

더보기

---

name: Remote SSH Command for Deploy

on:
  push:
    branches:
      - main

env:
  AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
  AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
  AWS_DEFAULT_REGION: us-east-1
  AWS_SG_ID: sg-07f3

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: GitHub Action Runner Public IP(Check IP)
        id: ip
        uses: haythem/public-ip@v1.3

      # 디버깅을 위해 IP 주소 확인
      #- name: Print Public IP
      #  run: |
      #    echo ${{ steps.ip.outputs.ipv4 }}
      #    echo ${{ steps.ip.outputs.ipv6 }}

      - name: Configure AWS Credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ env.AWS_DEFAULT_REGION }}

      - name: Add GitHub Action IP to Security Group
        run: |
          aws ec2 authorize-security-group-ingress \
            --group-id ${{ env.AWS_SG_ID }} \
            --protocol tcp \
            --port 22 \
            --cidr ${{ steps.ip.outputs.ipv4 }}/32 || echo "The IP already exists in the security group"
  
      # 디버깅을 위해 경로 확인
      # - name: Check files in current directory
      #   run: |
      #     ls -R ./

      - name: Copy deploy.sh to Remote Server
        run: |
          mkdir -m 700 -p $HOME/.ssh
          echo "${{ secrets.AWS_EC2_SSH_KEY }}" > $HOME/.ssh/aws_ec2.pem
          chmod 600 $HOME/.ssh/aws_ec2.pem
          scp -i $HOME/.ssh/aws_ec2.pem -o StrictHostKeyChecking=no -r ./shell_scripts/deploy.sh \
            ${{ vars.AWS_EC2_USER }}@${{ vars.AWS_EC2_HOST }}:/home/${{ vars.AWS_EC2_USER }}/ || exit 1

      - name: Execute scripts using remote SSH commands
        uses: appleboy/ssh-action@v1.2.0
        with:
          host: ${{ vars.AWS_EC2_HOST }}
          username: ${{ vars.AWS_EC2_USER }}
          key: ${{ secrets.AWS_EC2_SSH_KEY }}
          script: |
            cd $HOME
            chmod +x deploy.sh
            ./deploy.sh

      - name: Remove GitHub Action IP from Security Group
        run: |
          aws ec2 revoke-security-group-ingress \
            --group-id ${{ env.AWS_SG_ID }} \
            --protocol tcp \
            --port 22 \
            --cidr ${{ steps.ip.outputs.ipv4 }}/32 || echo "Failed to remove IP from security group."

---

워크플로우 설명

1. 트리거

main 브랜치로 코드가 푸시될 때 실행됩니다.

on:
  push:
    branches:
      - main

2. 환경 변수

AWS_ACCESS_KEY_ID와 AWS_SECRET_ACCESS_KEY는 GitHub Secrets를 통해 안전하게 저장된 AWS 자격 증명을 사용합니다.

env:
  AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
  AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
  AWS_DEFAULT_REGION: us-east-1
  AWS_SG_ID: sg-07f3

3. build

이 작업은 EC2 서버에 파일을 복사하고 원격에서 배포 스크립트를 실행합니다.

3.1 Checkout Code

최신 코드를 체크아웃하여 배포에 필요한 파일을 준비합니다.

- name: Checkout code
  uses: actions/checkout@v4

3.2 GitHub Actions 러너 IP 확인

현재 GitHub Actions 러너의 공인 IP 주소를 가져옵니다.

- name: GitHub Action Runner Public IP(Check IP)
  id: ip
  uses: haythem/public-ip@v1.3

3.3 AWS 자격 증명 구성

AWS CLI 명령어를 사용할 수 있도록 AWS 자격 증명을 구성합니다.

- name: Configure AWS Credentials
  uses: aws-actions/configure-aws-credentials@v4
  with:
    aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
    aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
    aws-region: ${{ env.AWS_DEFAULT_REGION }}

3.4 보안 그룹에 GitHub Actions IP 추가

GitHub Actions 러너의 IPv4 주소를 보안 그룹에 추가합니다.

- name: Add GitHub Action IP to Security Group
  run: |
    aws ec2 authorize-security-group-ingress \
      --group-id ${{ env.AWS_SG_ID }} \
      --protocol tcp \
      --port 22 \
      --cidr ${{ steps.ip.outputs.ipv4 }}/32 || echo "The IP already exists in the security group"

3.5 배포 스크립트 복사

GitHub Actions 러너에서 EC2 서버로 deploy.sh 파일을 복사합니다.

- name: Copy deploy.sh to Remote Server
  run: |
    mkdir -m 700 -p $HOME/.ssh
    echo "${{ secrets.AWS_EC2_SSH_KEY }}" > $HOME/.ssh/aws_ec2.pem
    chmod 600 $HOME/.ssh/aws_ec2.pem
    scp -i $HOME/.ssh/aws_ec2.pem -o StrictHostKeyChecking=no -r ./shell_scripts/deploy.sh \
      ${{ vars.AWS_EC2_USER }}@${{ vars.AWS_EC2_HOST }}:/home/${{ vars.AWS_EC2_USER }}/ || exit 1

3.6 배포 스크립트 실행

원격 서버에서 deploy.sh를 실행합니다.

- name: Execute scripts using remote SSH commands
  uses: appleboy/ssh-action@v1.2.0
  with:
    host: ${{ vars.AWS_EC2_HOST }}
    username: ${{ vars.AWS_EC2_USER }}
    key: ${{ secrets.AWS_EC2_SSH_KEY }}
    script: |
      cd $HOME
      chmod +x deploy.sh
      ./deploy.sh

3.7 보안 그룹에서 GitHub Actions IP 제거

배포가 완료된 후 GitHub Actions 러너의 IP를 보안 그룹에서 삭제합니다.

- name: Remove GitHub Action IP from Security Group
  run: |
    aws ec2 revoke-security-group-ingress \
      --group-id ${{ env.AWS_SG_ID }} \
      --protocol tcp \
      --port 22 \
      --cidr ${{ steps.ip.outputs.ipv4 }}/32 || echo "Failed to remove IP from security group."

 

이 워크플로우는 GitHub Actions를 활용해 EC2 배포 작업을 안전하고 효율적으로 자동화하는 데 적합합니다.

 

참고URL

- GitHub Marketplace : Checkout

- GitHub : Public IP

- GitHub Marketplace : "Configure AWS Credentials" Action for GitHub Actions

- GitHub Marketplace : SSH Remote Commands

 

728x90
반응형