IaaS/퍼블릭클라우드

(AWS) CodePipeline을 활용한 EC2 소스 배포 자동화(with Cloud9, CodeCommit, CodeDeploy)

armyost 2021. 6. 13. 13:18
728x90

Cloud9을 활용하여 소스코드를 작성하고, CodeCommit을 활용하여 소스 코드의 버전을 관리하고 CodeDeploy를 통해 EC2에 소스를 배포하는 프로세스, CodePipeline를 이용해 프로세스를 자동화하는 방법에 대해 알아보자

 

서비스 역할 및 IAM 인스턴스 프로파일 생성

 

1. [서비스]-[보안자격증명 및 규정준수]-[IAM]을 클릭합니다. [사용자] 메뉴를 선택하고 [사용자 추가]버튼을 클릭합니다.

 

2. [사용자 추가] 화면에서 '사용자 이름'에 'DevOpsUser'입력 후 '엑세스 유형'에 '프로그래밍 방식 엑세스'를 선택하고 [다음] 버튼을 클릭합니다. 

 

3. [사용자 추가] 페이지에서 [기존 정책에 직접 연결] 버튼을 클릭합니다. '정책' 필터에 'AWScode'를 입력후 'AWSCodeCommitFullAccess'와 'AWSCodePipelineFullAccess'를 체크하고 [다음] 버튼 클릭, [태그]페이지에서 [다음]을 클릭합니다.

 

4. [사용자만들기] 버튼을 클릭합니다.

 

5. [사용자추가] 페이지에서 AWS CLI연결에 사용할 엑세스 키 ID와 비밀 엑세스 키를 PC에 저장하기 위해 [CSV다운로드] 버튼을 클릭하여 자격 증명을 PC로 다운로드 합니다. 

 

6. 사용자 계정 생성 후 [사용자] 메뉴에 생성된 계정을 클릭하여 설정화면으로 이동합니다.

 

7. 자격증명 설정을 변경하기 위해 [보안자격증명] 메뉴를 클릭합니다. 

 

8. 'AWS CodeCommit에 대한 HTTPS Git 자격 증명' 항목에서 [자격 증명 생성] 버튼을 클릭합니다. 

 

9. HTTPS Git 자격 증명 등록을 위해 [자격 증명 다운로드] 버튼을 눌러 사용자 이름과 비밀번호를 다운로드 합니다.

 

10. CodeDeploy 서비스를 위한 역할과, IAM 인스턴스 프로파일 생성을 위한 정책은 '배포 자동화-AWS CodeDeploy'실습 진행시 생성된 역할 과 정책을 그대로 사용하겠습니다. 

(CodeDeploy-ServiceRole, CodeDeployEC2-Permissions)

 

Cloud9과 CodeCommit 설정 및 소스 등록

1. [서비스]-[개발자도구]-[Cloud9]을 클릭합니다. [Cloud9]-[Your environment]메뉴를 클릭하여 이전 실습에서 사용했던 Cloud9 개발자 환경을 선택하고 'OpenIDE'를 클릭합니다. 이전에 작성된 Cloud9 콘솔이 없다면 [Create environments] 버튼을 클릭하여 신규로 생성합니다. 

 

2. 이전 IAM에서 생성한 계정에 AWS CLI에 대한 설정을 진행하기 위해 AWS Configure 명령어를 실행하고, 이전 IAM에서 'DevOpsUser'계정 생성 시 발급받은 AWS Access Key ID, Secret Access Key, Region 정보를 다음과 같이 입력합니다. 

 

ec2-user:~/environment $ sudo aws configure
AWS Access Key ID [None]: AKIAXX-------ANEH
AWS Secret Access Key [None]: 7KdvCab4d------------fvJkCoS8
Default region name [None]: us-east-1
Default output format [None]:

 

3. 터미널에서 Git을 사용하여 git config를 실행합니다. 이때 AWS 자격 증명 프로필로 Git 자격 증명 헬퍼가 경로를 리포지토리로 전송할 수 있도록 합니다. 

ec2-user:~/environment $ sudo git config --global credential.helper '!aws codecommit credential-helper $@'
ec2-user:~/environment $ sudo git config --global credential.UseHttpPath true

 

4. CodeCommit 리포지토리 생성하기 위해 CodeCommit 콘솔로 이동 후 [리포지토리 생성] 버튼을 클릭합니다. 

 

5. [리포지토리생성] 페이지에서 '리포지토리 이름'에 'devops-sample'입력 후 [생성] 버튼을 클릭합니다. 

 

6. 리포지토리가 생성된 후 [URL 복제] 버튼을 클릭하고 [HTTPS 복제] 버튼을 클릭합니다. 

 

