-
[CI/CD] github-actions를 이용한 CI/CD구축-3 (+AWS code deploy)devops/CICD 2024. 12. 4. 20:13
github-actions를 이용한 CI/CD구축-3 (+AWS code deploy)
code deploy를 사용하는이유 (장점)
- code deploy는 여러대의 ec2 서버에 자동 배포를 쉽게 구축할 수 있다
- 쉽게 무중단 배포를 적용할 수 있다.
- 그외 장점
(둘다 github-actions의 단점을 커버하는 것)
code deploy 단점
- code deploy를 이용함으로써 인프라 구조가 복잡해진다.
복잡해질수록 관리비용, 유지보수 비용, 난이도, 트러블슈팅, 복잡도가 증가한다
code deploy 는 언제써야 좋을까?
- 서버가 여러대이거나
- 무중단 배포가 중요한 서비스일때
이용한다.
소규모 프로젝트일때는 오버엔지니어링이 될 수 있기때문에 사용을 지양한다.
github-actions를 이용한 CI/CD 구축에 code deploy 적용해보기
전체적인 흐름
1. 깃허브에 푸시
2. 깃허브 액션에서S3로 빌드파일 전달
3. 깃허브 액션에서 AWS codeDeploy로 배포 진행하라고 명령
4. CodeDeploy가 EC2한테 S3로부터 빌드파일을 다운받은 뒤 배포를 진행하도록 명령
5. EC2가 S3로부터 빌드파일을 다운받은 후 배포 진행
준비사항
1. code deploy (ec2 인스턴스에 대한 역할)
2. EC2 (S3에 대한 역할)
3. github actions(code deploy, s3에 대한 사용자)
4. github actions 사용자 액세스키(github 레포지토리 secrets에 등록)
5. aws S3 버킷
1. code deploy에게 ec2 인스턴스에 대한 역할 부여
(역할: 특정 aws리소스가 다른 aws리소스에 접근 시 필요한 권한)
1-1 IAM에서 code deploy 역할생성
IAM - 역할 - 역할생성 - AWS서비스 - code deploy - 이름설정 - 역할생성
( IAM: 권한을 부여하는 서비스. )
(aws의 서비스들은 각기 독립적으로 운영되기때문에 하나의 리소스에서 다른 리소스로 접근하기 위해서는 권한이 필요하다. 즉 code deploy가 ec2나 s3등을 이용하기 위해서는 이에대한 권한이 필요하다. )
어떤 aws 서비스가 해당 역할을 이용할 것인지 선택
code deploy에게 부여할 역할이므로 code deploy선택
1-2 code deploy 생성
ec2에 적용할 code deploy 어플리케이션 생성
AWS code deploy - 어플리케이션 - 어플리케이션 생성 - 이름, 플랫폼(EC2) 설정
1-3 code deploy에서 배포그룹 생성
code deploy - 어플리케이션 - 배포그룹 생성 - 배포그룹이름, 서비스 역할(방금생성한 code deploy역할), 환경구성(EC2 인스턴스 : 키: 밸류 ) , 로드밸런싱 비활성화
2. EC2에서 S3에 접근할 수 있는 권한 부여
권한부여: 정책생성 -> 역할생성 -> 특정 aws 서비스 어플리케이션에 장착
(하나의 역할은 여러개의 정책을 가질 수 있다.)
2-1 정책생성 (S3에 대한 접근권한, 조회권한 생성)
IAM 정책생성 - JSON - (코드) - 이름설정 - 생성
S3접근 권한 생성
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:Get*", "s3:List*" ], "Effect": "Allow", "Resource": "*" } ] }
2-2 역할생성
IAM 역할 생성 - AWS 서비스, EC2 - 정책추가(방금만든 정책) - 이름설정 - 역할생성
(ec2에게 부여할 역할이므로 ec2선택)
2-3 EC2 인스턴스에 역할부여
AWS ec2 인스턴스 - 작업 - 보안 - IAM 역할수정
2-4 ec2에 code deploy agent를 설치.
code deploy agent를 설치해야 ec2에서 code deploy가 준 것을 받을 수 있음.
ec2에서 code deploy agent 설치코드
sudo apt update && \ sudo apt install -y ruby-full wget && \ cd /home/ubuntu && \ wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install && \ chmod +x ./install && \ sudo ./install auto
code deploy agent가 정상실행 되고있는지 확인
systemctl status codedeploy-agent
3. 깃허브 액션에 권한 부여하기
aws 리소스가 다른 aws 리소스에 접근시에는 역할이 필요했다.
하지만 깃허브 액션은 aws의 외부 프로그램이므로 사용자를 만들어 권한을 부여해야한다.
여기서 깃허브 액션은 AWS code deploy와 AWS S3에 접근해야하므로 사용자를 생성해야한다.
3-1 깃허브 액션을 위한 사용자 생성하기
<IAM 사용자 생성 - 직접 정책 연결 - code deploy Full Access, S3 Full Access 정책 - 사용자생성>
3-2 깃허브 액션 사용자의 액세스 키 발급하기
<사용자 - 보안자격증명 - 액세스키 발급 - AWS 외부에서 실행되는 애플리케이션>
액세스키는 한번 보여지고 이후에는 볼 수 없으므로 따로 저장해놔야한다.
3-3 깃허브 레포지토리 환경변수 secret에 액세스 키, 시크릿 키 저장
깃허브 레포지토리 - setting - secrets - actions 에서 설정
4. AWS S3 생성
AWS S3 버킷 생성
(준비사항 끝)
Code Deploy와 github-actions를 적용한 CI/CD 구축 실행
1. appspec.yml, 스크립트 파일 작성하기
appspec.yml은 codeDeploy가 실행될 때 필수적으로 존재해야하는 파일이다.
codeDeploy는 이 설정 파일을 기반으로 실행된다.
appspec.yml
version: 0.0 os: linux files: # S3에 저장한 파일들 중 destination(AWS EC2)으로 이동시킬 대상을 지정한다. # / 이라고 지정하면 S3에 저장한 전체 파일을 뜻한다. - source: / # EC2의 어떤 경로에 저장할 지 지정한다. destination: /home/ubuntu/github-actions-practice permissions: - object: / owner: ubuntu group: ubuntu hooks: ApplicationStart: - location: scripts/start-server.sh timeout: 60 runas: ubuntu
scripts/start-server.sh
#!/bin/bash echo "--------------- 서버 배포 시작 -----------------" cd /home/ubuntu/github-actions-practice npm i pm2 kill pm2 start dist/main.js --name "backend-server" echo "--------------- 서버 배포 끝 -----------------"
2. Github Actions 코드 작성하기
.github/workflows/deploy.yml
name: Deploy To EC2 on: push: branches: - main jobs: deploy: runs-on: ubuntu-latest steps: - name: Github Repository 파일 불러오기 uses: actions/checkout@v4 - name: Node 설치 uses: actions/setup-node@v4 with: node-version: "20" - name: 의존성(라이브러리) 설치 run: npm ci - name: .env 파일 만들기 run: | touch .env echo '${{ secrets.ENV }}' >> .env - name: 테스트 코드 실행 run: npm run test - name: 빌드 run: npm run build - name: 압축하기 run: tar -czvf $GITHUB_SHA.tar.gz appspec.yml scripts dist .env package.json package-lock.json - name: AWS Resource에 접근할 수 있게 AWS credentials 설정 uses: aws-actions/configure-aws-credentials@v4 with: aws-region: ap-northeast-2 aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - name: S3에 프로젝트 폴더 업로드하기 run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.tar.gz s3://instagram-server/$GITHUB_SHA.tar.gz # code deploy에서 명령어로 배포 시작 # github-actions-practice 서버에 배포 # AllAtOnce한번에 교체 # Production 배포환경 # S3, 파일타입, 파일명 - name: Code Deploy를 활용해 EC2에 프로젝트 코드 배포 run: aws deploy create-deployment --application-name github-actions-practice --deployment-config-name CodeDeployDefault.AllAtOnce --deployment-group-name Production --s3-location bucket=github-actions-practice-bucket,bundleType=tgz,key=$GITHUB_SHA.tar.gz
3. codeDeploy가 잘 실행됐는 지 확인하기
이 경로에서 CodeDeploy가 실행시킨 스크립트 로그 파일을 볼 수 있다.
/opt/codedeploy-agent/deployment-root/{deployment-group-ID}/{deployment-ID}/logs/scripts.log
'devops > CICD' 카테고리의 다른 글
[CI/CD] 컨테이너 환경에서 CI/CD 구축하기(+code deploy 적용) (0) 2024.12.14 [CI/CD] 컨테이너 환경에서 CI/CD 구축하기 (0) 2024.12.13 [CI/CD] Github-Actions로 CI/CD 구축하기-2 개선 (0) 2024.12.04 [CI/CD] Github-Actions로 CI/CD 구축하기-1 (0) 2024.12.04 [Github-Actions] Github-Actions와 CI/CD 알아보기 (0) 2024.12.04