본문 바로가기
공부/CI & CD

GiftFunding) GitHub Actions CI/CD 적용하기[2] - CD 적용(1)

by son_i 2024. 6. 29.
728x90

지난 포스팅에서 CI 를 적용해서 main 브랜치로 PR 요청 시 빌드(+ 테스트)를 자동으로 실행하도록 하였다.

GiftFunding) GitHub Actions CI/CD 적용하기(1) - CI 적용 (tistory.com)

 

GiftFunding) GitHub Actions CI/CD 적용하기(1) - CI 적용

GitHub Actions란 SW 개발 라이프 사이클 안에서 PR, Push 등의 이벤트 발생에 따라 자동화된 작업을 진행할 수있게 해주는 기능. 자동화된 작업이 필요한 경우 ?1. CI/CD   로컬 repository -> 원격 repository

soni-developer.tistory.com

 

요번엔 CD를 통해 배포까지 해보려고 한다 !

글이 너무 길어져서 나누려고 하는데 이 포스팅에서는 AWS에 IAM user, role등을 생성하고 할당해주는 작업을 해보려고한다 !

 


[CI/CD 적용 전 배포 프로세스]

 

Local 소스코드 작업 -> GitHub PR & Merge -> AWS EC2 접속 -> GitHub pull -> build -> Deployment 로 이어진다.

 

소스코드 작업이 완료되면 PR을 거쳐 merge 한다. 

merge 시엔 어떠한 테스트도 수행되지 않는다.

EC2에 직접 접속해서 병합된 소스코드를 pull 하고 build하여 직접 배포를 수행해야한다.

 

 

[CI/CD 적용 후 배포 프로세스]

 

Local 소스코드 작업 -> GitHub PR & Merge -> CI/CD Pipeline

                  기존 작업과 동일

 

PR후 Merge과정까진 동일.

이후 EC2 접속, pull, build, Deployment 까지의 단계가 CI/CD pipeline 이라는 단계로 대체된다.

 

pipeline을 통해 과정들이 자동화 되기 때문이다.

Merge 혹은 push 이벤트가 발생하면 새로운 소스코드는 자동으로 EC2에서 배포된다.


EC2에 직접 접속해서 병홥된 소스 코드를 pull 하고 Docker Image 파일을 빌드해서 컨테이너로 배포한다.

이 수동적으로 일어나는 작업을 파이프라인을 통해 자동화 해보려고 한다.

 

Merge / Git Push 발생 시 새로운 소스코드는 자동으로 EC2에서 배포 될 것이다.

 

작업 과정

1. S3 버킷 생성

 - Amazon S3 -> 버킷 -> 버킷 만들기

 

Code를 AWS에 옮기기 위해 AWS Object Storage인 S3 버킷을 생성한다.

 

버킷이름과 지역을 설정한다.

 

ACL 비활성화 / 퍼블릭 액세스 차단

- 버킷과 GitHub Actions, 버킷과 EC2 간 연결은 Credentials와 내부 네트워크의 사용을 위해 별도 권한을 설정해줄 것이라서 문제가 되지 않는다.

 

나머지는 기본 설정으로 버킷을 생성한다.

 

2. I AM  사용자 생성 (GitHub Actions가 S3, CodeDeploy에 대한 권한을 갖도록)

Actions Runner를 aws 서비스에 접근 가능한 상태로 만들기 위해 AWS 계정에 대한 ACCESS TOKEN이 필요하다.

 

a. GitHub Actions는 소스코드를 S3 버킷에 업로드하고, 

b. CodeDeploy의 특정 배포 그룹에 대한 배포 요청을 전달해야 함.

 

이를 위해서 권한이 필요하고, 해당 권한을  가진  IAM  사용자를 생성해서 Actions가 인증해 권한을 사용할 수 있도록

사용할 서비스인 S3와 CodeDeploy에 대한 모든 권한을 허용해줘야 한다.

 

* ACCESS TOKEN만 있으면 되기 때문에 console 액세스 권한은 필요 없다.

 

2-1)  IAM 사용자 추가

- AWS IAM -> 사용자 -> 사용자 생성

 

AccssToken만 있으면 되기 때문에 Console 액세스 권한은 없어도 된다.

 

  • IAM 사용자 권한 부여
    •   권한 옵션은 직접 정책 연결을 선택.
    •   두 가지 권한을 할당하여 해당 서비스에 대한 모든 권한을 부여.
      • AWSCodeDeployFullAccess
      • AmazonS3FullAccess

 

