본문 바로가기

PROGRAMMING/CI&CD

[GITHUB] Github Action으로 EC2 IP 접근 제한 환경에서 Docker 배포하기

이전 포스팅

https://dvpdvp.tistory.com/222

 

[GITHUB] SpringBoot 프로젝트 Github Action으로 EC2에 Docker 배포하기

이전 포스팅https://dvpdvp.tistory.com/221 [GITHUB] Github Action으로 EC2 접근 에러 ssh.ParsePrivateKey: ssh: no key found에러 메시지  상황Github Action으로 스크립트를 실행하여 EC2에 접근, Docker로 이미지를 끌어와

dvpdvp.tistory.com

 

목적

현재 Security Group에 22번 포트로 모든 ip가 접근 가능 한 상태 -> ip 제한 변경 후에도 배포 작업이 정상적으로 작동 하는 것

 

현업에서도 요게 살짝 문제가 있었는데,

깃헙에서 ec2로 접근하는 ip가 계속적으로 변경되기 때문에 배포 전 해당 ip를 등록 -> 배포 -> 제거 하는 방식으로 구현해보았다.

 

진행 목차

  1. AWS IAM 사용자 생성
  2. Github Secret에 ID/KEY 정보 추가
  3. Github Action에서 사용되는 gradle.yml 파일 수정
    1. github에서 ec2로 접근 하는 ip를 임시로 security group에 추가
    2. 원래 스크립트 수행
    3. 1번에서 추가한 ip 삭제

 

우선 ssh 접근으로 Security Group 변경을 하려면 EC2 Access 권한이 있는 사용자 ID/KEY를 사용해야 한다.

AWS IAM에서 사용자 생성  

step 1

 

사용자 권한은 직접 연결로 하여 EC2FullAccess 정책을 추가했다.

사실 시큐리티 그룹 조작에 관련된 권한만 주면 되지만 그건 다음에...^^

 

step 2

사용자 생성 완료 후 생성한 사용자로 들어가보면 하단 탭에 보안 자격 증명 탭이 있다.

여기서 우리는 ID/KEY로 접근하는게 목적이기 때문에 엑세스키를 생성하면 된다.

 

step 3

 

키 생성을 완료하고 이를 github secret 에 등록하면 된다.

 

gradle.yml 수정

배포 스텝 앞뒤로 추가 할 작업에 대해 작성해야한다.

step은 대략 이렇게 된다.

  1. github action ip 가져오기 
  2. secret에 등록한 AWS Credential(ID/KEY)로 SG 접근
  3. 1번에서 가져온 ip SG에 추가
  4. 배포
  5. 3번에서 추가한 ip SG에서 제거

 

아래 코드는 해당 스텝을 추가한 gradle.yml 이다.

   # Gihub Action deploy를 위해 SG에 임시 IP 추가 
    - 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-1" >> $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: Deploy
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.HOST }} # EC2 인스턴스 퍼블릭 DNS
        username: ${{ secrets.EC2_USER }} # EC2 user
        key: ${{ secrets.PRIVATE_KEY }} # pem 키
        # 도커 작업
        script: |
          docker pull ${{ secrets.DOCKER_USERNAME }}/test:latest
          docker stop $(docker ps -a -q)
          docker run -d --log-driver=syslog -p 8080:8080 -e SPRING_PROFILES_ACTIVE=prod ${{ secrets.DOCKER_USERNAME }}/test:latest
          docker rm $(docker ps --filter 'status=exited' -a -q)
          docker image prune -a -f
   
    - 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

 

전체 코드

https://github.com/HWANGMA27/AWS-TEST/blob/main/.github/workflows/gradle.yml

 

AWS-TEST/.github/workflows/gradle.yml at main · HWANGMA27/AWS-TEST

Repository for test aws and docker. Contribute to HWANGMA27/AWS-TEST development by creating an account on GitHub.

github.com

 

 

결론

데브옵스쪽은 되게 어려워보이고 접근이 쉽지않아 손대기가 무서웠는데 

워낙 요즘 참고 자료가 많고 설명이 잘되어있어 보면서 하다보니 되네..? 약간의 자신감을 얻었다.

물론 현업에선 어마무시한 보안 제약과 프로세스가 더해지기 때문에 배로 복잡해지지만 그것도 시간을 들이면 해낼수 있지 않을까..ㅎㅎ