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을 웹브라우저에 입력하여 페이지가 정상적으로 배포되었음을 확인합니다.
'IaaS > 퍼블릭클라우드' 카테고리의 다른 글
(AWS) CodePipeline을 활용한 EC2 소스 배포 자동화(with Cloud9, CodeCommit, CodeDeploy) (0) | 2021.06.13 |
---|---|
(AWS) CodePipeline 이란? (0) | 2021.06.12 |
(AWS) AWS CodeDeploy 란? (0) | 2021.06.08 |
(AWS) AWS CodeBuild 란? 그리고 실습 (0) | 2021.06.07 |
(AWS) CodeCommit 사용을 위한 IAM설정 (0) | 2021.06.07 |