2-2)  IAM 사용자 프로그래밍 방식 액세스 키 생성

- 2-1에서 생성한 사용자 클릭 ->  보안 자격 증명 -> 액세스 키 -> 액세스 키 만들기

 

 

 

 

  • 액세스 키 모범 사례 및 대안
    • AWS 외부에서 실행되는 애플리케이션 선택

 

태그 설정하고 액세스 키 생성

 

발급된 액세스 키를 .csv 파일로 저장.

(완료 버튼 누르면 키 값을 다시 볼 수 없음)

 

==> 위 과정을 통해 생성된 액세스 키는 GitHub Actions의 사용자 인증 정보로 활용됨.

 

2-3) GitHub Repository Secrets 액세스 키 저장

 

GitHub Actions가 CD 프로세스 내에서 위에서 만든 키를 사용해 인증하기 위해 GitHub Repository Secrets에 키를 저장해야함. (저장하는 키 : IAM 사용자 액세스 키 ID, 비밀 액세스 키)

 

- GitHub 접속 -> Repository -> Settings -> Secrets and variables -> Actions -> New repository secret

 

 

- AWS_ACCESS_KEY_ID : 액세스 키 ID

- AWS_SECRET_ACCESS_KEY : 비밀 액세스 키

(.csv 파일에서 확인)

 

3. I AM  역할 생성 및 EC2에 연결 (EC2 인스턴스가 S3, CodeDeploy에 권한을 갖도록)

EC2는 CodeDeploy를 통해 S3 버킷에 업로드 된 소스파일을 가져와 배포하게 된다.

 

이를 위해 CodeDeploy와 S3 버킷에 모두 접근할 수 있는 IAM 역할을 생성하여 EC2에 부여해주어야 한다.

 

3-1) IAM 생성

- AWS IAM -> 역할 -> 역할 생성

사용사례 EC2 선택 후 다음

역할 이름 생성하고

 

AmazonS3FullAccess

AWsCodeDeployFullAccess

권한 추가

 

 

3-2) EC2에 IAM 연결

3-1에서 생성한 IAM 역할을 EC2인스턴스와 연결한다.

 

- AWS EC2 -> 인스턴스 -> 인스턴스 선택 -> 작업 -> 보안 -> IAM 역할 수정 -> 만들어준 역할 선택

 

-> 이 작업으로 EC2 인스턴스는 CodeDeploy와 S3에 대한 Full Access 권한을 가짐.

 

4. AWS CodeDeploy 애플리케이션 생성 + IAM role 생성 (CodeDeploy가 EC2 내부에서 배포 작업을 수행할 수 있도록)

CodeDeploy 애플리케이션을 생성하고, IAM 역할을 할당해줘야 한다.

 

4-1) CodeDeploy IAM 역할 생성

- AWS IAM -> 역할 -> 역할 생성

 

CodeDeploy 선택 후 다음

 

자동으로 권한이 체크되어 있다.

 

3, 4에서 만든 iam role

 

4-2) CodeDeploy 애플리케이션 생성

- AWS 콘솔 -> CodeDeploy 검색 -> 어플리케이션 -> 어플리케이션 생성

 

  • 애플리케이션 생성

애플리케이션 이름과 컴퓨팅 플랫폼 EC2/온프레미스로 설정

 

  • 배포 그룹 생성

- 생성된 CodeDeploy 어플리케이션 클릭 -> 배포 그룹 -> 배포 그룹 생성

 

서비스 역할에는 앞서 생성한 CodeDeploy IAM 역할을 할당.

위 역할을 바탕으로 CodeDeploy 애플리케이션은 EC2 내부에서 배포 작업을 수행할 수 있게 됨.

 

배포 유형 현재 위치로 설정

 

 

환경 구성에는 Amazon EC2 인스턴스 선택

태그 그룹의 키는 Name으로 선택하고, 값은 배포 대상 EC2 인스턴스 선택

 

배포 구성은 애플리케이션 배포를 어떻게 수행할 지에 대한 선택.

AllAtOnce는 한 번에 모든 인스턴스를 배포함.

로드 밸런서를 사용하고 있지 않기 때문에 체크를 해제함. 만약 사용 중이라면 활성화 체크하고 대상 그룹 선택.

 

 

5. EC2 CodeDeploy-Agent 설치

CodeDeploy가 S3 버킷에 업로드 된 코드를 EC2의 특정 위치에 배포하기 위해서는 배포 대상 EC2에 codedeploy-agent가 설치 돼있어야 함.

 

