AWS CodePipeline을 활용해 CI/CD 적용하기
Published on Mar 13, 2022
요즘 애플리케이션 개발, 어떻게 하고 계시나요? 모던 애플리케이션 개발 방법론에서 CI/CD는 이미 기본이 되었는데요, AWS에서도 이런 CI/CD를 200% 활용할 수 있습니다. 😎
AWS에서는 CI/CD 적용을 위해 AWS Code Series라는 서비스를 제공하고 있습니다. 여기에는 CodeCommit, CodeBuild 및 CodeDeploy이 해당되는데 이 서비스를 이용하면 코드 파이프라인을 구성하여 편리하게 코드를 관리, 빌드하고 배포할 수 있습니다. 무엇보다도 AWS Code Series를 이용하면 다른 CI/CD 서비스보다 더욱 간편하고 강력하게 AWS 서비스와 연동이 가능합니다.
CodeDeploy는 코드 파이프라인을 구성하는 가장 중심적인 서비스입니다. EC2와 같은 서비스에 코드를 배포한다고 가정하면 직접 커밋과 빌드한 후 터미널을 연결하고 저장소에서 다시 가져와 배포하는 등의 여러 절차를 직접 진행해야 했습니다. (ft.intergration hell🤯)반면 CodeDeploy 사용하여 AWS 리소스에 코드 배포를 자동화하면 위와 같은 작업을 일일이 할 필요가 없습니다. 단순한 코드의 수정이 발생하거나 Auto Scaling Group 내 인스턴스가 새로 생성될 때마다 CodeDeploy가 우리를 대신해 코드 배포를 해줄 테니까요!
이번에 AWS Code Series를 학습하면서 Github(이하, 깃헙) 리포지토리에 저장된 소스 코드를 CodeCommit로 마이그레이션 후 CodeDeploy로 코드를 배포하는 코드 파이프라인을 생성해 보았습니다. 전체 과정을 복습할 겸, 정리하여 공유하고자 합니다.
과정
AWS Code Series를 200% 활용하기 위해서는 기존에 깃헙에서 관리 중인 소스 코드를 CodeCommit으로 마이그레이션부터 해야겠죠?
깃헙에서 CodeCommit으로의 코드 마이그레이션 순서는 아래와 같습니다.
- IAM 페이지에서 유저에게 CodeCommitPowerUser policy 지정
- HTTPS Git credentials 다운로드
- CodeCommit 페이지에서 리포지토리 생성
- git clone 커맨드로 깃헙 내 코드를 로컬 PC로 이동
- git push 커맨드로 깃헙에 저장된 코드를 CodeCommit으로 이동
IAM 페이지에서 CodeCommit을 사용할 유저에게 AWSCodeCommitFullAccess 정책을 추가해줍니다. 해당 정책이 있어야 유저가 CodeCommit 리포지토리를 생성하고 그 안에 코드를 push하는 등의 작업 등을 진행할 수 있습니다.
해당 유저 페이지 내 Security Credentials 탭 내 HTTPS Git credentials for AWS CodeCommit를 다운로드합니다. 해당 Credential을 통해 CodeCommit 작업에 대한 인증이 필요할 때 HTTPS로 인증합니다.
CodeCommit을 사용하기 위한 사전 준비를 마쳤으니, CodePipepline 페이지 내 CodeCommit 탭에서 리포지토리를 생성합니다.
리포지토리가 생성되면 다음과 같은 화면이 나타납니다. 해당 페이지 Step 3에 있는 링크가 리포지토리 링크입니다.
git clone ${GitHub URL} ${Local Directory Name} 커맨드로 깃허브에서 로컬 PC로 코드를 clone 합니다. ls 커맨드로 코드가 로컬 PC 내 code-test-script 디렉토리로 clone 된 것을 확인했습니다.
git push ${CodeCommit URL} 커맨드로 로컬 PC에 있는 코드를 CodeCommit으로 push합니다.
Push할 때 입력하라고 나오는 Username과 Password에는 앞서 다운 받은 유저의 HTTPS Git Credentials 정보를 입력합니다. Credential 정보를 맞게 입력하면 코드가 push 됩니다.
CodeCommit 내 리포지토리에 코드가 push된 것을 확인합니다.
다음으로는 CodeCommit 내 코드가 Auto Scaling 그룹 내에 자동 배포될 수 있도록 CodeDeploy과 연결하여 파이프라인을 만듭니다. 순서는 아래와 같습니다.
- IAM 페이지에서 CodeDeploy 및 EC2에 대한 역할 생성
- CodeDeploy agent를 설치한 AMI로 ASG Launch Template 생성 및 ASG 생성
- CodeDeploy 페이지에서 Application 및 Deployment group 생성
- CodePipeline 페이지에서 Source provider 및 Deploy provider를 선택해 파이프라인 생성
IAM 역할 생성 페이지에서 Trusted entity를 CodeDeploy로 선택하면 AWSCodeDeployRole 정책 한 가지만 나타납니다. 해당 정책을 선택하여 역할을 생성해 줍니다.
해당 역할을 통해 CodeDeploy가 EC2 또는 Auto Scaling Group에 코드를 배포하고 일련의 작업들을 진행합니다.
EC2에 대한 역할 또한 생성합니다. Trusted entity를 EC2로 선택하고 정책은 AmazonEC2RoleforAWSCodeDeploy를 선택합니다.
해당 역할을 통해 CodeDeploy agent가 설치된 EC2가 S3로부터 Revision을 받아옵니다. Revision은 CodeDeploy가 인스턴스에 배포할 소스 파일의 버전을 저장하며 S3에 저장되어 있습니다.
IAM 역할 생성이 끝나면 CodeDeploy agent가 설치된 인스턴스 AMI를 생성합니다. EC2에 CodeDeploy agent가 설치돼 있어야 CodeDeploy가 해당 인스턴스 대상으로 코드 배포가 가능합니다.
sudo yum update
sudo yum install ruby
sudo yum install wget
wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto
위 스크립트로 CodeDeploy agent를 설치합니다.
CodeDeploy agent 설치가 완료되면 해당 인스턴스의 AMI 를 생성합니다. 생성한 이미지로 Launch Template을 생성 후 해당 템플릿으로 Auto Scaling group 또한 생성합니다.
ASG 설정 완료 후, CodePipeline 서비스 페이지로 돌아가 CodeDeploy Application 및 Deployment group을 생성합니다.
Application은 쉽게 하나의 배포 단위라고 볼 수 있으며 Deployment group은 해당 Application 에 대한 배포 대상 및 배포 방식을 설정하는 그룹이라고 이해할 수 있습니다.
Deploy 탭에서 Application을 생성합니다.
여기에서 코드 배포를 Auto Scaling group 내 EC2에 배포를 해줄 예정이므로 Compute platform을 EC2/On-premises로 선택합니다. Application은 이렇게 간단하게 생성이 끝납니다.
다음으로는 생성된 Application 페이지 내에서 Deployment group를 생성합니다.
Service role은 IAM 페이지에서 CodeDeploy를 Trusted entity로 생성한 CodeDeployServiceRole을 선택합니다.
Environment configuration에서는 Auto Scaling group 내 EC2 대상으로 코드 배포를 위해 EC2 Auto Scaling groups 및 생성한 그룹을 선택합니다.
CodeCommit 리포지토리 및 CodeDeploy Application & Deployment group 이 모두 준비되었으니 대망의 파이프라인을 생성해 볼 차례입니다.
파이프라인 탭에서 파이프라인을 생성합니다. 파이프라인에 대해서는 별도로 생성해 준 역할이 없으므로 콘솔에서 생성하도록 new service role을 선택합니다.
새롭게 생성한 CodeCommit의 리포지토리 내에 소스 코드가 있으니 소스로 AWS CodeCommit을 선택합니다. 깃헙에서 관리하는 코드로 배포하고 싶다면 깃헙을 소스로 선택합니다. 그 후 일련의 인증을 거치면 깃헙을 소스를 설정할 수 있습니다.
CodeCommit에 저장된 코드는 빌드 단계가 따로 필요하지 않아 빌드 단계는 스킵합니다.
Deploy stage에서 CodeDeploy를 Deploy provider로 선택 후 생성해둔 Application과 Deployment group을 선택합니다.
파이프라인이 생성되면 자동으로 파이프라인이 실행되면서 CodeCommit에서 코드를 가져와 Auto Scaling group 내 배포까지 진행합니다.
인스턴스 IP를 입력하여 확인해보니 코드가 잘 배포되었습니다!🎉
CodeCommit 내 코드를 수정했더니 바로 트리거되어 다시 배포가 진행됩니다.
Tadaa!! 수정된 코드가 반영되어 배포된 것을 확인하였습니다.
Auto Scaling group에서 새로운 인스턴스를 런칭시키면 해당 인스턴스에 마찬가지로 코드가 자동으로 배포됩니다.
Initiated by에 보면 Autoscaling group action이라고 되어 있습니다. 즉, Auto Scaling group에서 새로운 액션이 있어서 이에 따라 자동으로 배포가 되었다는 뜻입니다.
마치며
AWS Code Series 입문자가 해당 서비스를 사용하면서 느낀 가장 큰 장점은 단연코 강력한 AWS 서비스와의 연동입니다. AWS 상에서 개발 및 배포를 진행할 때는 AWS Code Series와 같은 강력한 툴을 써보실 것을 추천 드립니다. 👍
기타 오류 사항
처음으로 Code series를 학습하면서 위 이미지와 같이 수도 없는 에러 메세지를 봤습니다.🙄 차근차근 서치하면서 해결해보니 사소한 실수들이 많았습니다. 혹 저와 같은 에러 메세지를 보게 되는 분들이 있다면 참고하실 수 있게 함께 기록해두고자 합니다.
1. 파이프라인이 실행되다가 배포 단계에서 ‘CodeDeploy agent was not able to receive the lifecycle event’와 같은 에러 메세지를 맞닥뜨렸습니다.
인스턴스에 들어가서 CodeDeploy Agent가 잘 실행되고 있는지 확인해봤습니다.
Agent는 잘 돌아가고 있어서 less /var/log/aws/codedeploy-agent/codedeploy-agent.log 커맨드로 CodeDeploy 로그를 확인해보았습니다.
Credential이 없으며 IAM 인스턴스 프로필이 있는지 확인하라는 부분이 바로 힌트였습니다. 생각해보니 EC2에 대한 역할을 안 만들었더군요..!
IAM 페이지로 돌아가 AmazonEC2RoleforAWSCodeDeploy policy를 추가한 EC2 역할을 생성했습니다.
해당 역할을 연결한 인스턴스 이미지를 ASG 템플릿 이미지로 수정하고 ASG 내에 있는 인스턴스 다시 refresh 시켜주었습니다. IAM 역할이 연결되어 있지 않은 기존 인스턴스는 삭제되고 새로운 인스턴스가 생성되었습니다.
CodeDeploy Deployment group 재생성 후에 다시 파이프라인을 돌리니 문제가 해결되었습니다!
2. 배포가 시작되면 Deployment 페이지에서 배포의 어느 단계가 진행되고 있는지 확인할 수 있습니다. Install 단계에서 계속 에러가 나기도 했는데 이는 (당연하지만 그땐 몰랐던..) 스크립트의 문제였습니다. 예로는 ‘yum install’ 뒤에 ‘-y’가 없어서 설치 확인에 대해 응답받지 못하니 Install 단계에서 계속 에러가 발생했습니다.
3. 분명 Auto Scaling group 내 running 상태의 인스턴스가 있음에도 불구하고 ‘No instance found..’와 같은 에러 메세지가 나타났습니다. 이 때에는 주로 ASG에 대한 수정이 있었을 때였는데 이 때 Deployment group을 재생성 해주면 문제없이 다시 배포가 진행됐었습니다.