이전 포스팅
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를 등록 -> 배포 -> 제거 하는 방식으로 구현해보았다.
진행 목차
- AWS IAM 사용자 생성
- Github Secret에 ID/KEY 정보 추가
- Github Action에서 사용되는 gradle.yml 파일 수정
- github에서 ec2로 접근 하는 ip를 임시로 security group에 추가
- 원래 스크립트 수행
- 1번에서 추가한 ip 삭제
우선 ssh 접근으로 Security Group 변경을 하려면 EC2 Access 권한이 있는 사용자 ID/KEY를 사용해야 한다.
AWS IAM에서 사용자 생성

사용자 권한은 직접 연결로 하여 EC2FullAccess 정책을 추가했다.
사실 시큐리티 그룹 조작에 관련된 권한만 주면 되지만 그건 다음에...^^

사용자 생성 완료 후 생성한 사용자로 들어가보면 하단 탭에 보안 자격 증명 탭이 있다.
여기서 우리는 ID/KEY로 접근하는게 목적이기 때문에 엑세스키를 생성하면 된다.

키 생성을 완료하고 이를 github secret 에 등록하면 된다.
gradle.yml 수정
배포 스텝 앞뒤로 추가 할 작업에 대해 작성해야한다.
step은 대략 이렇게 된다.
- github action ip 가져오기
- secret에 등록한 AWS Credential(ID/KEY)로 SG 접근
- 1번에서 가져온 ip SG에 추가
- 배포
- 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
결론
데브옵스쪽은 되게 어려워보이고 접근이 쉽지않아 손대기가 무서웠는데
워낙 요즘 참고 자료가 많고 설명이 잘되어있어 보면서 하다보니 되네..? 약간의 자신감을 얻었다.
물론 현업에선 어마무시한 보안 제약과 프로세스가 더해지기 때문에 배로 복잡해지지만 그것도 시간을 들이면 해낼수 있지 않을까..ㅎㅎ
'PROGRAMMING > CI&CD' 카테고리의 다른 글
| [GITHUB] SpringBoot 프로젝트 Github Action으로 EC2에 Docker 배포하기 (0) | 2024.05.05 |
|---|---|
| [GITHUB] Github Action으로 EC2 접근 에러 ssh.ParsePrivateKey: ssh: no key found (0) | 2024.04.30 |
| [Docker] 도커 시작하기4 - Network (0) | 2024.01.04 |
| [Docker] 도커 시작하기3 - CLI Command (0) | 2024.01.04 |
| [Docker] 도커 시작하기2 - Docker Install (0) | 2024.01.04 |