7. 다시 Cloud9 콘솔로 이동하여 다음과 같이 명령어를 입력하여 CodeCommit 리포지토리를 복제합니다. 

$git clone https://git-codecommit.us-east-1.amazonaws.com/v1/repos/devops-sample

 

8. 메뉴에서 'devops-sample' 폴더에 마우스 오른쪽 버튼 클릭 후 'New File'을 클릭하여 파일명을 'index.html'로 생성하고 다음의 HTML 소스를 Cloud9 작성 창에 입력 후 저장합니다. 

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Sample Deployment</title>
  <style>
    body {
      color: #ffffff;
      background-color: #0188cc;
      font-family: Arial, sans-serif;
      font-size: 14px;
    }
    h1 {
      font-size: 500%;
      font-weight: normal;
      margin-bottom: 0;
    }
    h2 {
      font-size: 200%;
      font-weight: normal;
      margin-bottom: 0;
    }
  </style>
</head>
<body>
  <div align="center">
    <h1>Congratulations</h1>
    <h2>This application was deployed using AWS CodeDeploy.</h2>
    <p>For next steps, read the <a href="http://aws.amazon.com/documentation/codedeploy">AWS CodeDeploy Documentation</a>.</p>
  </div>
</body>
</html>

 

9. devops-sample 폴더에 appspec.yml 파일을 생성하고 appspec 정보를 등록하여 저장합니다. 

version: 0.0
os: linux
files:
  - source: /index.html
    destination: /var/www/html/
hooks:
  BeforeInstall:
    - location: scripts/install_dependencies
      timeout: 300
      runas: root
    - location: scripts/start_server
      timeout: 300
      runas: root
  ApplicationStop:
    - location: scripts/stop_server
      timeout: 300
      runas: root

10. 'devops-sample'폴더 하위에 'scripts'폴더를 생성합니다. 다음의 내용을 참조하여 'start_server', 'stop_server', 'install_dependencies' 파일을 생성하고 저장합니다.

 

파일명: ./scripts/install_dependency

#!/bin/bash
yum install -y httpd

 

파일명: ./scripts/start_server

#!/bin/bash
service httpd start

 

파일명: ./scripts/stop_server

#!/bin/bash
isExistApp = `pgrep httpd`
if [[ -n  $isExistApp ]]; then
    service httpd stop        
fi

11. 작성된 소스 파일을 CodeCommit에 등록하기 위해 'git add'와 'git status'를 통해 등록상태를 확인합니다. 

ec2-user:~/environment $ cd /home/ec2-user/environment/
ec2-user:~/environment $ cd devops-sample
ec2-user:~/environment/devops-sample (master) $ git add .
ec2-user:~/environment/devops-sample (master) $ git status

 

12. 'git commit', 'git push'명령을 통해 소스를 CodeCommit으로 전송합니다.

ec2-user:~/environment/devops-sample (master) $ git commit -m  "devops sample source commit"
ec2-user:~/environment/devops-sample (master) $ git push

 

13. CodeCommit 콘솔로 이동하여, 리포지토리에서 'devops-sample'을 클릭하여 Cloud9에서 작성된 코드가 정상적으로 CodeCommit으로 전송됨을 확인합니다. 

 

EC2생성과 CodeDeploy 배포 그룹 생성

1. EC2 인스턴스로 이동 후 [인스턴스] 메뉴를 선택하고 [인스턴스 시작] 버튼을 클릭합니다.

 

2. [AMI 선택] 페이지에서 'Amazon Linux AMI'의 선택 버튼을 클릭합니다. 

 

3. [인스턴스 유형 선택]페이지에서 't2.micro' 타입 선택 후 [다음] 버튼을 클릭합니다.

 

4. [인스턴스 세부정보 구성]페이지에서 '네트워크', '서브넷'을 Default로 설정하고, IAM 약할을 이전 IAM에서 생성한 인스턴스 프로파일 역할인 'CodeDeployEC2-permissions'를 선택하여 하단으로 이동합니다. 

 

5. '고급 세부 정보'에서 CodeDeploy Agent 자동 설치를 위해 '사용자 데이터' 항목에 다음의 내용을 등록하고 [다음] 버튼을 클릭합니다. 선택한 리전이 다른 경우 본인의 서비스 리전을 확인하여 다운로드 주소를 수정하기 바랍니다.

#!/bin/bash
yum -y update
yum install -y ruby  //루비로 어플리케이션을 올릴거라서 인스톨을 초기화 과정에서 돌립니다.
cd /home/ec2-user
curl -O https://aws-codedeploy-ap-northeast-2.s3.amazonaws.com/latest/install -k //CodeDeploy 플러그인을 설치하는 과정입니다.
chmod +x ./install
sudo ./install auto

 

