[Hands On] CodePipeline으로 CI/CD 구축

개발한 파이썬 스크립트를 CodeCommit 레포지토리에서 관리하고, 변경발생시 EC2 경로에 CodeDeploy로 배포되는 자동화된 간략한 CI/CD인 CodePipline을 구성해봅니다. 

01. 퍼블릭 접속이 가능한 EC2 인스턴스 생성

1.EC2 콘솔에서 인스턴스 시작 버튼을 클릭합니다. 

2. 인스턴스 이름을 입력합니다. 추가 태그 추가를 클릭합니다.

3. 태그를 구성합니다.

4. Quick Start에서 Amazon Linux  AMI를 선택합니다.

5. 인스턴스 유형을 t3.xlarge로 선택합니다. 데이터 플랫폼 AI연동 아키텍쳐 구성시 고려사항에 기반하여 선택하였습니다.

6. 인스턴스 유형 비교 목록을 참고하여 선택가능합니다.

7. 인스턴스 SSH 접속시 사용할 키페어를 생성합니다.

8. 키페어 이름을 입력합니다. 키페어 유형은 RSA, 프라이빗 키 파일 형식은 .pem 을 선택하고  생성해줍니다.

9. 키페어 .pem파일이 로컬환경에 다운로드 되어집니다. 로컬환경에서 SSH 접속시 사용해야 함으로 잘 보관해 둡니다.

  • PEM(Privacy Enhanced Mail) : 키 및 인증서 인코딩을 위한 base64 컨테이너 형식입니다.
  • PPK(Putty Private Key): Windows ssh 클라이언트이며 .pem 형식을 지원하지 않습니다. 따라서 PuTTyGen을 사용하여 .ppk 형식으로 변환해야 합니다.

10. VPC를  [Hands On] 퍼블릭 주소 연결을 위한 VPC 구성하기 에서 생성해준 VPC를 선택합니다.

11. VPC내에 퍼블릭 통신이 가능한 서브넷을 선택합니다.

12. 퍼블릭 IP 자동할당을 활성화 합니다.

13. 방화벽(보안그룹) 또한 기존 보안 그룹 선택을 체크한 후 일반 보안 그룹 목록에서 사전에 생성해 둔 보안그룹을 선택합니다.

14. 스토리지 구성의 볼륨크기를 BULK API 데이터 다운로드를 고려하여 설정하였습니다.

15. 인스턴스를 시작합니다.

02. 로컬환경에서 EC2를 SSH로 접속하기

저는 로컬환경에 putty 프로그램이 사전에 다운로드 되어있어서 이를 통해 SSH 접속을 하였습니다.

putty 접속을 위해 위에서 EC2인스턴스를 생성시 만들어둔 키페어 .pem 파일을 .ppk 파일로 변환을 합니다. putty를 통해 접속시 필요합니다.

1. Putty Key Generator 프로그램에서 Load 버튼을 클릭하여 위에서 인스턴스 생성시 생성한 키파일.pem 파일을 불러옵니다.

2. Generate된 키를 RSA 타입을 선택하여 Save private key 버튼을 클릭하여 .ppk파일로 로컬환경에 저장합니다.

3. putty 프로그램을 실행하여 Configuration에서 HostName을 위에서 생성한 인스턴스의 퍼블릭 IP4 주소의 연결세션을 생성합니다.

4. Connection – SSH – Auth 메뉴를 선택하여 Private key file for authentication에서 로컬에 위에서 저장한 .ppk 파일을 로딩하여 접속합니다. 

5. login as : 에 ec2-user를 입력하면 접속이 성공함을 터미널에서 확인 가능합니다.

03. CodeCommit에 리포지토리 등록하기

API 연동 및 데이터 집계 배치 구성시 파이썬 코드 개발이 진행되었고, 이 코드들을 전달할 서비스로 CodeCommit을 사용해보게 되었습니다. 

<리포지토리 생성>

1. CodeCommit 콘솔에서 리포지토리 생성버튼을 클릭합니다.

2. 리포지토리 이름, 설명, 태그를 입력하고 생성합니다.

3. 생성된 리포지토리의 URL 복제 드롭다운 버튼을 클릭하여 HTTPS 복제를 합니다.

