West Florida 대학교에서 작성한 Automated AWS Provisioning and Deployment Using CloudFormation and CodeDeploy 튜토리얼을 정리한 내용입니다. 

먼저 기본적으로 사용하는 서비스는 아래와 같습니다. 

 
- 인증 및 권한 관리 : IAM
- main service : CloudFormation
- Code Deploy : S3
-  Linux AMI 를 통해 Linux 인스턴스를 배포하고 인스턴스마다 AWS CLI 가 설치되어 있어야함 
 
1. Basic Mechanism
 
 
 
 
 
1) 맨 위 레이어는 우리가 가진 build server 
 - deploy.sh 은 bash script 이며 아래와 같은 커맨드들을 포함하고 있음 
  . 모든 application 을 압축해서 S3 로 전송
  . CloudFormation 에게 EC2 인스턴스를 프로비저닝 할 것을 전달 
  . CodeDeploy 에게 어떠한 인스턴스에 어떤 어플리케이션이 있는지 전달
 
2) CloudFormation Template file (cfTemplate.json) 
  . 인스턴스와 네트워크 환경과 같은 CloudFormation 서비스에 대해 정의함 
  . User Data 영역의 Bash script 를 가지고 있고 인스턴스가 기동 시 CodeDeploy Agent 를 설치하고 기동함 
 
3) A directory (/myApp)
   . application 설치를 위해 필요한 모든 내용을 담고 있음 
   (예제에서는  python 기반의 HTTP 서버를 띄워서 간단한 web site 를 구성할 것임)
   . web site 는 single index.html 테스트 페이지가 있는데 CodeDeploy 를 사용하기 위해서 
   서버를 기동하고 CodeDeploay Agent 구성 요소로 사용하는 appspec.yml 을 startApp.sh script 에 추가해야 한다. 
 
두번째 레이어는 AWS 서비스를 보여줌 
 1) Cloudformation 은 자동으로 프로비저닝 하고 EC2 가상 하드웨어(Insatnaces, LB, Virtual Networks)를 구성하기 위한 AWS 의 서비스 
 
 2) CodeDeploy 는 서비스와 agent 로 구성된 deployment service
 Build server 는 application이 deployment 가능한 상태가 되었을 때 CodeDeploy 서비스에 전달
 인스턴스의 CodeDeploy Agent 는 주기적으로 배포할 job 이 있는지 CodeDeploy 서비스를 쿼리함 
 
 3) S3 스토리지 서비스는 CodeDeploy Agent 가 설치를 위해 필요한 패키지와 application 압축 파일을 가지고 있음 
 
 
2. Authentication and Authorization Issues
 
만약 cloudformation 과 codedeploy 가 H/W 와 application 을 배포할 수 있다면, 잠재적인 공격자는 악성 코드를 배포하는데 이용할 수 있다. 이러한 공격을 방지하기 위해서 자격 증명은 각 배포 프로세스 단계마다 확인해야 한다. AWS 는 IAM (Identity and Access Management) 서비스와 STS(simple token service)를 통해 필요한 자격증명을 생성/관리할 수 있다. 
 
