IaaS/퍼블릭클라우드

(AWS) CI/CD를 위한 AutoScaling, Cloud9과 CodeDeploy로 구현

armyost 2021. 6. 12. 12:23
728x90

EC2를 AutoScaling하여 사용량에 맞추어 유연하게 대응하고, CI/CD개념을 적용하여 탑재되어있는 어플리케이션을 손쉽게 Deploy하는 예제이다.

 

 

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

1. AWS Console에 접속 후 메뉴에서 [서비스] - [보안, 자격 증명 및 규정준수] - [IAM] 을 클릭합니다. [IAM] 메뉴에서 '역할' 클릭 후 [역할 만들기] 버튼을 클릭합니다.

 

2. [역할 만들기] 페이지에서 'AWS 서비스'를 선택하고 [사용 선례 선택] 메뉴에서 'CodeDeploy'를 선택합니다.

 

3. '사용 사례 선택' 항목에서 'CodeDeploy' 선택 후 [다음] 버튼을 클립합니다.

 

4. '권한 정책 연결' 항목에서 '권한 경계없이 role생성' 선택후 [다음] 버튼 클릭, [태그 추가] 페이지에서 [다음] 버튼을 클릭합니다. 

 

5. [검토] 페이지에서 '역할 이름'에 'CodeDeploy-ServiceRole' 입력 후 [역할 만들기] 버튼을 클릭합니다.

 

6. 역할 생성 완료 후 'CodeDeploy-ServiceRole' 역할을 클릭합니다.

 

7. 신규 생성한 역할이 AWS CodeDeploy에서 제공되는 모든 엔드포인트에 접속하기 위해 정책 수정이 필요합니다. '신뢰 관계' 탭에서 [신뢰관계편집] 버튼을 클릭합니다.

 

8. [신뢰 관계 편집] 페이지에서 다음의 정보를 추가하고 [신뢰 정책 업데이트] 버튼을 클릭하여 정책을 업데이트 합니다.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "codedeploy.us-east-2.amazonaws.com",
                    "codedeploy.us-east-1.amazonaws.com",
                    "codedeploy.us-west-1.amazonaws.com",
                    "codedeploy.us-west-2.amazonaws.com",
                    "codedeploy.eu-west-3.amazonaws.com",
                    "codedeploy.ca-central-1.amazonaws.com",
                    "codedeploy.eu-west-1.amazonaws.com",
                    "codedeploy.eu-west-2.amazonaws.com",
                    "codedeploy.eu-central-1.amazonaws.com",
                    "codedeploy.ap-east-1.amazonaws.com",
                    "codedeploy.ap-northeast-1.amazonaws.com",
                    "codedeploy.ap-northeast-2.amazonaws.com",
                    "codedeploy.ap-southeast-1.amazonaws.com",
                    "codedeploy.ap-southeast-2.amazonaws.com",
                    "codedeploy.ap-south-1.amazonaws.com",
                    "codedeploy.sa-east-1.amazonaws.com"
                ]
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

 9. EC2 인스턴스에 대한 IAM 프로파일 생성을 위해 [IAM] 메뉴에서 '정책' 클릭 후 [정책 생성] 버튼을 클릭합니다. 

 

10. [정책 생성] 페이지에서 'JSON' 탭을 클릭하여 다음의 정책 코드를 입력하고 [정책 검토] 버튼을 클릭합니다. 

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:Get*",
        "s3:List*"
      ],
      "Resource": [
        "arn:aws:s3:::replace-with-your-s3-bucket-name/*",
        "arn:aws:s3:::aws-codedeploy-us-east-2/*",
        "arn:aws:s3:::aws-codedeploy-us-east-1/*",
        "arn:aws:s3:::aws-codedeploy-us-west-1/*",
        "arn:aws:s3:::aws-codedeploy-us-west-2/*",
        "arn:aws:s3:::aws-codedeploy-ca-central-1/*",
        "arn:aws:s3:::aws-codedeploy-eu-west-1/*",
        "arn:aws:s3:::aws-codedeploy-eu-west-2/*",
        "arn:aws:s3:::aws-codedeploy-eu-west-3/*",
        "arn:aws:s3:::aws-codedeploy-eu-central-1/*",
        "arn:aws:s3:::aws-codedeploy-ap-east-1/*",
        "arn:aws:s3:::aws-codedeploy-ap-northeast-1/*",
        "arn:aws:s3:::aws-codedeploy-ap-northeast-2/*",
        "arn:aws:s3:::aws-codedeploy-ap-southeast-1/*",        
        "arn:aws:s3:::aws-codedeploy-ap-southeast-2/*",
        "arn:aws:s3:::aws-codedeploy-ap-south-1/*",
        "arn:aws:s3:::aws-codedeploy-sa-east-1/*"
      ]
    }
  ]
}

 

11. [정책 검토] 페이지에서 '이름'에 'CodeDeployEC2-Permissions'입력 후 [정책생성] 버튼을 클릭합니다. 

 

12. 생성된 정책을 역할로 연결하기 위해 [역할 만들기] 버튼을 클릭합니다. 'AWS 서비스'를 선택하고 '사용 사례 선택' 항목에서 'EC2' 선택 후 [다음] 버튼을 클릭합니다.

 

13. 이전에 생성한 정책을 찾기 위해 '정책 필터' 항목에 'codedeploy' 입력 후 정책 리스트에서 'CodeDeployEC2-Permission'을 추가합니다. '정책' 필터에서 'S3'를 입력하여 'AmazonS3FullAccess'를 체크하고 [다음] 버튼 클릭, [태그추가] 페이지에서 [다음] 버튼을 클릭합니다.

 