4. 리포지토리에 이미 등록되어 있는 소스파일들을 로컬 리포지토리에 복제시에는 3단계에 언급된 명령을 사용하시면 됩니다.

<IAM 권한 생성>

1. IAM 콘솔에서 CodeCommit 권한을 줄 사용자를 선택합니다.

2. 권한 추가 버튼을 클릭합니다.

3. 기존 정책 직업 연결을 선택하고AWSCodeCommitPowerUser 권한을 부여합니다.

4. 사용자의 보안 자격 증명 탭으로 이동합니다.

5. AWS CodeCommit에 대한 HTTPS Git 자격 증명 부분의 자격 증명 생성 버튼을 클릭합니다.

6. 자격 증명이 활성화 되고, .csv 파일로 로컬환경에 자격증명을 다운로드 해놓을 수 있습니다. 초기 생성시에만 다운로드가 가능합니다.

<Git 명령으로 리포지토리 접근>

1.Git 클라이언트를 로컬에 설치합니다. 

2. 제 환경에는 이미 다른 AWS 계정에 CodeCommit 레포지토리로 소스를 업로드 했던 이력이 있어 새로 생성한 환경에 업로드가 안되는 문제가 있었습니다.

git init 도 해보고 git config도 재설정해봐도 실패가 났고 여러가지 트러블슈팅 끝에 윈도우 환경에 자격증명이 저장되어 있는것을 확인하였습니다.

 

3. 제어판에서 자격증명관리자로 이동합니다.

4. 일반 자격증명에서 https://git-codecommit.ap-northeast-2.amazonaws.com에 대해 저장되어있는 자격증명을 제거합니다.

5. 또는 뒤늦게 안 방법이지만 아래와 같이 터미널에서 명령을 입력해주면 자격증명을 묻지 않습니다.

git config –global credential.helper ‘!aws codecommit credential-helper $@’
git config –global credential.UseHttpPath true

6. 저장소로 사용하고자 하는 디렉터리로 이동합니다.

7. git init 명령으로 저장소를 초기화합니다.

8. 제 환경에서는 이미 이전에 작업한 원격 URL 정보가 저장되어있어 git remote remove origin 명령으로 제거해줬습니다.

9. git add시 원격 URL에 업로드하길 원하지 않는 파일들에 대해서는 .gitignore 파일에 추가해 줍니다.

10. git add  명령으로 변경 내용을 스테이징 영역(staging area)에 추가합니다.

11. git status 명령으로 git에 의해 관리되는 파일들의 가능한 상태(status)에 대해 확인합니다. – 제 환경에서는 이미 로컬 레포지토리에 모두 커밋되어있는 상태라 아무런 정보도 출력되지 않았습니다.

12. git commit 명령으로 로컬 레포지토리에 반영합니다.

13. git push –set-upstream origin master 명령으로 원격 저장소에 푸시합니다. 이과정에서 Get Credential Manager 팝업이 뜨며,  위에 IAM 설정시 생성한 AWS CodeCommit에 대한 HTTPS Git 자격 증명을 이용하여 인증합니다.

 

14. 원격저장소에 업로드 되는 진행과정을 확인가능합니다.

15. CodeCommit 콘솔에서 생성한 리포지토리에 정상적으로 업로드 된 정보를 확인 가능합니다.

15. 이미 업로드 되어있는 CodeCommit 리포지토리를 로컬에 다운로드 받을 경우에는 위에 IAM 권한 생성 후  git clone <저장소 URL> 명령을 수행하면 됩니다.

04. appspec.yml

CodeCommit 리포지토리 최상위 경로에 appspec.yml 파일을 생성하여 배포진행과정에 필요한 작업을 정의합니다.

05. CodeDeploy 설정하기

<IAM 권한 생성>
A. EC2에 CodeDeploy 접근 권한 설정

1.IAM콘솔에서 역할만들기를 클릭합니다.

2. 신뢰할 수 있는 엔터티 유형으로 AWS 서비스를 선택, 사용사례로는 EC2를 선택하고 다음을 클릭합니다.

3. 권한 추가에서 AmazonEC2RoleforAWSCodeDeploy를 추가하고 다음을 클릭합니다.

4. 역할이름을 부여하고 태그를 구성합니다.

5. EC2 인스턴스 콘솔에서 CodeDeploy를 연결할 인스턴스를 선택하여 우측 상단 작업 드롭다운을 클릭하여 보안 > IAM 역할 수행 메뉴로 진입합니다.