authentication / authorization 진행 과정
 
 1) 인스턴스는 S3 에 접근하여 CodeDeploy Agent 패키지를 가져오고 사용자의 응용 프로그램 zip 파일을 읽는다. 이 때 cloudformation 은 새로운 인스턴스에 IAM 인스턴스 프로파일을 첨부한다. 
 그 프로파일은 S3 에 접근할 수 있는 IAM EC2 role 을 포함하고 있고 EC2 서비스의 역할을 가정할 수 있는 신뢰 관계를 갖는다. 인스턴스에 기동되어 있는 어떠한 프로세스든 STS 를 부르기 위해 EC2 role 을 사용하고 S3 를 호출하기 위한 임시 토큰을 발급받는다. 
 
 2) CodeDeploy 서비스는 어떤 spec 의 인스턴스에 어떤 application 이 배포되어야 하는지 사용자의 EC2 인스턴스를 스캔하고 태그를 확인한다. 이러한 접근을 위해 IAM service role 을 만들고 인스턴스 목록을 만들고 태그를 읽는것을 허용한다. service role의 신뢰 관계는 CodeDeploy 서비스가 역할을 가정 할 수 있다. 
 
 3) cloudformation,Codedeploy,S3 의 자격증명을 통해 deploy.sh 스크립트가 수행된다. 이 자격증명 역시 서비스에 의해 상속된다. 예를들어 IAM 인스턴스 프로파일을 새로운 인스턴스에 전달하기 위해서는 IAM user 를 정책에 맞게 생성하고 IAM user 의 자격증명 (secret access key and access key id) 을 스크립트 기동 시 제공한다. 
 
 두가지 보안 원칙 
 1) 자격증명은 최소 인원이 만들고 접근해야한다. 
 IAM role 과 IAM user 는 Administrator 로 구성하고 운영중에는 변경하지 않도록 한다. (자격증명은 주기적으로 변경해야한다.)
 생성된 자격증명은 스크립트에 하드코딩하면 안되고 코드 저장소에 대한 읽기 권한을 갖는 사람만 접근할 수 있어야 한다.
 
 2) 자격증명에는 최소한의 권한만 부여되어야 한다. 필요하지 않는 작업에 대해서는 허용되지 않아야 한다. 
 
 
 3. SETTING UP AUTHENTICATION AND AUTHORIZATION
 
 1) IAM EC2 Role / IAM 인스턴스 프로파일 설정
 - S3 접근을 통해 인스턴스를 프로비저닝 하는 방법 / CodeDeploy 에이전트와 응용 프로그램 zip 파일을 포함하는 버킷에 대한 읽기 권한 부여 
 
 2) IAM Service Role 설정 
 - IAM service role 을 codedeploy 서비스에서 사용자의 EC2 목록을 가져오고 tag 를 읽을 수 있도록 허용하고 업데이트가 필요한 인스턴스를 확인할 수 있어야 함 
 
 3) IAM User 설정 
 - IAM user 는 build server 에서 deploy.sh 을 수행하는데 사용된다. 
 
 4) 식별할 태그 선택 
 - 앞에서도 얘기했지만 CodeDeploy 는 설치된 application 확인을 위하 인스턴스를 스캔하고 tag 는 key/value 로 구성되어 있다. 
 
 5) Key Pair 생성 
 - 필수 옵션 아니지만 인스턴스 로그인 할 때 필요하다. 
 
 
 4. SETTING UP ON YOUR BUILD SERVER
 1) AWS CLI 를 통한 Build Server 프로비저닝 
 - EC2 Linux 인스턴스 프로비저닝 
 
 2) SETTING UP YOUR Application
 - 앞에서 얘기한대로 index.html 테스트 페이지만 있는 웹사이트를 만들 예정이고 서버와 CodeDeploy 에이전트에 대한 지침과 함께 appspec.yml 파일을 시작하는 startApp.sh 스크립트를 추가해야 CodeDeploy를 사용할 수 있음 
 
==>> startApp.sh
#!/bin/bash
# Start python HTTP server to show test page on port 8000
# Run in background discarding output
cd /var/myApp/appData/
nohup python -m SimpleHTTPServer &>/dev/null &
 
 
==>> appspec.yml 
# appspec.yml file to install myApp using CodeDeploy
version: 0.0
os: linux
# Copy all files to /var/myApp
files:
- source: /
destination: /var/myApp
hooks:
## After files have been copied, run the startApp.sh script
ApplicationStart:
- location: scripts/startApp.sh
timeout: 300
 
 
 4) SETTING UP CloudFormation 
 CloudFormation 서비스는 템플릿에 정의된 가상 H/W 의 stack 을 배포한다. 
 인스턴스 SPEC, Security  Group 및 rule, AZ, DNS, Public IP, H/W 생성 후 수행되어야 하는 커맨드, 스크립트 에 대해서 템플릿을 정의함 
 
 
 
5. THE SCRIPTS AND HOW TO USE THEM
 1) deploy.sh script
 - Build 서버에서 deploy.sh 수행하면 기존에 수행되다 남아있는 작업을 제거하는 스크립트가 수행되고 (이건 deploy.sh 에 정의하기 나름) 앞에서 정의한 cloudformation 템플릿을 통해 EC2 인스턴스를 생성하고 startApp.sh 이 기동되면서 HTTP server 가 기동됨