14. [검토] 페이지에서 '역할 이름' 에 'CodeDeployEC2-Permissions' 입력 후 [역할 만들기] 버튼을 클릭합니다.

 

EC2 Auto Scaling 그룹 구성

1. AWS Console에 접속 후 메뉴에서 [서비스] - [컴퓨팅] - [EC2] 를 클릭합니다. 'Auto Scaling' 항목에서 '시작 구성' 메뉴 클릭 후 [시작 구성 생성] 버튼을 클릭합니다.

 

2. [시작구성생성]페이지에서 'Amazon Linux AMI' 를 선택합니다. 

※ 해당 플랫폼이 일부 개편되면서 AMI를 찾기가 힘들어 졌는데, 팁을 주자면 단일 EC2생성 화면에서 해당 AMI의 일련번호를 긁어다 찾는것이 좋다.

 

3. 그외 세팅값은 아래 내용을 참고바랍니다.

 

※ '추가구성' 섹션의 '고급 세부정보'에서 '사용자데이터' '텍스트로' 를 선택하고 아래 CLI를 입력합니다.

#!/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 
chmod +x ./install
sudo ./install auto

  

※ 그리고 SSH를 위한 22번 포트, 웹서비스를 위한 포트를 아래와 같이 열어줍니다.

 

※ 키페어는 있는거 쓰셔도 되고, 새로 만드셔도 됩니다.

 

4. 세팅이 끝나면 [시작구성검토] 그리고 [시작구성생성] 을 클릭합니다.

 

5. 시작 구성 생성 진행 후 [이시작 구성을 사용하여 Auto Scaling 그룹 생성] 버튼을 클릭합니다.

 

6. [Auto Scaling 그룹 생성] 페이지에서 '그룹 이름'에 'CodeDeployAS-Group' 입력 후 '네트워크'는 '기본값'으로 지정하고 운영할 '서브넷' 선택하여 [다음] 버튼을 클릭합니다.

 

7. [조정 정책 구성] 에서 '조정 정책을 사용하여 이 그룹의 용량 조절' 을 선택하여 사용량에 대응하는 Scale-OUT을 구현합니다. 

 

8. [검토] 후 [Auto Scalling 그룹 생성] 버튼을 클릭합니다. 

 

9. 완성되고 인스턴스들을 올리는데 일정 시간이 소요됩니다. 이제 EC2 대시보드를 가면 용량에 맞는 인스턴스들이 초기화 과정을 거쳐 생성됩니다.

 

Cloud9을 활용한 웹 페이지와 Appspec.yml 설정

 

1. AWS Console에 접속 후 메뉴에서 [서비스] - [개발자도구] - [Cloud9]을 클릭합니다. 이전에 생성된 Cloud9을 접속해도 좋고 새로 만들어도 좋습니다. 아무튼 'OpenIDE'를 클릭하여 들어갑니다. '폴더' 항목에서 오른쪽 마우스 클릭후 'New Folder'를 클릭하여 폴더 이름을 'codedeploy-sample'로 입력합니다. 

 

2. 신규로 생성된 'codedeploy-sample'폴더에서 마우스 오른쪽 버튼 클릭 후 'NewFile'을 클릭하여 파일명을 '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>

3. codedeploy-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

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

 

파일명: ./scripts/install_dependencies

#!/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

 

5. 작성된 파일을 압축하기 위해 Cloud9 터미널 창에서 다음과 같은 명령을 수행하여 소스 전제 파일을 zip파일로 압축합니다. 

$cd /home/ec2-user/environment
$cd codedeploy-sample/
$zip -r codedeploy-sample.zip *

 

6. 배포할 소스파일을 업로드하기 위한 버킷을 생성하기 위해 [S3] 메뉴를 들어가 [버킷만들기] 버튼을 클릭합니다.

 

7. [버킷생성] 페이지에서 '버킷 이름'에 'codedeploy-s3-[본인아이디]' 입력 후 [생성] 버튼을 클릭합니다. 

 

8. Cloud9 콘솔로 이동하여 AWS CLI를 활용하여 압축된 소스파일을 S3에 신규 생성된 버킷으로 업로드합니다. AWS CLI에대한 Access Key/Secret Access Key 등록이 안된경우 오류가 발생할 수 있습니다.

$aws s3 cp codedeploy-sample.zip s3://codedeploy-s3-sample

 

CodeDeploy 구성 및 EC2 AutoScaling 소스 배포

 

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

 

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

 

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

 

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

 

5. '환경구성' 항목에서 배포대상으로 'Amazon EC2 Auto Scaling 그룹'을 선택하고 Select 박스에서 이전에 생성한 Auto Scaling 그룹인 'CodeDeployAS-Group'을 선택합니다. 로드벨런스를 사용할 경우 '로드벨런싱'을 체크하고 아니라면 해제합니다. 

 

6. 애플리케이션 목록에서 [배포생성] 버튼을 클릭하여 배포를 생성합니다. 

 

7. [배포 설정] 페이지에서 '개정 유형'에 '애플리케이션을 Amazon S3 저장'을 선택하고, 이전에 S3버킷으로 업로드한 소스의 위치를 확인한 후 '개정 위치'에 입력하여 [배포 만들기] 버튼을 클릭합니다. 

 

8. 배포 진행 완료 3~5분 후 다음과 같이 배포 상태가 '성공'으로 표시됨을 확인합니다.

 

9. 배포를 정상적으로 진행한 후 EC2 인스턴스로 이동하여 인스턴스 리스트에서 서버의 '퍼블릭 DNS'정보를 확인합니다.

 

10. 복사된 URL을 웹브라우저에 입력하여 페이지가 정상적으로 배포되었음을 확인합니다.