6. IAM역할에 생성한 역할을 추가해줍니다.

B. CodeDeploy 역할 생성

1.IAM콘솔에서 역할만들기를 클릭합니다.

2. 신뢰할 수 있는 엔티티 유형에서 AWS 서비스를 선택, 사용사례에서는 CodeDeploy를 선택합니다.

3. 역할이름 및 태그를 추가하고 역할을 생성합니다.

<CodeDeploy 애플리케이션 생성>

1.CodeDeploy콘솔 애플리케이션 메뉴에서 애플리케이션 생성 버튼을 클릭합니다.

2. 애플리케이션 이름을 입력하고 컴퓨팅 플랫폼을 EC2/온프레미스로 선택합니다.

3. 애플리케이션을 생성합니다.

<CodeDeploy 배포그룹 생성>

1.생성한 애플리케이션 선택화면에서 배포그룹생성 버튼을 클릭합니다.

2. 배포그룹 이름을 입력합니다.

3. 서비스 역할에 위에서 생성한 CodeDeploy 역할이름을 선택합니다.

4. 배포유형을 현재위치를 선택합니다.

5. 환경구성에서 배포대상으로 Amazon EC2 인스턴스를 체크합니다.

6. 태그 구성에서 위에서 생성한 인스턴스이름을 추가합니다. 태그와 매칭되는 인스턴스에 배포되어집니다.

7. AWS Systems Manager를 사용한 에이전트 설치에 안함을 체크합니다.  저는 배포될 인스턴스에 수동으로 CodeDeploy 에이전트를 설치했습니다.

8. 배포설정에서 배포구성을 CodeDeployDefault.OneAtATime로 선택합니다. 한 번에 한 인스턴스에만 애플리케이션을 배포합니다.

8. 로드밸런싱을 활성화하지 않습니다.

9. 배포그룹을 생성합니다.

06. EC2 CodeDeploy 에이전트 설치하기

1. EC2인스턴스에 SSH 터미널로 접속합니다.

2. root 계정으로 변경합니다. sudo su –

3. ruby를 설치합니다. yum install -y ruby

4. aws cli를 설치합니다. yum install -y aws-cli

Amazon Linux AMI로 인스턴스를 설치한 관계로 aws-cli가 이미 설치되어 있습니다.

5. 설치파일을 저장할 디렉토리로 이동합니다.  cd /home/ec2-user

6. CodeDeploy 에이전트 설치파일을 다운로드 합니다.  wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install

7. 다운로드 받은 설치 파일에 실행권한을 부여합니다.  chmod +x ./install

8. 에이전트를 설치합니다.

07. CodePipeline으로 CI/CD 구성하기

CodePipeline을 설정하여 위에 구성해 놓은 CodeCommit, CodeDeploy를 기반으로 CI/CD를 구축합니다.

1. CodePipeline콘솔에서 파이프라인 생성 버튼을 클릭합니다.

2. 파이프라인 이름을 입력하고 서비스 역할에 새 서비스 역할을 선택, 역할 이름을 부여합니다. 다음 버튼을 클릭합니다.

3. 소스 스테이지 추가화면에서 소스 공급자를 AWS CodeCommit을 선택합니다.

4. CodeCommit에 생성한 리포지토리 이름을 선택하고 브랜치를 선택합니다. 다음을 클릭합니다.

5. 다른 사항들은 기본값을 유지합니다.

6. 빌드 스테이지 추가 단계가 나오면 빌드 스테이지 건너뛰기 버튼을 클릭합니다. 파이썬 스크립트로만 구성된 리포지토리임으로 별도의 빌드 작업이 필요하지 않습니다.

7. 배포 공급자에서 AWS CodeDeploy를 선택합니다.

8. CodeDeploy 설정시 생성했던 애플리케이션 이름과 배포그룹을 선택합니다.

9. 다음 버튼을 클릭합니다.

10. 검토내용을 확인 후 파이프라인 생성 버튼을 클릭합니다.

11. EC2로 CodeCommit의 리포지토리가 복제되어집니다.

* 위 구성들로 인해 CodeCommit 리포지토리에 변경사항이 발생할때마다 자동배포가 실행되어집니다.