6. [스토리지 추가] 페이지에서 [다음] 버튼을 클릭합니다. 

 

7. [태그 추가] 페이지에서 '키'에 'Name', '값'에 'CodeDeploy' 입력 후 [다음] 버튼을 클릭합니다.

※ 쿠버네티스에서 테인트 같은 역할의 환경변수 이다.

8. [보안 그룹 구성] 페이지에서 [규칙 추가] 버튼을 클릭하고 '포트 범위'에 '80', '원본'에 '위치무관'을 선택하여 [검토 및 시작] 버튼을 클릭합니다.

 

9. [기존 키 페어 선택] 페이지에서 '기존 키 페어 선택' 후 이전에 생선한 키 페어를 선택하고 체크하여 [인스턴스 시작] 버튼을 클릭합니다. 

 

10. AWS Console에 접속 후 메뉴에서 [서비스]-[개발자도구]-[CodeDeploy]를 클릭합니다. [애플리케이션] 메뉴를 선택하고 [애플리케이션 생성] 버튼을 클릭합니다.

 

11. [애플리케이션 생성] 페이지에서 '애플리케이션 이름'에 'devops-codedeploy-sample' 입력하고 '컴퓨팅 플랫폼'은 'EC2/온프레미스'를 선택 후 [애플리케이션 생성] 버튼을 클릭합니다. 

 

12. '배포그룹' 탭에서 [배포 그룹 생성] 버튼을 클릭합니다.

 

13. [배포 그룹 생성] 페이지에서 '배포 그룹 이름'에 'devops-codedeploy-sampledg'입력하고, '서비스 역할'은 이전에 생성한 IAM 서비스 역할명인 'CodeDeploy-ServiceRole'선택, '배포 유형'을 '현재 위치(In-Place)'로 선택하고 하단 페이지로 이동합니다. 

 

14. '환경 구성' 항목에서 배포 대상으로 'Amazon EC2 인스턴스'를 선택하고 '태그 그룹 1'항목의 '키'에 'Name', '값'에 'CodeDeploy' 입력 후 [배포그룹생성] 버튼을 클릭합니다. 

※ 앞서 정의한 EC2인스턴스의 태그가 해당 환경변수에 해당되어 대상이 된다.  

 

CodePipeline과 CodeDeploy 배포를 활용한 배포 파이프라인 구현

 

1. [개발자 도구] - [CodePipeline]을 클릭하여 'CodePipeline'으로 이동합니다. [파이프라인] 메뉴를 선택하고 [파이프라인생성] 버튼을 클릭합니다. 

 

2. [파이프라인 설정 선택] 페이지에서 '파이프라인 이름'에 'devops-codepipeline-sample' 입력 후 '서비스 역할'은 '새서비스 역할'을 선택하고 하단의 [다음] 버튼을 클릭합니다. 

 

3. [소스 스테이지 추가] 페이지에서 '소스 공급자'에 'AWS CodeCommit', '리포지토리 이름'에 'devops-sample', '브랜치 이름'에 'Master' 선택 후 [다음] 버튼을 클릭합니다. 

 

4. [빌드 스테이지 추가] 페이지에서 [빌드 스테이지 건너뛰기] 버튼을 클릭하고 팝업창에서 [건너뛰기]를 클릭합니다. 

 

5. [배포 스테이지 추가] 페이지에서 '배포 공급자'에 'AWS CodeDeploy', '애플리케이션 이름'에 'devops-codedeploy-sample', '배포 그룹'에 'devops-codedeploy-sample-dg'선택후 [다음]을 클릭합니다.

 

6. 등록된 파이프라인의 전체 내용을 검토 후 [파이프라인 생성] 버튼을 클릭합니다.

 

7. 파이프라인이 정상적으로 등록되고 단계별로 작업 수행을 완료한 후 다음과 같이 완료 메시지가 출력됩니다.

 

8. EC2 인스턴스로 이동 후 이전에 생성한 인스턴스의 'IPv4 퍼블릭 IP'를 확인하여 IP를 복사합니다.

 

9. 웹브라우저를 통해 EC2인스턴스의 IP로 호출하면 웹 페이지가 출력되을 확인할 수 있습니다. 

 

10. 변경된 소스의 자동 반영 확인을 위해 Cloud9으로 이동후 index.html파일에 수정을 합니다.

 

11. 그리고 CodeCommit으로 Push 진행 후 Codepipeline으로 이동하면 코드가 자동으로 배포 진행됨을 확인할 수 있습니다.

 

※ 아래와 같이 Push로 변경사항이 발생하면 자동으로 Pipeline이 수행됩니다.