Github Actions, AWS EC2 배포 자동화
바로 어제 github action으로 도커이미지를 빌드하고 ecr에 푸시하는 것까지 완료했습니다.
https://pungwa.tistory.com/217
Docker & ECR & EC2 & Gibhub Action 배포과정
Nest.js로 작성한 백엔드 서비스를 배포하면서 겪은 트러블슈팅입니다. 예전에 개인프로젝트를 배포할 때 ec2인스턴스에 직접 원격접속해서 git pull로 소스를 다운로드하여 build, start 했던 경험이
pungwa.tistory.com
그리고 개발자가 직접 ec2에 원격접속하여 aws cli 로그인, 도커로그인, ecr에서 도커이미지 pull, 도커컴포즈 실행까지 직접 해줘야 했습니다.
오늘은 이 과정까지 자동화하여 main브랜치에 푸시하는것만으로 배포까지 자동화하도록 하겠습니다.
1. 어느것으로 자동화할까
가장 먼저 자동화를 어떻게 할지 결정해야 합니다.
1) CodeDeploy
2) Github Actions
결과적으로 저는 Github Actions를 선택했습니다.
이유는 두 가지입니다.
ECR push까지 gibhub actions로 했으니 나머지도 여기서 하면 배포완료 로그를 깃허브 레포지토리 Actions탭에서 한 번에 볼 수 있습니다. 만약 CodeDeploy를 사용하면 github actions가 제대로 됐는지는 깃허브에서 확인하고 ec2가 배포완료되었는지는 aws에서 확인해야 되기 때문에 이왕 한 거 github actions으로 전부 다하자!
두 번째는 비용입니다. 저는 이 레포를 오래 유지하면서 계속 사이트프로젝트를 운영할 생각이기 때문에 비용이 정말 중요합니다. 비용이 많이 나오면 사람인지라 본전생각이 나겠죠..? aws CodeDeploy는 무료이고 CodeDeploy는 비용이 있기 때문에 무조건 저렴함이 우선입니다. 근데 알고 보니 CodeDeploy로 ec2에 배포하는 건 무료라고 하네요 ㅎㅎ 참고해 주세요.
2. IAM 사용자에게 EC2권한 부여
Github actions로 하기로 했으니 aws cli로 로그인했을 때 ec2에 접근권한도 줘야 합니다. 스크린샷을 참고해 주세요.
3. EC2 원격 접속하기
이제 진짜로 ec2에 원격접속해야 합니다.
일단 구글링을 해보니 username과 password로 접속하는 방식도 있고, ssh를 사용하는 방식도 있습니다.
저는 ssh방식을 선택했습니다. ssh는 개인키방식으로 보안이 좋은 반면 password방식은 브루트포스 공격에 더 취약하기 때문입니다.
그리고 ssh 방식도 이미 터미널에서 원격접속을 다 해봤기 때문에 쉽게 할 수 있습니다.
구글링 결과 appleboy/ssh-action이 쉬운 것 같네요. 레포지토리 참고해 주세요
host, username, key만 제대로 입력해 주면 ec2에 ssh방식으로 접근할 수 있고
script 부분에 실제 작업할 명령어를 써주면 됩니다.
host: ec2의 퍼블릭 ipv4 주소를 넣어주세요. ec2 인스턴스 정보에서 확인가능합니다. 이렇게 생겼을 거예요.
ec2-xx-xxx-xxx-xx.<REGION>.compute.amazonaws.com
이 부분을 환경변수에 넣어주세요.
username: ec2 유저네임을 써주세요. ubuntu서버는 ubuntu일거라고 하는데 혹시 모르니 ec2터미널에서 whoami라고 치시면 알려줍니다.
key: pem키를 입력해 주시면 되는데 그냥 아이콘더블클릭으로 열어서는 알 수 없으니 터미널에서 디렉터리 접근 후 cat명령어로 봐주세요.
-----BEGIN RSA PRIVATE KEY----- 로 시작해서 -----END RSA PRIVATE KEY-----로 끝납니다. 이 부분까지 전부 복사해서 환경변수로 넣어주세요.
그리고 로그확인을 위해 set -x를 입력했습니다.
나머지는 본인의 환경에 맞게 ec2에 원격접속해서 하던 일을 해주시면 됩니다. 저는 ecr로그인 후 도커이미지를 pull 받았습니다.
그리고 작업디렉터리로 이동해서 docker compose를 재실행합니다.
이렇게 해서 ec2에 새 도커이미지로 배포하는 것까지 자동화를 했습니다.
다음에는 프론트엔드 Nextjs 프로젝트를 배포하면서 또 다른 트러블 슈팅이 있으면 공유하겠습니다.
참고자료
https://chb2005.tistory.com/191
[CI/CD] Github Actions를 활용한 CI/CD 파이프라인 구축 (+ Docker hub)
Github Actions를 활용한 CI/CD 파이프라인 구축 개념 EC2 Instance 생성, EC2 Instance에 Docker 설치, Docker Hub 회원가입이 되어있다고 가정 Github Repository에 프로젝트의 추가사항이나 변경사항 push 혹은 merge Git
chb2005.tistory.com