* CodeDeploy Agent - EC2에 설치해서 계정, 배포기록, 배포 스크립트 등을 EC2 루트 디렉토리에 저장.

* Appspec.yml - OS, Files, permission, hook를 포함하고 있는 yaml 파일.

                          Codedeploy-agent에게 배포, 실행파일들의 순서, 경로 알려주는 역할.

 

EC2 SSH에 접속하여 Code deploy agent 설치. 현재 EC2 인스턴스에 codedeploy-agent 설치.

  해당 프로그램은 CodeDeploy로부터 명령을 받아 직접 빌드 파일 다운로드 및 배포 스크립트 실행 과정 수행.

 

 

SpringBoot로 API 테스트를 위해 테스트 환경 세팅

//JDK 설치
$ yum list | grep java-1.8

$ sudo yum install java-1.8.0-amazon-corretto.x86_64

 

이후 yum 을 이용해 codedeploy-agent 설치.

codedeploy-agent는 ryuby로 동작하기 때문에 ruby의 설치가 선행되어야 한다.

 

* yum ?) Yello dog Updater, Modified의 약자로 RPM 기반의 시스템을 위한 자동 업데이트 겸 패키지 설치/제거 도구

 

   yum list : 저장소 서버에 있는 모든 패키지 목록 확인

   grep : 특정 문자열이 포함된 파일을 보여주는 리눅스 명령어

   yum install [패키지명] : 패키지 설치. -y 옵션 붙이면 [y/n] 선택 없이 all yes로 명령어 실행.

 

* wget ?) 웹 서버로부터 콘텐츠를 가져오는 컴퓨터 프로그램. HTTP, HTTPS, FTP 프로토콜을 통해 내려받기 지원.

 

$ sudo yum -y update
$ sudo yum -y install ruby
$ sudo yum -y install wget

으로 패키지 업데이트를 진행하고 ruby와 wget을 설치한다.

 

$ mkdir build
// build 디렉토리 안에 빌드 파일들을 다운로드 할 것이라 build 디렉토리도 생성해줌.

cd /home/ec2-user

// wget을 통해 codedeploy-agent 파일 내려받기
$ wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install

// 권한 변경 후 설치
$ sudo chmod +x ./install   // +x는 모든 사용자에 대해 실행권한 부여
$ sudo ./install auto

// 설치 후 실행되었는지 확인
$ sudo service codedeploy-agent status

$ sudo service codedeploy-agent start

 

AWS에서 해줘야 할 각종 세팅이 끝났다. 

 

과정 정리

1. S3 버킷 생성 : jar(.zip)파일 업로드 하기 위해서

2. IAM user 생성 후 액세스 키 GitHub Repository Secrete Access key에 저장
    : GitHub Actions가 S3, CodeDeploy에 대한 권한을 갖도록 함
   - GitHubActions는 S3에 소스코드를 업로드 하고, CodeDeploy에 배포요청을 전달하는 역할을 하기 때문.

3. IAM Role 생성 후 EC2 인스턴스에 연결
    : EC2 인스턴스가 S3, CodeDeploy에 대한 권한을 갖도록 함.
   - EC2는 S3에 업로드된 소스코드를 CodeDeploy를 이용해 배포하게 됨.

4. CodeDeploy 애플리케이션 생성 + IAM role 생성
    :  CodeDeploy 권한 부여
   - 애플리케이션이 EC2내부에서 배포 작업을 수행할 수 있게 됨.

5. CodeDeploy-Agent 설치
    : CCodeDeploy가 S3 버킷에 업로드 된 코드를 EC2의 특정 위치에 배포하기 위해서는 배포 대상 EC2에 codedeploy-agent가 설치 돼있어야 함.

 

 

과정에 이어서 다음 포스팅에서는 workflow.yml, appspec.yml, deploy.sh를 작성하는 과정을 정리했다 !

 

GiftFunding) GitHub Actions CI/CD 적용하기[2] - CD 적용(2) (tistory.com)

 

GiftFunding) GitHub Actions CI/CD 적용하기[2] - CD 적용(2)

이전 AWS 설정에 이어 CD를 위한 WorkFlow.yml, appspec.yml, deploy.sh 파일 작성 6. CD_WorkFlow.yml에 배포 동작 추가name : Java CDon: push: branches: [ "main" ]env: PROJECT_NAME: giftfunding_project #프로젝트 이름 설정. S3 경로

soni-developer.tistory.com