

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# CodeDeploy 자습서
<a name="tutorials"></a>

이 단원에는 CodeDeploy 사용 방법에 대해 알아보는 데 유용하게 활용할 수 있는 몇 가지 자습서가 포함되어 있습니다.

이러한 튜토리얼의 절차에서는 파일을 저장할 위치(예: c:\$1temp) 및 버킷, 하위 폴더 또는 파일에 지정할 이름(예: 각각 amzn-s3-demo-bucket, HelloWorldApp 및 CodeDeployDemo-EC2-Trust.json)을 제안하지만 이러한 제안 사항을 사용할 필요는 없습니다. 절차를 수행하면서 파일 위치 및 이름만 대체하면 됩니다.

**Topics**
+ [튜토리얼: Amazon EC2 인스턴스(Amazon Linux 또는 Red Hat Enterprise Linux 및 Linux, macOS 또는 Unix)에 WordPress 배포](tutorials-wordpress.md)
+ [튜토리얼: CodeDeploy를 사용하여 "hello, world\$1" 애플리케이션 배포(Windows Server)](tutorials-windows.md)
+ [튜토리얼: CodeDeploy를 사용하여 온프레미스 인스턴스에 애플리케이션 배포(Windows Server, Ubuntu Server 또는 Red Hat Enterprise Linux)](tutorials-on-premises-instance.md)
+ [튜토리얼: CodeDeploy를 사용하여 Auto Scaling 그룹에 애플리케이션 배포](tutorials-auto-scaling-group.md)
+ [튜토리얼: CodeDeploy를 사용하여 GitHub에서 애플리케이션 배포](tutorials-github.md)
+ [튜토리얼: Amazon ECS에 애플리케이션 배포](tutorial-ecs-deployment.md)
+ [튜토리얼: Amazon ECS 서비스 배포 및 확인 테스트](tutorial-ecs-deployment-with-hooks.md)
+ [자습서: CodeDeploy 및 AWS 서버리스 애플리케이션 모델을 사용하여 업데이트된 Lambda 함수 배포](tutorial-lambda-sam.md)

# 튜토리얼: Amazon EC2 인스턴스(Amazon Linux 또는 Red Hat Enterprise Linux 및 Linux, macOS 또는 Unix)에 WordPress 배포
<a name="tutorials-wordpress"></a>

이 튜토리얼에서는 PHP와 MySQL을 기반으로 하는 오픈 소스 블로그 도구 및 콘텐츠 관리 시스템인 WordPress를 Amazon Linux 또는 Red Hat Enterprise Linux(RHEL)를 실행하는 단일 Amazon EC2 인스턴스에 배포합니다.

찾는 항목이 보이지 않습니까?
+ 대신 Windows Server를 실행하는 Amazon EC2 인스턴스에 배포하는 방법을 연습하려면 [튜토리얼: CodeDeploy를 사용하여 "hello, world\$1" 애플리케이션 배포(Windows Server)](tutorials-windows.md) 단원을 참조하세요.
+ Amazon EC2 인스턴스 대신 온프레미스 인스턴스에 배포하는 방법을 연습하려면 [튜토리얼: CodeDeploy를 사용하여 온프레미스 인스턴스에 애플리케이션 배포(Windows Server, Ubuntu Server 또는 Red Hat Enterprise Linux)](tutorials-on-premises-instance.md) 단원을 참조하세요.

이 튜토리얼의 단계는 Linux, macOS, 또는 Unix를 실행하는 로컬 개발 시스템의 관점에서 제시됩니다. Windows를 실행하는 로컬 컴퓨터에서 이러한 단계를 대부분 완료할 수 있지만 명령(예: **chmod**, **wget**), 애플리케이션(예: sed), 디렉터리 경로(예: `/tmp`)를 다루는 단계를 적용해야 합니다.

이 자습서를 시작하기 전에 [CodeDeploy 시작하기](getting-started-codedeploy.md)의 사전 조건을 완료해야 합니다. 여기에는 사용자 구성, 설치 또는 업그레이드 AWS CLI, IAM 인스턴스 프로파일 및 서비스 역할 생성이 포함됩니다.

**Topics**
+ [1단계: Amazon Linux 또는 Red Hat Enterprise Linux Amazon EC2 인스턴스 시작 및 구성](tutorials-wordpress-launch-instance.md)
+ [2단계: Amazon Linux 또는 Red Hat Enterprise Linux Amazon EC2 인스턴스에 배포할 원본 콘텐츠 구성](tutorials-wordpress-configure-content.md)
+ [3단계: WordPress 애플리케이션을 Amazon S3에 업로드](tutorials-wordpress-upload-application.md)
+ [4단계: WordPress 애플리케이션 배포](tutorials-wordpress-deploy-application.md)
+ [5단계: WordPress 애플리케이션 업데이트 및 재배포](tutorials-wordpress-update-and-redeploy-application.md)
+ [6단계: WordPress 애플리케이션 및 관련 리소스 정리](tutorials-wordpress-clean-up.md)

# 1단계: Amazon Linux 또는 Red Hat Enterprise Linux Amazon EC2 인스턴스 시작 및 구성
<a name="tutorials-wordpress-launch-instance"></a>

CodeDeploy를 사용하여 WordPress 애플리케이션을 배포하려면 Amazon Linux 또는 Red Hat Enterprise Linux(RHEL)를 실행하는 Amazon EC2 인스턴스가 필요합니다. Amazon EC2 인스턴스에는 HTTP 연결을 허용하는 새로운 인바운드 보안 규칙이 필요합니다. 이 규칙은 애플리케이션이 성공적으로 배포된 후 브라우저에서 WordPress 페이지를 보기 위해 필요합니다.

[CodeDeploy를 위한 Amazon EC2 인스턴스 생성](instances-ec2-create.md)의 지침을 따르세요. 인스턴스에 Amazon EC2 인스턴스 태그 할당 지침을 수행한 경우 태그 키로 **Name**, 태그 값으로 **CodeDeployDemo**가 지정되어 있어야 합니다. 태그 키 또는 태그 값을 다르게 지정한 경우 [4단계: WordPress 애플리케이션 배포](tutorials-wordpress-deploy-application.md)의 지침을 따르면 예기치 않은 결과가 발생할 수 있습니다.

지침에 따라 Amazon EC2 인스턴스를 시작한 후에는 이 페이지로 돌아와 계속해서 다음 단원으로 진행합니다. 다음 단계로 [CodeDeploy를 사용하여 애플리케이션 생성](applications-create.md) 단원을 진행하지 마세요.

## Amazon Linux 또는 RHEL Amazon EC2 인스턴스에 연결
<a name="tutorials-wordpress-launch-instance-connect"></a>

새 Amazon EC2 인스턴스 시작 후 다음 지침에 따라 해당 인스턴스에 연결하는 연습을 합니다.

1. **ssh** 명령(또는 [PuTTY](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/putty.html)와 같이 SSH를 지원하는 터미널 에뮬레이터)을 사용하여 Amazon Linux 또는 RHEL Amazon EC2 인스턴스에 연결하세요. Amazon EC2 인스턴스를 시작할 때 사용한 키 페어의 프라이빗 키와 인스턴스의 퍼블릭 DNS 주소가 필요합니다. 자세한 내용은 [인스턴스에 연결](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-connect-to-instance-linux.html)을 참조하세요.

   예를 들어 퍼블릭 DNS 주소가 **ec2-01-234-567-890.compute-1.amazonaws.com**이고, SSH 액세스를 위한 Amazon EC2 인스턴스 키 페어 이름이 **codedeploydemo.pem**인 경우, 다음을 입력하세요.

   ```
   ssh -i /path/to/codedeploydemo.pem ec2-user@ec2-01-234-567-890.compute-1.amazonaws.com
   ```

   `/path/to/codedeploydemo.pem`을(를) `.pem` 파일의 경로로 바꾸고, 예제 DNS 주소를 Amazon Linux 또는 RHEL Amazon EC2 인스턴스에 대한 주소로 바꾸세요.
**참고**  
키 파일의 권한이 너무 개방되었다는 오류가 표시되면, 현재 사용자에게만 액세스를 부여하도록 권한을 제한해야 합니다. 예를 들어, Linux, macOS 또는 Unix에서 **chmod** 명령을 사용하는 경우 다음을 입력합니다.

   ```
   chmod 400 /path/to/codedeploydemo.pem
   ```

1. 로그인하면 Amazon EC2 인스턴스에 대한 AMI 배너가 표시됩니다. Amazon Linux의 경우 다음과 같아야 합니다.

   ```
          __|  __|_  )
          _|  (     /   Amazon Linux AMI
         ___|\___|___|
   ```

1. 이제 실행 중인 Amazon EC2 인스턴스에서 로그아웃할 수 있습니다.
**주의**  
Amazon EC2 인스턴스를 중지하거나 종료하지 마세요. 인스턴스를 중지하거나 종료할 경우 CodeDeploy가 인스턴스에 배포할 수 없습니다.

## Amazon Linux 또는 RHEL Amazon EC2 인스턴스에 HTTP 트래픽을 허용하는 인바운드 규칙 추가
<a name="tutorials-wordpress-launch-instance-add-inbound-rule"></a>

다음 단계에서는 배포된 WordPress 애플리케이션의 홈 페이지를 브라우저에서 볼 수 있도록 Amazon EC2 인스턴스에 열린 HTTP 포트가 있는지 확인합니다.

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) Amazon EC2 콘솔을 엽니다.

1. **인스턴스**를 선택한 후 인스턴스를 선택합니다.

1. **설명** 탭의 **보안 그룹**에서 **인바운드 규칙 보기**를 선택합니다.

   보안 그룹에 다음과 같은 규칙 목록이 있어야 합니다.

   ```
   Security Groups associated with i-1234567890abcdef0
    Ports     Protocol     Source     launch-wizard-N
    22        tcp          0.0.0.0/0          ✔
   ```

1.  **보안 그룹**에서 Amazon EC2 인스턴스를 위한 보안 그룹을 선택합니다. 이름은 **launch-wizard-*N***이 될 수 있습니다. 이름의 ***N***은 인스턴스가 생성될 때 보안 그룹에 할당된 번호입니다.

    **인바운드** 탭을 선택합니다. 인스턴스의 보안 그룹이 올바르게 구성되어 있으면 다음 값이 있는 규칙이 표시되어야 합니다.
   + **유형**: HTTP
   + **프로토콜**: TCP
   + **포트 범위**: 80
   + **소스**: 0.0.0.0/0

1.  이러한 값이 있는 규칙이 없는 경우 [보안 그룹에 규칙 추가](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html#adding-security-group-rule)의 절차를 사용하여 해당 값을 새 보안 규칙에 추가하세요.

# 2단계: Amazon Linux 또는 Red Hat Enterprise Linux Amazon EC2 인스턴스에 배포할 원본 콘텐츠 구성
<a name="tutorials-wordpress-configure-content"></a>

이제 인스턴스에 배포할 항목이 있도록 애플리케이션의 원본 콘텐츠를 구성해야 합니다.

**Topics**
+ [소스 코드 가져오기](#tutorials-wordpress-configure-content-download-code)
+ [애플리케이션을 실행하기 위한 스크립트 만들기](#tutorials-wordpress-configure-content-create-scripts)
+ [애플리케이션 사양 파일 추가](#tutorials-wordpress-configure-content-add-appspec-file)

## 소스 코드 가져오기
<a name="tutorials-wordpress-configure-content-download-code"></a>

이 튜토리얼에서는 개발 시스템에서 대상 Amazon EC2 인스턴스로 WordPress 콘텐츠 게시 플랫폼을 배포합니다. WordPress 소스 코드를 얻으려면 기본 제공 명령줄 호출을 사용할 수 있습니다. 또는 Git이 개발 컴퓨터에 설치되어있는 경우 대신 사용할 수 있습니다.

이 단계를 위해, WordPress 소스 코드의 복사본을 개발 머신의 `/tmp` 디렉터리로 다운로드할 수 있다고 가정합니다. (원하는 디렉터리를 선택할 수 있지만 이 단계에서 지정되는 모든 곳에서 위치를 `/tmp`로 바꿔야 합니다.)

WordPress 소스 파일을 개발 컴퓨터에 복사하려면 다음 두 가지 옵션 중 하나를 선택합니다. 첫 번째 옵션은 기본 제공 명령줄 호출을 사용합니다. 두 번째 옵션은 Git를 사용합니다.

**Topics**
+ [WordPress 소스 코드의 복사본을 얻으려면(기본 제공 명령줄 호출)](#tutorials-wordpress-configure-content-download-code-command-line)
+ [WordPress 소스 코드의 복사본을 얻으려면(Git)](#tutorials-wordpress-configure-content-download-code-git)

### WordPress 소스 코드의 복사본을 얻으려면(기본 제공 명령줄 호출)
<a name="tutorials-wordpress-configure-content-download-code-command-line"></a>

1. **wget** 명령을 호출하여 WordPress 소스 코드의 복사본을.zip 파일로 현재 디렉터리에 다운로드합니다.

   ```
   wget https://github.com/WordPress/WordPress/archive/master.zip
   ```

1. **unzip**, **mkdir**, **cp**, 및 **rm** 명령으르 호출하여 다음을 수행합니다.
   + `master` .zip 파일을 `/tmp/WordPress_Temp` 디렉터리(폴더)에서 압축을 풉니다.
   + 압축이 풀린 내용을 `/tmp/WordPress` 대상 폴더에 복사합니다.
   + 임시 `/tmp/WordPress_Temp` 폴더 및 `master` 파일을 삭제합니다.

   명령을 한 번에 하나씩 실행합니다.

   ```
   unzip master -d /tmp/WordPress_Temp
   ```

   ```
   mkdir -p /tmp/WordPress
   ```

   ```
   cp -paf /tmp/WordPress_Temp/WordPress-master/* /tmp/WordPress
   ```

   ```
   rm -rf /tmp/WordPress_Temp
   ```

   ```
   rm -f master
   ```

   이렇게 하면 `/tmp/WordPress` 폴더에 깨끗한 WordPress 소스 코드 파일 세트가 남게 됩니다.

### WordPress 소스 코드의 복사본을 얻으려면(Git)
<a name="tutorials-wordpress-configure-content-download-code-git"></a>

1. 개발 머신에 [Git](http://git-scm.com)를 다운로드하고 설치합니다.

1. `/tmp/WordPress` 폴더에서 **git init** 명령을 호출합니다.

1. **git clone** 명령을 호출하여 공용 WordPress 리포지토리를 복제하고 `/tmp/WordPress` 대상 폴더에 자신만의 복사본을 만듭니다.

   ```
   git clone https://github.com/WordPress/WordPress.git /tmp/WordPress
   ```

   이렇게 하면 `/tmp/WordPress` 폴더에 깨끗한 WordPress 소스 코드 파일 세트가 남게 됩니다.

## 애플리케이션을 실행하기 위한 스크립트 만들기
<a name="tutorials-wordpress-configure-content-create-scripts"></a>

그런 다음 디렉터리에 폴더와 스크립트를 만듭니다. CodeDeploy는 이러한 스크립트를 사용하여 대상 Amazon EC2 인스턴스에 애플리케이션 수정 버전을 설정하고 배포합니다. 어떤 텍스트 편집기든 사용하여 스크립트를 생성할 수 있습니다.

1. WordPress 소스 코드의 복사본에 스크립트 디렉터리를 만듭니다.

   ```
   mkdir -p /tmp/WordPress/scripts
   ```

1. `/tmp/WordPress/scripts`에 `install_dependencies.sh` 파일을 생성합니다. 파일에 다음 줄을 추가합니다. 이 `install_dependencies.sh` 스크립트는 Apache, MySQL, PHP를 설치합니다. 또한 PHP에 MySQL 지원을 추가합니다.

   ```
   #!/bin/bash
   sudo amazon-linux-extras install php7.4
   sudo yum install -y httpd mariadb-server php
   ```

1. `/tmp/WordPress/scripts`에 `start_server.sh` 파일을 생성합니다. 파일에 다음 줄을 추가합니다. 이 `start_server.sh` 스크립트는 Apache와 MySQL을 시작합니다.

   ```
   #!/bin/bash
   systemctl start mariadb.service
   systemctl start httpd.service
   systemctl start php-fpm.service
   ```

1. `/tmp/WordPress/scripts`에 `stop_server.sh` 파일을 생성합니다. 파일에 다음 줄을 추가합니다. 이 `stop_server.sh` 스크립트는 Apache와 MySQL을 중지합니다.

   ```
   #!/bin/bash
   isExistApp="pgrep httpd"
   if [[ -n $isExistApp ]]; then
   systemctl stop httpd.service
   fi
   isExistApp=pgrep mysqld
   if [[ -n $isExistApp ]]; then
   systemctl stop mariadb.service
   fi
   isExistApp=pgrep php-fpm
   if [[ -n $isExistApp ]]; then
   systemctl stop php-fpm.service
   
   fi
   ```

1. `/tmp/WordPress/scripts`에 `create_test_db.sh` 파일을 생성합니다. 파일에 다음 줄을 추가합니다. 이 `create_test_db.sh`스크립트는 MySQL을 사용하여 WordPress가 사용할 **test** 데이터베이스를 만듭니다.

   ```
   #!/bin/bash
   mysql -uroot <<CREATE_TEST_DB
   CREATE DATABASE IF NOT EXISTS test;
   CREATE_TEST_DB
   ```

1. 마지막으로, `/tmp/WordPress/scripts`에서 `change_permissions.sh` 스크립트를 만듭니다. 이것은 Apache에서 폴더 권한을 변경하는 데 사용됩니다.
**중요**  
 이 스크립트는 `/tmp/WordPress` 폴더에서 사용 권한을 업데이트하여 누구나 쓸 수 있습니다. 이것은 [5단계: WordPress 애플리케이션 업데이트 및 재배포](tutorials-wordpress-update-and-redeploy-application.md) 중에 WordPress가 데이터베이스에 쓸 수 있도록 하는 데 필요합니다 WordPress 애플리케이션을 설정한 후 다음 명령을 실행하여 사용 권한을 보다 안전한 설정으로 업데이트합니다.  

   ```
   chmod -R 755 /var/www/html/WordPress
   ```

   ```
   #!/bin/bash
   chmod -R 777 /var/www/html/WordPress
   ```

1. 모든 스크립트에 실행 권한을 부여합니다. 명령줄에 다음을 입력합니다.

   ```
   chmod +x /tmp/WordPress/scripts/*
   ```

## 애플리케이션 사양 파일 추가
<a name="tutorials-wordpress-configure-content-add-appspec-file"></a>

다음으로, CodeDeploy 에서 사용하는 [YAML](http://www.yaml.org) 형식 파일인 애플리케이션 사양 파일(AppSpec 파일)을 추가하여 다음을 수행합니다.
+ 애플리케이션 수정 버전의 소스 파일을 Amazon EC2 인스턴스의 대상으로 매핑합니다.
+ 배포된 파일에 대한 사용자 정의 권한을 지정합니다.
+ 배포 중에 대상 Amazon EC2 인스턴스에서 실행할 스크립트를 지정합니다.

AppSpec 파일의 이름은 `appspec.yml`이어야 합니다. 애플리케이션 소스 코드의 루트 폴더에 있어야 합니다. 이 튜토리얼에서 루트 디렉토리는 `/tmp/WordPress`입니다.

텍스트 편집기에서 `appspec.yml`(이)라는 파일을 만듭니다. 파일에 다음 줄을 추가합니다.

```
version: 0.0
os: linux
files:
  - source: /
    destination: /var/www/html/WordPress
hooks:
  BeforeInstall:
    - location: scripts/install_dependencies.sh
      timeout: 300
      runas: root
  AfterInstall:
    - location: scripts/change_permissions.sh
      timeout: 300
      runas: root
  ApplicationStart:
    - location: scripts/start_server.sh
    - location: scripts/create_test_db.sh
      timeout: 300
      runas: root
  ApplicationStop:
    - location: scripts/stop_server.sh
      timeout: 300
      runas: root
```

CodeDeploy는 이 AppSpec 파일을 사용하여 개발 시스템에 있는 `/tmp/WordPress` 폴더의 모든 파일을 대상 Amazon EC2 인스턴스의 `/var/www/html/WordPress` 폴더 복사합니다. 배포하는 동안 CodeDeploy는 지정된 스크립트를 배포 수명 주기 동안 지정된 이벤트(예:**BeforeInstall** 및 **AfterInstall**)에서 대상 Amazon EC2 인스턴스에 있는 `/var/www/html/WordPress/scripts` 폴더에서 `root`(으)로 실행합니다. 스크립트를 실행하는 데 300초(5분) 이상 걸리면 CodeDeploy는 배포를 중지하고 배포를 실패로 표시합니다.

이러한 설정에 대한 자세한 정보는 [CodeDeploy AppSpec 파일 참조](reference-appspec-file.md) 단원을 참조하세요.

**중요**  
이 파일에 있는 각 항목 사이의 공백 위치와 개수는 중요합니다. 공백이 올바르지 않으면 CodeDeploy는 디버깅하기 어려운 오류를 발생시킵니다. 자세한 내용은 [AppSpec 파일 간격](reference-appspec-file.md#reference-appspec-file-spacing) 단원을 참조하십시오.

# 3단계: WordPress 애플리케이션을 Amazon S3에 업로드
<a name="tutorials-wordpress-upload-application"></a>

이제 CodeDeploy가 배포할 수 있는 위치에 소스 콘텐츠를 준비하고 업로드합니다. 다음 지침은 Amazon S3 버킷을 프로비저닝하고, 버킷에 대한 애플리케이션 수정 버전 파일을 준비하고, 수정 버전의 파일을 번들로 묶은 다음, 버전을 버킷에 푸시하는 방법을 보여 줍니다.

**참고**  
이 튜토리얼에서 다루지 않지만 CodeDeploy를 사용하여 애플리케이션을 GitHub 리포지토리에서 인스턴스로 배포할 수 있습니다. 자세한 내용은 [GitHub와 CodeDeploy 통합](integrations-partners-github.md) 단원을 참조하세요.

**Topics**
+ [Amazon S3 버킷 프로비저닝](#tutorials-wordpress-upload-application-create-s3-bucket)
+ [버킷에 대한 애플리케이션 파일 준비](#tutorials-wordpress-upload-application-prepare-application-files)
+ [애플리케이션의 파일을 단일 아카이브 파일로 묶고 아카이브 파일을 푸시합니다.](#tutorials-wordpress-upload-application-bundle-and-push-archive)

## Amazon S3 버킷 프로비저닝
<a name="tutorials-wordpress-upload-application-create-s3-bucket"></a>

스토리지 컨테이너 또는 Amazon S3의 *버킷*을 만듭니다(또는 기존 버킷 사용). 버킷에 수정 버전을 업로드할 수 있는지, 배포에 사용된 Amazon EC2 인스턴스가 버킷에서 수정 버전을 다운로드할 수 있는지 확인합니다.

 AWS CLI, Amazon S3 콘솔 또는 Amazon S3 APIs를 사용하여 Amazon S3 버킷을 생성할 수 있습니다. 버킷을 생성한 후에는 버킷과 AWS 계정에 액세스 권한을 부여해야 합니다.

**참고**  
버킷 이름은 모든 AWS 계정의 Amazon S3에서 고유해야 합니다. **amzn-s3-demo-bucket**을(를) 사용할 수 없는 경우, 다른 버킷 이름(예: **amzn-s3-demo-bucket** 뒤에 대시와 이니셜 또는 다른 고유 식별자가 옴)을 사용하세요. 그런 다음 이 자습서 전체에서 버킷 이름을 **amzn-s3-demo-bucket**(으)로 대체해야 합니다.  
대상 Amazon EC2 인스턴스가 시작되는 리전과 동일한 리전에서 Amazon S3 버킷을 생성해야 합니다. AWS Amazon EC2 예를 들어 버킷을 미국 동부(버지니아) 리전에 생성한 경우 대상 Amazon EC2 인스턴스를 미국 동부(버지니아 북부) 리전에서 시작해야 합니다.

**Topics**
+ [Amazon S3 버킷을 생성하려면(CLI)](#tutorials-wordpress-upload-application-create-s3-bucket-cli)
+ [Amazon S3 버킷을 생성하려면(콘솔)](#tutorials-wordpress-upload-application-create-s3-bucket-console)
+ [Amazon S3 버킷 및 AWS 계정에 권한 부여](#tutorials-wordpress-upload-application-create-s3-bucket-grant-permissions)

### Amazon S3 버킷을 생성하려면(CLI)
<a name="tutorials-wordpress-upload-application-create-s3-bucket-cli"></a>

**mb** 명령을 호출하여 이름이 **amzn-s3-demo-bucket**인 Amazon S3 버킷을 생성합니다.

```
aws s3 mb s3://amzn-s3-demo-bucket --region region
```

### Amazon S3 버킷을 생성하려면(콘솔)
<a name="tutorials-wordpress-upload-application-create-s3-bucket-console"></a>

1. [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. Amazon S3; 콘솔에서 **버킷 생성**을 선택합니다.

1. **버킷 이름** 상자에서 버킷의 이름을 입력합니다.

1. **리전** 목록에서 대상 리전을 선택한 후 **생성**을 선택합니다.

### Amazon S3 버킷 및 AWS 계정에 권한 부여
<a name="tutorials-wordpress-upload-application-create-s3-bucket-grant-permissions"></a>

또한 Amazon S3 버킷으로 업로드할 수 있는 권한이 있어야 합니다. Amazon S3 버킷 정책을 통해 이러한 권한을 지정할 수 있습니다. 예를 들어 다음 Amazon S3 버킷 정책에서 와일드카드 문자(\$1)를 사용하면 AWS 계정이 라는 Amazon S3 버킷의 모든 디렉터리에 파일을 `111122223333` 업로드할 수 있습니다`amzn-s3-demo-bucket`.

```
{
    "Statement": [
        {
            "Action": [
                "s3:PutObject"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
            "Principal": {
                "AWS": [
                    "111122223333"
                ]
            }
        }
    ]
}
```

 AWS 계정 ID를 보려면 [AWS 계정 ID 찾기를 참조하세요](https://docs.aws.amazon.com/IAM/latest/UserGuide/console_account-alias.html#FindingYourAWSId).

이제 Amazon S3 버킷이 참여하는 각 Amazon EC2 인스턴스에서 다운로드 요청을 허용하는지 확인하는 것이 좋습니다. Amazon S3 버킷 정책을 통해 이를 지정할 수 있습니다. 예를 들어, 다음 Amazon S3 버킷 정책에서 와일드카드 문자(\$1)를 사용하면 `arn:aws:iam::444455556666:role/CodeDeployDemo` ARN이 포함된 IAM 인스턴스 프로파일이 연결된 Amazon EC2 인스턴스가 이름이 `amzn-s3-demo-bucket`인 Amazon S3 버킷의 디렉터리에서 파일을 다운로드할 수 있습니다.

```
{
    "Statement": [
        {
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::444455556666:role/CodeDeployDemo"
                ]
            }
        }
    ]
}
```

 Amazon S3 버킷 정책 생성 및 연결에 대한 자세한 내용은 [버킷 정책 예제](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html)를 참조하세요.

IAM 정책을 만들고 연결하는 방법은 [정책 작업](https://docs.aws.amazon.com/IAM/latest/UserGuide/ManagingPolicies.html#AddingPermissions_Console)을 참조하세요.

## 버킷에 대한 애플리케이션 파일 준비
<a name="tutorials-wordpress-upload-application-prepare-application-files"></a>

WordPress 애플리케이션 파일, AppSpec 파일 및 스크립트가 개발 컴퓨터에서 다음과 같이 구성되어 있는지 확인하세요.

```
/tmp/
  |--WordPress/
      |-- appspec.yml  
      |-- scripts/
      |    |-- change_permissions.sh
      |    |-- create_test_db.sh
      |    |-- install_dependencies.sh
      |    |-- start_server.sh
      |    |-- stop_server.sh
      |-- wp-admin/
      |    |-- (various files...)
      |-- wp-content/
      |    |-- (various files...)
      |-- wp-includes/
      |    |-- (various files...)
      |-- index.php
      |-- license.txt
      |-- readme.html
      |-- (various files ending with .php...)
```

## 애플리케이션의 파일을 단일 아카이브 파일로 묶고 아카이브 파일을 푸시합니다.
<a name="tutorials-wordpress-upload-application-bundle-and-push-archive"></a>

WordPress 애플리케이션 파일과 AppSpec 파일을 아카이브 파일(애플리케이션 *수정 버전*이라고도 함)로 번들링합니다.

**참고**  
객체를 버킷에 저장하거나 애플리케이션 수정 버전을 버킷으로 전송한 경우 요금이 부과될 수 있습니다. 자세한 내용은 [Amazon S3 요금](https://aws.amazon.com/s3/pricing/)을 참조하세요.

1. 개발 컴퓨터에서 파일이 저장된 폴더로 전환하세요.

   ```
   cd /tmp/WordPress
   ```
**참고**  
이 폴더로 전환하지 않으면 현재 폴더에서 파일 번들링이 시작됩니다. 예를 들어 현재 폴더가 `/tmp/WordPress` 대신 `/tmp`이면 `tmp` 폴더의 파일 및 하위 폴더로 번들링이 시작되어 `WordPress` 하위 폴더보다 더 많은 폴더를 포함할 수 있습니다.

1. **create-application** 명령을 호출하여 이름이 **WordPress\$1App**인 새 애플리케이션을 등록합니다.

   ```
   aws deploy create-application --application-name WordPress_App
   ```

1. CodeDeploy [push](https://docs.aws.amazon.com/cli/latest/reference/deploy/push.html) 명령을 호출하여 파일을 묶고, 수정 버전을 Amazon S3로 업로드하고, 업로드된 수정 버전에 대한 정보를 CodeDeploy에 등록할 수 있습니다. 이 모든 작업을 한 번에 수행할 수 있습니다.

   ```
   aws deploy push \
     --application-name WordPress_App \
     --s3-location s3://amzn-s3-demo-bucket/WordPressApp.zip \
     --ignore-hidden-files
   ```

   이 명령은 현재 디렉터리의 파일(숨겨진 파일 제외)을 단일 아카이브 파일(이름: **WordPressApp.zip**)로 번들링하고 수정 버전을 **amzn-s3-demo-bucket** 버킷에 업로드하고 업로드된 수정 버전에 대한 정보를 CodeDeploy에 등록합니다.

# 4단계: WordPress 애플리케이션 배포
<a name="tutorials-wordpress-deploy-application"></a>

이제 Amazon S3에 업로드한 샘플 WordPress 애플리케이션 수정 버전을 배포합니다. AWS CLI 또는 CodeDeploy 콘솔을 사용하여 개정을 배포하고 배포 진행 상황을 모니터링할 수 있습니다. 애플리케이션 수정 배포에 성공한 후에는 결과를 확인합니다.

**Topics**
+ [CodeDeploy로 애플리케이션 수정 버전 배포](#tutorials-wordpress-deploy-application-create-deployment)
+ [배포 모니터링 및 문제 해결](#tutorials-wordpress-deploy-application-monitor)
+ [배포 확인](#tutorials-wordpress-deploy-application-verify-deployment)

## CodeDeploy로 애플리케이션 수정 버전 배포
<a name="tutorials-wordpress-deploy-application-create-deployment"></a>

 AWS CLI 또는 콘솔을 사용하여 애플리케이션 개정을 배포합니다.

**Topics**
+ [애플리케이션 수정을 배포하려면(CLI)](#tutorials-wordpress-deploy-application-create-deployment-cli)
+ [애플리케이션 수정을 배포하려면(콘솔)](#tutorials-wordpress-deploy-application-create-deployment-console)

### 애플리케이션 수정을 배포하려면(CLI)
<a name="tutorials-wordpress-deploy-application-create-deployment-cli"></a>

1. 배포에는 배포 그룹이 필요합니다. 그러나 배포 그룹을 만들기 전에 서비스 역할 ARN이 필요합니다. 서비스 역할은 서비스에 사용자를 대신할 수 있는 권한을 부여하는 IAM 역할입니다. 이 경우에 서비스 역할은 CodeDeploy에 Amazon EC2 인스턴스에 액세스하여 Amazon EC2 인스턴스 태그를 확장할(읽을) 수 있는 권한을 부여합니다.

   [서비스 역할 생성(CLI)](getting-started-create-service-role.md#getting-started-create-service-role-cli)의 지침에 따라 앞에서 서비스 역할을 생성했습니다. 서비스 역할의 ARN을 확인하려면 [서비스 역할 ARN 확인(CLI)](getting-started-create-service-role.md#getting-started-get-service-role-cli) 단원을 참조하세요.

1. 이제 ARN이 있으므로 **create-deployment-group** 명령을 호출하고, **CodeDeployDemo**(이)라는 Amazon EC2 인스턴스와 **CodeDeployDefault.OneAtATime**(이)라는 배포 구성을 사용하여 **WordPress\$1App**(이)라는 애플리케이션과 연결된 **WordPress\$1DepGroup**(이)라는 배포 그룹을 만듭니다.

   ```
   aws deploy create-deployment-group \
     --application-name WordPress_App \
     --deployment-group-name WordPress_DepGroup \
     --deployment-config-name CodeDeployDefault.OneAtATime \
     --ec2-tag-filters Key=Name,Value=CodeDeployDemo,Type=KEY_AND_VALUE \
     --service-role-arn serviceRoleARN
   ```

   
**참고**  
[create-deployment-group](https://docs.aws.amazon.com/cli/latest/reference/deploy/create-deployment-group.html) 명령은 배포 및 인스턴스의 지정된 이벤트에 대해 주제의 구독자에게 Amazon SNS 알림을 전송하게 하는 트리거를 생성합니다. 또한 해당 명령은 Amazon CloudWatch 경보 모니터링 임계값에 도달한 경우 자동으로 배포를 롤백하고 배포를 중지하도록 경보를 설정하는 옵션을 지원합니다. 이 작업에 대한 명령은 이 자습서에 포함되지 않습니다.

1. 배포를 만들기 전에 배포 그룹의 인스턴스에 CodeDeploy 에이전트가 설치되어 있어야 합니다. AWS Systems Manager 를 사용하여 명령줄에서 다음 명령으로 에이전트를 설치할 수 있습니다.

   ```
   aws ssm create-association \
     --name AWS-ConfigureAWSPackage \
     --targets Key=tag:Name,Values=CodeDeployDemo \
     --parameters action=Install,name=AWSCodeDeployAgent \
     --schedule-expression "cron(0 2 ? * SUN *)"
   ```

   이 명령은 Systems Manager 상태 관리자에 연결을 생성하여 CodeDeploy 에이전트를 설치하고 매주 일요일 오전 2시에 업데이트를 시도합니다. CodeDeploy 에이전트에 대한 자세한 내용은 [CodeDeploy 에이전트 작업](https://docs.aws.amazon.com/codedeploy/latest/userguide/codedeploy-agent.html)을 참조하세요. Systems Manager에 대한 자세한 내용은 [AWS Systems Manager란 무엇입니까](https://docs.aws.amazon.com/systems-manager/latest/userguide/what-is-systems-manager.html)를 참조하세요.

1. 이제 **create-deployment** 명령을 호출하고 **WordPress\$1App**이라는 버킷에 있는 **CodeDeployDefault.OneAtATime**이라는 애플리케이션 수정을 사용하여 **WordPress\$1DepGroup**이라는 애플리케이션, **WordPressApp.zip**이라는 배포 구성 및 **amzn-s3-demo-bucket**이라는 배포 그룹과 연결된 배포를 만듭니다.

   ```
   aws deploy create-deployment \
     --application-name WordPress_App \
     --deployment-config-name CodeDeployDefault.OneAtATime \
     --deployment-group-name WordPress_DepGroup \
     --s3-location bucket=amzn-s3-demo-bucket,bundleType=zip,key=WordPressApp.zip
   ```

### 애플리케이션 수정을 배포하려면(콘솔)
<a name="tutorials-wordpress-deploy-application-create-deployment-console"></a>

1. CodeDeploy 콘솔을 사용하여 애플리케이션 수정을 배포하기 전에 서비스 역할 ARN이 필요합니다. 서비스 역할은 서비스에 사용자를 대신할 수 있는 권한을 부여하는 IAM 역할입니다. 이 경우에 서비스 역할은 CodeDeploy에 Amazon EC2 인스턴스에 액세스하여 Amazon EC2 인스턴스 태그를 확장할(읽을) 수 있는 권한을 부여합니다.

   [서비스 역할 생성(콘솔)](getting-started-create-service-role.md#getting-started-create-service-role-console)의 지침에 따라 앞에서 서비스 역할을 생성했습니다. 서비스 역할의 ARN을 확인하려면 [서비스 역할 ARN 확인(콘솔)](getting-started-create-service-role.md#getting-started-get-service-role-console) 단원을 참조하세요.

1. 이제 ARN이 있으므로 CodeDeploy 콘솔을 사용하여 애플리케이션 수정 버전을 배포할 수 있습니다.

   에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/codedeploy](https://console.aws.amazon.com/codedeploy) CodeDeploy 콘솔을 엽니다.
**참고**  
[CodeDeploy 시작하기](getting-started-codedeploy.md)에서 설정한 사용자와 동일한 사용자로 로그인합니다.

1. 탐색 창에서 **배포**를 확장하고 **애플리케이션**을 선택합니다.

1. 애플리케이션 목록에서 **WordPress\$1App**을 선택합니다.

1. **배포 그룹** 탭에서 **Create deployment group(배포 그룹 생성)**을 선택합니다.

1. **Deployment group name(배포 그룹 이름)**에 **WordPress\$1DepGroup**을 입력합니다.

1. **배포 유형** 아래에서 **인 플레이스(In-place) 배포**를 선택합니다.

1. **환경 구성**에서 **Amazon EC2 인스턴스**를 선택합니다.

1. 를 **사용한 에이전트 구성 AWS Systems Manager**에서 기본값을 유지합니다.

1. **키**에 **Name**을(를) 입력합니다.

1. **값**에 **CodeDeployDemo**을(를) 입력합니다.
**참고**  
**CodeDeployDemo**을(를) 입력한 후 CodeDeploy가 일치하는 Amazon EC2 인스턴스를 하나 찾았는지 확인할 수 있도록 **1**이 **일치하는 인스턴스** 아래에 표시되어야 합니다.

1. **배포 구성**에서 **CodeDeployDefault.OneAtATime**을 선택합니다.

1. **서비스 역할 ARN**에서 서비스 역할 ARN을 선택한 후**배포 그룹 생성**을 선택합니다.

1. **배포 만들기**를 선택합니다.

1. **배포 그룹**에서 **WordPress\$1DepGroup**을(를) 선택합니다.

1. **리포지토리 유형** 옆의 **내 애플리케이션이 Amazon S3에 저장되어 있음**을 선택합니다. **수정 버전 위치**에 이전에 Amazon S3에 업로드한 샘플 WordPress 애플리케이션 수정 버전의 위치를 입력합니다. 위치를 가져오려면:

   1. [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

   1. 버킷 목록에서 **amzn-s3-demo-bucket**(또는 애플리케이션 수정 버전을 업로드한 버킷 이름)을 선택합니다.

   1. 객체 목록에서 **WordPressApp.zip**을 선택합니다.

   1. **개요** 탭에서 **링크** 필드의 값을 클립보드에 복사합니다.

      값이 다음과 같을 것입니다.

      **https://s3.amazonaws.com/amzn-s3-demo-bucket/WordPressApp.zip**

   1. CodeDeploy 콘솔로 돌아가서 **수정 버전 위치**에 **링크** 필드 값을 붙여 넣습니다.

1. **파일 형식**에서 파일 형식을 찾을 수 없다는 메시지가 표시되는 경우, **.Zip**을 선택합니다.

1. (선택 사항) **배포 설명** 상자에 설명을 입력합니다.

1. **배포 그룹 재정의**를 확장하고 **배포 구성**에서 **CodeDeployDefault.OneAtATime**을 선택합니다.

1. **Start deployment(배포 시작)**를 선택합니다. 새로 만든 배포에 대한 정보가 [**Deployments**] 페이지에 표시됩니다.

## 배포 모니터링 및 문제 해결
<a name="tutorials-wordpress-deploy-application-monitor"></a>

 AWS CLI 또는 콘솔을 사용하여 배포를 모니터링하고 문제를 해결합니다.

**Topics**
+ [배포를 모니터링하고 문제를 해결하려면(CLI)](#tutorials-wordpress-deploy-application-monitor-cli)
+ [배포를 모니터링하고 문제를 해결하려면(콘솔)](#tutorials-wordpress-deploy-application-monitor-console)

### 배포를 모니터링하고 문제를 해결하려면(CLI)
<a name="tutorials-wordpress-deploy-application-monitor-cli"></a>

1. **WordPress\$1App**이라는 애플리케이션 및 **WordPress\$1DepGroup**이라는 배포 그룹에 대해 **list-deployments** 명령을 호출하여 배포 ID를 가져옵니다.

   ```
   aws deploy list-deployments --application-name WordPress_App --deployment-group-name WordPress_DepGroup --query 'deployments' --output text
   ```

1. 배포 ID로 **get-deployment** 명령을 호출합니다.

   ```
   aws deploy get-deployment --deployment-id deploymentID --query 'deploymentInfo.status' --output text
   ```

1. 이 명령으로 배포의 전체 상태가 반환됩니다. 성공하면 `Succeeded` 값이 반환됩니다.

   전체 상태가 `Failed`이면 [list-deployment-instances](https://docs.aws.amazon.com/cli/latest/reference/deploy/list-deployment-instances.html) 및 [get-deployment-instance](https://docs.aws.amazon.com/cli/latest/reference/deploy/get-deployment-instance.html)와 같은 명령을 호출하여 문제를 해결할 수 있습니다. 문제 해결 옵션을 더 보려면 [인스턴스에 대한 배포 실패를 조사하기 위해 로그 파일 분석](troubleshooting-ec2-instances.md#troubleshooting-deploy-failures)을 참조하세요.

### 배포를 모니터링하고 문제를 해결하려면(콘솔)
<a name="tutorials-wordpress-deploy-application-monitor-console"></a>

CodeDeploy 콘솔의 **배포 ** 페이지에 있는 **상태** 열에서 배포 상태를 모니터링할 수 있습니다.

배포에 대한 자세한 정보를 확인하려면(특히, [**Status**] 열 값이 [**Succeeded**]가 아닌 경우):

1. **배포** 테이블에서 배포 이름을 선택합니다. 배포에 실패하면 실패 원인을 설명하는 메시지가 표시됩니다.

1. **인스턴스 활동**에서 배포에 대한 자세한 정보가 표시됩니다. 배포에 실패한 후 배포에 실패한 Amazon EC2 인스턴스와 해당 단계를 확인할 수 있습니다.

1. 문제 해결을 더 수행해야 할 경우 [CodeDeploy에서 인스턴스 정보 보기](instances-view-details.md)에 설명된 것과 같은 기능을 사용할 수 있습니다. 또한 Amazon EC2 인스턴스의 배포 로그 파일을 분석할 수도 있습니다. 자세한 내용은 [인스턴스에 대한 배포 실패를 조사하기 위해 로그 파일 분석](troubleshooting-ec2-instances.md#troubleshooting-deploy-failures) 단원을 참조하세요.

## 배포 확인
<a name="tutorials-wordpress-deploy-application-verify-deployment"></a>

배포에 성공한 후 WordPress 설치가 작동 중인지 확인합니다. Amazon EC2 인스턴스의 퍼블릭 DNS 주소(뒤에 `/WordPress`이 옴)를 사용해 웹 브라우저에서 사이트를 확인합니다. (퍼블릭 DNS 값을 확인하려면 Amazon EC2 콘솔에서 Amazon EC2 인스턴스를 선택하고 **설명** 탭에서 **퍼블릭 DNS**의 값을 찾습니다.)

예를 들어, Amazon EC2 인스턴스의 퍼블릭 DNS 주소가 **ec2-01-234-567-890.compute-1.amazonaws.com**이면 다음 URL을 사용합니다.

```
http://ec2-01-234-567-890.compute-1.amazonaws.com/WordPress
```

브라우저에서 사이트를 볼 때 다음과 유사한 WordPress 시작 페이지가 표시됩니다.

![\[WordPress 시작 페이지\]](http://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/images/WordPress-Welcome-Page-013118.png)


 Amazon EC2 인스턴스에 HTTP 인바운드 규칙이 보안 그룹에 추가되지 않은 경우 WordPress 시작 페이지가 나타나지 않습니다. 원격 서버가 응답하지 않는다는 메시지가 표시되면 Amazon EC2 인스턴스의 보안 그룹에 인바운드 규칙이 있는지 확인합니다. 자세한 내용은 [Amazon Linux 또는 RHEL Amazon EC2 인스턴스에 HTTP 트래픽을 허용하는 인바운드 규칙 추가Windows Server Amazon EC2 인스턴스에 HTTP 트래픽을 허용하는 인바운드 규칙 추가](tutorials-wordpress-launch-instance.md#tutorials-wordpress-launch-instance-add-inbound-rule) 단원을 참조하십시오.

# 5단계: WordPress 애플리케이션 업데이트 및 재배포
<a name="tutorials-wordpress-update-and-redeploy-application"></a>

이제 애플리케이션 수정 버전을 배포했으므로 개발 컴퓨터에서 WordPress의 코드를 업데이트한 다음 CodeDeploy를 사용하여 사이트를 다시 배포합니다. 그런 다음 Amazon EC2 인스턴스에서 코드 변경 사항을 확인해야 합니다.

**Topics**
+ [WordPress 사이트 설정](#tutorials-wordpress-update-and-redeploy-application-configure-and-install)
+ [사이트 수정](#tutorials-wordpress-update-and-redeploy-application-modify-code)
+ [사이트 재배포](#tutorials-wordpress-update-and-redeploy-application-deploy-updates)

## WordPress 사이트 설정
<a name="tutorials-wordpress-update-and-redeploy-application-configure-and-install"></a>

코드 변경의 효과를 보려면 완전한 기능을 설치할 수 있도록 WordPress 사이트 설정을 완료하세요.

1. 웹 브라우저에 사이트 URL을 입력합니다. URL은 Amazon EC2 인스턴스의 퍼블릭 DNS 주소에 `/WordPress` 확장자를 더한 것입니다. 이 예제 WordPress 사이트(예: Amazon EC2 인스턴스 퍼블릭 DNS 주소)의 경우 URL은 **http://ec2-01-234-567-890.compute-1.amazonaws.com/WordPress**입니다.

1. 사이트를 아직 설정하지 않은 경우 WordPress 기본 시작 페이지가 나타납니다. **Let's go\$1**를 선택합니다.

1. 기본 MySQL 데이터베이스를 사용하려면 데이터베이스 구성 페이지에서 다음 값을 입력합니다.
   + **데이터베이스 이름**: **test**
   + **사용자 이름**: **root**
   + **암호**: 비워 둠
   + **데이터베이스 호스트**: **localhost**
   + **테이블 접두사**: **wp\$1**

   **제출**을 선택하여 데이터베이스를 설정합니다.

1. 사이트 설정을 계속합니다. **시작** 페이지에서 원하는 값을 입력하고 **WordPress 설치**를 선택합니다. 설치가 완료되면 대시보드에 로그인할 수 있습니다.

**중요**  
 WordPress 애플리케이션을 배포하는 동안 **change\$1permissions.sh** 스크립트가 `/tmp/WordPress` 폴더의 사용 권한을 업데이트하여 누구나 쓸 수 있습니다. 이제 소유자만 쓸 수 있도록 다음 명령을 실행하여 사용 권한을 제한하는 것이 좋습니다.  

```
chmod -R 755 /var/www/html/WordPress
```

## 사이트 수정
<a name="tutorials-wordpress-update-and-redeploy-application-modify-code"></a>

WordPress 사이트를 수정하려면 개발 컴퓨터의 애플리케이션 폴더로 이동하세요.

```
cd /tmp/WordPress
```

사이트의 색상 중 일부를 수정하려면 `wp-content/themes/twentyfifteen/style.css` 파일에서 텍스트 편집기 또는 **sed**를 사용하여 `#fff`을(를) `#768331`(으)로 변경합니다.

Linux 또는 GNU가 **sed**인 다른 시스템에서에서는 다음을 사용합니다.

```
sed -i 's/#fff/#768331/g' wp-content/themes/twentyfifteen/style.css
```

MacOS, Unix 또는 BSD가 **sed**인 다른 시스템에서에서는 다음을 사용합니다.

```
sed -i '' 's/#fff/#768331/g' wp-content/themes/twentyfifteen/style.css
```

## 사이트 재배포
<a name="tutorials-wordpress-update-and-redeploy-application-deploy-updates"></a>

사이트의 코드를 수정했으므로 Amazon S3 및 CodeDeploy를 사용하여 사이트를 다시 배포합니다.

[애플리케이션의 파일을 단일 아카이브 파일로 묶고 아카이브 파일을 푸시합니다.](tutorials-wordpress-upload-application.md#tutorials-wordpress-upload-application-bundle-and-push-archive)에 설명된 대로 Amazon S3 변경 사항을 번들로 묶어 업로드합니다. (이러한 지침을 따를 때 애플리케이션을 만들 필요가 없다는 것을 기억하세요.) 수정 버전에 이전과 동일한 키(**WordPressApp.zip**)를 지정하세요. 이전에 생성한 것과 동일한 Amazon S3 버킷(예:**amzn-s3-demo-bucket**)에 업로드합니다.

 AWS CLI, CodeDeploy 콘솔 또는 CodeDeploy APIs를 사용하여 사이트를 재배포합니다.

**Topics**
+ [사이트를 재배포하려면(CLI)](#tutorials-wordpress-update-and-redeploy-application-deploy-updates-cli)
+ [사이트를 재배포하려면(콘솔)](#tutorials-wordpress-update-and-redeploy-application-deploy-updates-console)

### 사이트를 재배포하려면(CLI)
<a name="tutorials-wordpress-update-and-redeploy-application-deploy-updates-cli"></a>

**create-deployment** 명령을 호출하여 새로 업로드한 수정 버전을 기반으로 배포를 만듭니다. **WordPress\$1App**(이)라는 애플리케이션, **CodeDeployDefault.OneAtATime**(이)라는 배포 구성, **WordPress\$1DepGroup**(이)라는 배포 그룹, **amzn-s3-demo-bucket**(이)라는 버킷의 **WordPressApp.zip**(이)라는 수정 버전을 사용합니다.

```
 aws deploy create-deployment \
  --application-name WordPress_App \
  --deployment-config-name CodeDeployDefault.OneAtATime \
  --deployment-group-name WordPress_DepGroup \  
  --s3-location bucket=amzn-s3-demo-bucket,bundleType=zip,key=WordPressApp.zip
```

[배포 모니터링 및 문제 해결](tutorials-wordpress-deploy-application.md#tutorials-wordpress-deploy-application-monitor)에 설명된 대로 배포의 상태를 확인할 수 있습니다.

CodeDeploy가 사이트를 재배포한 경우 웹 브라우저에서 사이트를 다시 방문하여 색상이 변경되었는지 확인합니다. (브라우저를 새로 고쳐야 할 수 있습니다.) 색상이 변경되었으면 제대로 수행된 것입니다. 사이트를 성공적으로 수정하고 재배포했습니다\$1

### 사이트를 재배포하려면(콘솔)
<a name="tutorials-wordpress-update-and-redeploy-application-deploy-updates-console"></a>

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/codedeploy](https://console.aws.amazon.com/codedeploy) CodeDeploy 콘솔을 엽니다.
**참고**  
[CodeDeploy 시작하기](getting-started-codedeploy.md)에서 설정한 사용자와 동일한 사용자로 로그인합니다.

1. 탐색 창에서 **배포**를 확장하고 **애플리케이션**을 선택합니다.

1. 애플리케이션 목록에서 **WordPress\$1App**을 선택합니다.

1. **배포 그룹** 탭에서 **WordPress\$1DepGroup**을(를) 선택합니다.

1. **배포 만들기**를 선택합니다.

1. **배포 만들기** 페이지에서,

   1. **배포 그룹**에서 **WordPress\$1DepGroup**을(를) 선택합니다.

   1. **리포지토리 유형** 영역에서 **내 애플리케이션이 Amazon S3에 저장됨**을 선택한 다음 수정 버전의 Amazon S3 링크를 **수정 버전 위치** 상자에 복사합니다. 링크 값을 찾으려면: 

      1. 별도의 브라우저 탭에서:

         에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) Amazon S3 콘솔을 엽니다.

          **amzn-s3-demo-bucket**을 찾아서 열고 수정 버전 **WordPressApp.zip**을 선택합니다.

      1.  Amazon S3 콘솔에서 **속성** 창이 보이지 않으면, **속성** 버튼을 선택합니다.

      1.  **속성** 패널에서 **링크** 필드의 값을 CodeDeploy 콘솔의 **수정 버전 위치** 상자로 복사합니다.

   1. 파일 형식을 찾을 수 없다는 메시지가 표시되는 경우, **.zip**을 선택합니다.

   1. **배포 설명** 상자는 비워 둡니다.

   1. **배포 그룹 재정의**를 확장하고 **배포 구성**에서 **CodeDeployDefault.OneAtATime**을 선택합니다.

   1. **Start deployment(배포 시작)**를 선택합니다. 새로 만든 배포에 대한 정보가 [**Deployments**] 페이지에 표시됩니다.

   1. [배포 모니터링 및 문제 해결](tutorials-wordpress-deploy-application.md#tutorials-wordpress-deploy-application-monitor)에 설명된 대로 배포의 상태를 확인할 수 있습니다.

      CodeDeploy가 사이트를 재배포한 경우 웹 브라우저에서 사이트를 다시 방문하여 색상이 변경되었는지 확인합니다. (브라우저를 새로 고쳐야 할 수 있습니다.) 색상이 변경되었으면 제대로 수행된 것입니다. 사이트를 성공적으로 수정하고 재배포했습니다\$1

# 6단계: WordPress 애플리케이션 및 관련 리소스 정리
<a name="tutorials-wordpress-clean-up"></a>

이제 WordPress 코드를 성공적으로 업데이트하고 사이트를 다시 배포했습니다. 이 튜토리얼에서 만든 리소스에 계속해서 비용이 부과되지 않도록 하려면 다음 항목을 삭제해야 합니다.
+ 모든 CloudFormation 스택(또는 외부에서 생성한 경우 Amazon EC2 인스턴스 종료 CloudFormation).
+ 모든 Amazon S3 버킷.
+ CodeDeploy의 `WordPress_App` 애플리케이션.
+ CodeDeploy 에이전트에 대한 AWS Systems Manager 상태 관리자 연결입니다.

 AWS CLI, CloudFormation, Amazon S3, Amazon EC2 및 CodeDeploy 콘솔 또는 AWS APIs를 수행할 수 있습니다.

**Topics**
+ [리소스를 정리하려면(CLI)](#tutorials-wordpress-clean-up-cli)
+ [리소스를 정리하려면(콘솔)](#tutorials-wordpress-clean-up-console)
+ [다음 단계](#tutorials-wordpress-clean-up-whats-next)

## 리소스를 정리하려면(CLI)
<a name="tutorials-wordpress-clean-up-cli"></a>

1. 이 자습서에서 CloudFormation 템플릿을 사용한 경우 라는 스택에 대해 **delete-stack** 명령을 호출합니다**CodeDeployDemoStack**. 그러면 함께 제공되는 모든 Amazon EC2 인스턴스가 종료되고 스택에서 생성한 모든 동반 IAM 역할이 삭제됩니다.

   ```
   aws cloudformation delete-stack --stack-name CodeDeployDemoStack
   ```

1. Amazon S3 버킷을 삭제하려면 **amzn-s3-demo-bucket**(이)라는 버킷에 대해 **--recursive** 스위치를 사용하여 **rm** 명령을 호출합니다. 버킷을 비롯해 버킷에 있는 모든 객체가 삭제됩니다.

   ```
   aws s3 rm s3://amzn-s3-demo-bucket --recursive --region region
   ```

1. `WordPress_App` 애플리케이션을 삭제하려면 **delete-application** 명령을 호출합니다. 이렇게 하면 애플리케이션에 대해 연결된 배포 그룹 레코드와 배포 레코드가 모두 삭제됩니다.

   ```
   aws deploy delete-application --application-name WordPress_App
   ```

1. Systems Manager 상태 관리자 연결을 삭제하려면 **delete-association** 명령을 호출합니다.

   ```
   aws ssm delete-association --assocation-id association-id
   ```

   **describe-association** 명령을 호출하여 *association-id*를 얻을 수 있습니다.

   ```
   aws ssm describe-association --name AWS-ConfigureAWSPackage --targets Key=tag:Name,Values=CodeDeployDemo
   ```

이 자습서에서 CloudFormation 스택을 사용하지 않은 경우 **terminate-instances** 명령을 호출하여 수동으로 생성한 Amazon EC2 인스턴스를 종료합니다. 종료할 Amazon EC2 인스턴스의 ID를 입력합니다.

```
aws ec2 terminate-instances --instance-ids instanceId
```

## 리소스를 정리하려면(콘솔)
<a name="tutorials-wordpress-clean-up-console"></a>

이 자습서에서 CloudFormation 템플릿을 사용한 경우 연결된 CloudFormation 스택을 삭제합니다.

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) CloudFormation 콘솔을 엽니다.

1. **필터** 상자에 이전에 생성한 CloudFormation 스택 이름(예: )을 입력합니다**CodeDeployDemoStack**.

1. 스택 이름 옆의 상자를 선택합니다. **작업** 메뉴에서 **스택 삭제**를 선택합니다.

   CloudFormation 는 스택을 삭제하고, 함께 제공되는 모든 Amazon EC2 인스턴스를 종료하고, 함께 제공되는 모든 IAM 역할을 삭제합니다.

 CloudFormation 스택 외부에서 생성한 Amazon EC2 인스턴스를 종료하려면:

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) Amazon EC2 콘솔을 엽니다.

1. **인스턴스** 목록에서 **인스턴스**를 선택합니다.

1. 검색 상자에 종료할 Amazon EC2 인스턴스의 이름(예: **CodeDeployDemo**)을 입력한 후 Enter를 누릅니다.

1. Amazon EC2 인스턴스의 이름을 선택합니다.

1. [**Actions**] 메뉴에서 [**Instance State**]를 가리킨 다음 [**Terminate**]를 선택합니다. 메시지가 나타나면 [**Yes, Terminate**]를 선택합니다.

인스턴스마다 이들 단계를 반복합니다.

Amazon S3 버킷을 삭제하려면

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) Amazon S3 콘솔을 엽니다.

1. 버킷 목록에서 이전에 생성한 Amazon S3 버킷의 이름(예: **amzn-s3-demo-bucket**)을 찾아서 선택합니다.

1. 버킷을 삭제하려면 먼저 버킷의 콘텐츠를 삭제해야 합니다. 버킷에 있는 모든 파일(예: **WordPressApp.zip**)을 선택합니다. **작업** 메뉴에서 **삭제**를 선택합니다. 삭제 확인 메시지가 표시되면 **확인**을 선택합니다.

1. 버킷을 비운 후 버킷을 삭제할 수 있습니다. 버킷 목록에서 버킷 행을 선택합니다(버킷 이름은 아님). **버킷 삭제**를 선택하고 확인하라는 메시지가 나타나면**확인**을 선택합니다.

CodeDeploy에서 `WordPress_App` 애플리케이션을 삭제하려면

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/codedeploy](https://console.aws.amazon.com/codedeploy) CodeDeploy 콘솔을 엽니다.
**참고**  
[CodeDeploy 시작하기](getting-started-codedeploy.md)에서 설정한 사용자와 동일한 사용자로 로그인합니다.

1. 탐색 창에서 **배포**를 확장하고 **애플리케이션**을 선택합니다.

1. 애플리케이션 목록에서 **WordPress\$1App**을 선택합니다.

1. **애플리케이션 세부 정보** 페이지에서 **애플리케이션 삭제**를 선택합니다.

1. 메시지가 표시되면 삭제를 확인할 애플리케이션의 이름을 입력한 후 **삭제**를 선택합니다.

Systems Manager 상태 관리자 연결을 삭제하려면

1. https://console.aws.amazon.com/systems-manager AWS Systems Manager 콘솔을 엽니다.

1. 탐색 창에서 **상태 관리자**를 선택합니다.

1. 생성한 연결을 선택하고 **삭제**를 선택합니다.

## 다음 단계
<a name="tutorials-wordpress-clean-up-whats-next"></a>

축하합니다\$1 CodeDeploy 배포를 성공적으로 완료했고 사이트의 코드를 업데이트하고 다시 배포했습니다.

# 튜토리얼: CodeDeploy를 사용하여 "hello, world\$1" 애플리케이션 배포(Windows Server)
<a name="tutorials-windows"></a>

이 튜토리얼에서는 IIS(인터넷 정보 서비스)를 웹 서버로 실행하는 단일 Windows Server Amazon EC2 인스턴스에 단일 웹 페이지를 배포합니다. 이 웹 페이지는 간단한 “Hello, World\$1” 메시지를 표시합니다.

찾는 항목이 보이지 않습니까?
+ Amazon Linux 또는 Red Hat Enterprise Linux(RHEL) Amazon EC2 인스턴스에 배포하는 방법을 연습하려면 [튜토리얼: Amazon EC2 인스턴스(Amazon Linux 또는 Red Hat Enterprise Linux 및 Linux, macOS 또는 Unix)에 WordPress 배포](tutorials-wordpress.md) 단원을 참조하세요.
+ 온-프레미스 인스턴스에 배포하는 방법을 연습하려면 [튜토리얼: CodeDeploy를 사용하여 온프레미스 인스턴스에 애플리케이션 배포(Windows Server, Ubuntu Server 또는 Red Hat Enterprise Linux)](tutorials-on-premises-instance.md) 단원을 참조하세요.

이 튜토리얼의 단계는 Windows 관점에서 제공됩니다. Linux, macOS 또는 Unix를 실행하는 로컬 컴퓨터에서 이러한 단계를 대부분 완료할 수 있지만 `c:\temp`와(과) 같은 Windows 기반 디렉터리 경로를 포함하는 경로를 조정해야 합니다. 또한 Amazon EC2 인스턴스에 연결하려면 RDP(원격 데스크톱 프로토콜)를 통해 Windows Server를 실행하는 Amazon EC2 인스턴스에 연결할 수 있는 클라이언트 애플리케이션이 필요합니다. Windows에는 기본적으로 RDP 연결 클라이언트 애플리케이션이 포함되어 있습니다.

이 자습서를 시작하기 전에 사용자 구성, 설치 또는 업그레이드, IAM 인스턴스 프로파일 및 서비스 역할 AWS CLI생성 [CodeDeploy 시작하기](getting-started-codedeploy.md)등의 사전 조건을 완료해야 합니다.

**Topics**
+ [1단계: Windows Server Amazon EC2 인스턴스 시작](tutorials-windows-launch-instance.md)
+ [2단계: Windows Server Amazon EC2 인스턴스에 배포하도록 원본 콘텐츠 구성](tutorials-windows-configure-content.md)
+ [3단계: "hello, world\$1" 애플리케이션을 Amazon S3에 업로드](tutorials-windows-upload-application.md)
+ [4단계: Hello World 애플리케이션 배포](tutorials-windows-deploy-application.md)
+ [5 단계: "hello, world\$1" 애플리케이션 업데이트 및 재배포](tutorials-windows-update-and-redeploy-application.md)
+ [6단계: "hello, world\$1" 애플리케이션 및 관련 리소스 정리](tutorials-windows-clean-up.md)

# 1단계: Windows Server Amazon EC2 인스턴스 시작
<a name="tutorials-windows-launch-instance"></a>

Hello, World 애플리케이션을 CodeDeploy로 배포하려면 Windows Server를 실행하는 Amazon EC2 인스턴스가 필요합니다.

[CodeDeploy를 위한 Amazon EC2 인스턴스 생성](instances-ec2-create.md)의 지침을 따르세요. Amazon EC2 인스턴스 태그를 인스턴스에 할당할 준비가 되면 태그 키 **Name**와(과) 태그 값 **CodeDeployDemo**을(를) 지정해야 합니다. 태그 키 또는 태그 값을 다르게 지정한 경우 [4단계: Hello World 애플리케이션 배포](tutorials-windows-deploy-application.md)의 지침을 따르면 예기치 않은 결과가 발생할 수 있습니다.

Amazon EC2 인스턴스를 시작한 후에는 이 페이지로 돌아와 계속해서 다음 섹션으로 진행합니다. 다음 단계로 [CodeDeploy를 사용하여 애플리케이션 생성](applications-create.md) 단원을 진행하지 마십시오.

## Amazon EC2 인스턴스에 연결
<a name="tutorials-windows-launch-instance-connect"></a>

Amazon EC2 인스턴스 시작 후 다음 지침에 따라 해당 인스턴스에 연결하는 연습을 합니다.

**참고**  
다음 지침에서는 Windows와 Windows Desktop Connection 클라이언트 애플리케이션을 실행한다고 가정합니다. 자세한 내용은 [RDP를 사용하여 Windows 인스턴스에 연결](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/connecting_to_windows_instance.html) 단원을 참조하세요. 다른 운영 체제 또는 기타 RDP 연결 클라이언트 애플리케이션의 경우 다음 지침을 조정해야 할 수 있습니다.

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) Amazon EC2 콘솔을 엽니다.

1. 탐색 창의 **인스턴스**에서 **인스턴스**를 선택합니다.

1. 목록에서 Windows Server 인스턴스를 찾아서 선택하세요.

1. **연결**을 선택합니다.

1. **암호 가져오기**를 선택한 다음 **파일 선택**을 선택합니다.

1. Windows Server Amazon EC2 인스턴스와 연결된 Amazon EC2 인스턴스 키 페어 파일을 찾아서 선택한 후 **열기**를 선택하세요.

1. **암호 해독**을 선택합니다. 표시되는 암호를 기록해 둡니다. 10단계에서 이 이름이 필요합니다.

1. [**Download Remote Desktop File**]을 선택한 후 파일을 엽니다.

1. 원격 연결 게시자를 식별할 수 없더라도 연결하라는 메시지가 표시되면 계속 진행합니다.

1. 7단계 메모해 둔 암호를 입력한 다음, 계속 진행합니다. (RDP 연결 클라이언트 애플리케이션에 사용자 이름을 입력하라는 메시지가 표시되면 **Administrator**를 입력하세요.)

1. 원격 컴퓨터의 자격 증명을 확인할 수 없더라도 연결하라는 메시지가 표시되면 계속 진행합니다.

1. 연결된 후에는 Windows Server를 실행하는 Amazon EC2 인스턴스의 데스크톱이 표시됩니다.

1. 이제 Amazon EC2 인스턴스와의 연결을 해제할 수 있습니다.
**주의**  
인스턴스를 중지하거나 종료하지 마십시오. 인스턴스를 중지하거나 종료할 경우 CodeDeploy가 인스턴스에 배포할 수 없습니다.

## Windows Server Amazon EC2 인스턴스에 HTTP 트래픽을 허용하는 인바운드 규칙 추가
<a name="tutorials-windows-launch-instance-add-inbound-rule"></a>

다음 단계에서는 브라우저의 Windows Server Amazon EC2 인스턴스에서 배포된 웹페이지를 볼 수 있도록 Amazon EC2 인스턴스에 열린 HTTP 포트가 있는지 확인합니다.

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) Amazon EC2 콘솔을 엽니다.

1. **인스턴스**를 선택한 후 인스턴스를 선택합니다.

1. **설명** 탭의 **보안 그룹**에서 **인바운드 규칙 보기**를 선택합니다.

   보안 그룹에 다음과 같은 규칙 목록이 있어야 합니다.

   ```
   Security Groups associated with i-1234567890abcdef0
    Ports     Protocol     Source     launch-wizard-N
    22        tcp          0.0.0.0/0          ✔
   ```

1.  **보안 그룹**에서 Amazon EC2 인스턴스를 위한 보안 그룹을 선택합니다. 이름은 **launch-wizard-*N***이 될 수 있습니다. 이름의 ***N***은 인스턴스가 생성될 때 보안 그룹에 할당된 번호입니다.

    **인바운드** 탭을 선택합니다. 인스턴스의 보안 그룹이 올바르게 구성되어 있으면 다음 값이 있는 규칙이 표시되어야 합니다.
   + **유형**: HTTP
   + **프로토콜**: TCP
   + **포트 범위**: 80
   + **소스**: 0.0.0.0/0

1.  이러한 값이 있는 규칙이 없는 경우 [보안 그룹에 규칙 추가](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html#adding-security-group-rule)의 절차를 사용하여 해당 값을 새 보안 규칙에 추가하세요.

# 2단계: Windows Server Amazon EC2 인스턴스에 배포하도록 원본 콘텐츠 구성
<a name="tutorials-windows-configure-content"></a>

이제 Amazon EC2 인스턴스에 배포할 수 있도록 애플리케이션의 소스 콘텐츠를 구성해야 합니다. 이 튜토리얼에서는 Windows Server를 실행하는 Amazon EC2 인스턴스에 단일 웹 페이지를 배포합니다. 이 인스턴스는 IIS(인터넷 정보 서비스)를 웹 서버로 실행합니다. 이 웹 페이지는 간단한 “Hello, World\$1” 메시지를 표시합니다.

**Topics**
+ [웹 페이지 만들기](#tutorials-windows-configure-content-download-code)
+ [애플리케이션을 실행하는 스크립트 만들기](#tutorials-windows-configure-content-create-scripts)
+ [애플리케이션 사양 파일 추가](#tutorials-windows-configure-content-add-appspec-file)

## 웹 페이지 만들기
<a name="tutorials-windows-configure-content-download-code"></a>

1. `c:\temp` 폴더에 `HelloWorldApp`(이)라는 하위 디렉터리(하위 폴더)를 만든 다음 다음 해당 폴더로 전환합니다.

   ```
   mkdir c:\temp\HelloWorldApp
   cd c:\temp\HelloWorldApp
   ```
**참고**  
`c:\temp` 또는 `HelloWorldApp`(이)라는 하위 폴더의 위치를 사용할 필요가 없습니다. 다른 위치 또는 하위 폴더를 사용하는 경우 이 자습서 전체에서 이를 사용해야 합니다.

1. 텍스트 편집기를 사용하여 폴더 내에 파일을 생성합니다. 파일 이름을 `index.html`으로 지정합니다.

   ```
   notepad index.html
   ```

1. 파일에 다음 코드를 추가하고 파일을 저장합니다.

   ```
   <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
   <html>
   <head>
     <title>Hello, World!</title>
     <style>
       body {
         color: #ffffff;
         background-color: #0188cc;
         font-family: Arial, sans-serif;  
         font-size:14px;
       }
     </style>
   </head>
   <body>
     <div align="center"><h1>Hello, World!</h1></div>
     <div align="center"><h2>You have successfully deployed an application using CodeDeploy</h2></div>
     <div align="center">
       <p>What to do next? Take a look through the <a href="https://aws.amazon.com/codedeploy">CodeDeploy Documentation</a>.</p>
     </div>
   </body>
   </html>
   ```

## 애플리케이션을 실행하는 스크립트 만들기
<a name="tutorials-windows-configure-content-create-scripts"></a>

다음으로 CodeDeploy가 대상 Amazon EC2 인스턴스에 웹 서버를 설정하는 데 사용할 스크립트를 생성합니다.

1. 동일한 하위 폴더에서 `index.html` 파일이 저장되면 텍스트 편집기를 사용하여 다른 파일을 생성합니다. 파일 이름을 `before-install.bat`으로 지정합니다.

   ```
   notepad before-install.bat
   ```

1. 파일에 다음 배치 스크립트 코드를 추가하고 파일을 저장합니다.

   ```
   REM Install Internet Information Server (IIS).
   c:\Windows\Sysnative\WindowsPowerShell\v1.0\powershell.exe -Command Import-Module -Name ServerManager
   c:\Windows\Sysnative\WindowsPowerShell\v1.0\powershell.exe -Command Install-WindowsFeature Web-Server
   ```

## 애플리케이션 사양 파일 추가
<a name="tutorials-windows-configure-content-add-appspec-file"></a>

그런 다음 웹 페이지 및 배치 스크립트 파일 외에 애플리케이션 사양 파일(AppSpec file)을 추가합니다. AppSpec 파일은 CodeDeploy에서 다음을 위해 사용하는 [YAML](http://www.yaml.org) 형식 파일입니다.
+ 애플리케이션 수정 버전의 소스 파일을 인스턴스의 대상으로 매핑합니다.
+ 배포 중에 인스턴스에서 실행할 스크립트를 지정합니다.

AppSpec 파일의 이름은 `appspec.yml`이어야 합니다. 애플리케이션 소스 코드의 루트 폴더에 있어야 합니다.

1. 동일한 하위 폴더에서 `index.html` 및 `before-install.bat` 파일이 저장되면 텍스트 편집기를 사용하여 다른 파일을 생성합니다. 파일 이름을 `appspec.yml`으로 지정합니다.

   ```
   notepad appspec.yml
   ```

1. 파일에 다음 YAML 코드를 추가하고 파일을 저장합니다.

   ```
   version: 0.0
   os: windows
   files:
     - source: \index.html
       destination: c:\inetpub\wwwroot
   hooks:
     BeforeInstall:
       - location: \before-install.bat
         timeout: 900
   ```

CodeDeploy는 이 AppSpec 파일을 사용하여 `index.html` 파일을 애플리케이션 소스 코드의 루트 폴더에서 대상 Amazon EC2 인스턴스의 `c:\inetpub\wwwroot` 폴더로 복사합니다. 배포하는 동안 CodeDeploy는 **BeforeInstall** 배포 수명 주기 이벤트 중에 `before-install.bat` 배치 스크립트를 대상 Amazon EC2 인스턴스에서 실행합니다. 이 스크립트를 실행하는 데 900초(15분) 이상 걸리면 CodeDeploy는 배포를 중지하고 Amazon EC2 인스턴스에 대한 배포를 실패로 표시합니다.

이러한 설정에 대한 자세한 정보는 [CodeDeploy AppSpec 파일 참조](reference-appspec-file.md) 단원을 참조하세요.

**중요**  
이 파일에 있는 각 항목 사이의 공백 위치와 개수는 중요합니다. 공백이 올바르지 않으면 CodeDeploy는 디버깅하기 어려운 오류를 발생시킵니다. 자세한 내용은 [AppSpec 파일 간격](reference-appspec-file.md#reference-appspec-file-spacing) 단원을 참조하십시오.

# 3단계: "hello, world\$1" 애플리케이션을 Amazon S3에 업로드
<a name="tutorials-windows-upload-application"></a>

이제 CodeDeploy가 배포할 수 있는 위치에 소스 콘텐츠를 준비하고 업로드합니다. 다음 지침은 Amazon S3 버킷을 프로비저닝하고, 버킷에 대한 애플리케이션 수정 버전 파일을 준비하고, 수정 버전의 파일을 번들로 묶은 다음, 버전을 버킷에 푸시하는 방법을 보여 줍니다.

**참고**  
이 튜토리얼에서 다루지 않지만 CodeDeploy를 사용하여 애플리케이션을 GitHub 리포지토리에서 인스턴스로 배포할 수 있습니다. 자세한 내용은 [GitHub와 CodeDeploy 통합](integrations-partners-github.md) 단원을 참조하세요.

**Topics**
+ [Amazon S3 버킷 프로비저닝](#tutorials-windows-upload-application-create-s3-bucket)
+ [버킷에 대한 애플리케이션 파일 준비](#tutorials-windows-upload-application-prepare-application-files)
+ [애플리케이션의 파일을 단일 아카이브 파일로 묶고 아카이브 파일을 푸시합니다.](#tutorials-windows-upload-application-bundle-and-push-archive)

## Amazon S3 버킷 프로비저닝
<a name="tutorials-windows-upload-application-create-s3-bucket"></a>

스토리지 컨테이너 또는 Amazon S3의 *버킷*을 만듭니다(또는 기존 버킷 사용). 버킷에 수정 버전을 업로드할 수 있는지, 배포에 사용된 Amazon EC2 인스턴스가 버킷에서 수정 버전을 다운로드할 수 있는지 확인합니다.

 AWS CLI, Amazon S3 콘솔 또는 Amazon S3 APIs를 사용하여 Amazon S3 버킷을 생성할 수 있습니다. 버킷을 생성한 후에는 버킷과 CodeDeploy 사용자에게 액세스 권한을 부여해야 합니다.

**참고**  
버킷 이름은 모든 AWS 계정의 Amazon S3에서 고유해야 합니다. **amzn-s3-demo-bucket**을(를) 사용할 수 없는 경우, 다른 버킷 이름(예: **amzn-s3-demo-bucket** 뒤에 대시와 이니셜 또는 다른 고유 식별자가 옴)을 사용하세요. 그런 다음 이 자습서 전체에서 버킷 이름을 **amzn-s3-demo-bucket**(으)로 대체해야 합니다.  
Amazon S3 버킷은 대상 Amazon EC2 인스턴스가 시작되는 리전과 동일한 AWS 리전에서 생성되어야 합니다. 예를 들어 버킷을 미국 동부(버지니아) 리전에 생성한 경우 대상 Amazon EC2 인스턴스를 미국 동부(버지니아 북부) 리전에서 시작해야 합니다.

**Topics**
+ [Amazon S3 버킷을 생성하려면(CLI)](#tutorials-windows-upload-application-create-s3-bucket-cli)
+ [Amazon S3 버킷을 생성하려면(콘솔)](#tutorials-windows-upload-application-create-s3-bucket-console)
+ [Amazon S3 버킷 및 AWS 계정에 권한 부여](#tutorials-windows-upload-application-create-s3-bucket-grant-permission)

### Amazon S3 버킷을 생성하려면(CLI)
<a name="tutorials-windows-upload-application-create-s3-bucket-cli"></a>

**mb** 명령을 호출하여 이름이 **amzn-s3-demo-bucket**인 Amazon S3 버킷을 생성합니다.

```
aws s3 mb s3://amzn-s3-demo-bucket --region region
```

### Amazon S3 버킷을 생성하려면(콘솔)
<a name="tutorials-windows-upload-application-create-s3-bucket-console"></a>

1. [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

1. Amazon S3; 콘솔에서 **버킷 생성**을 선택합니다.

1. **버킷 이름** 상자에서 버킷의 이름을 입력합니다.

1. **리전** 목록에서 대상 리전을 선택한 후 **생성**을 선택합니다.

### Amazon S3 버킷 및 AWS 계정에 권한 부여
<a name="tutorials-windows-upload-application-create-s3-bucket-grant-permission"></a>

또한 Amazon S3 버킷으로 업로드할 수 있는 권한이 있어야 합니다. Amazon S3 버킷 정책을 통해 이러한 권한을 지정할 수 있습니다. 예를 들어 다음 Amazon S3 버킷 정책에서 와일드카드 문자(\$1)를 사용하면 AWS 계정이 라는 Amazon S3 버킷의 모든 디렉터리에 파일을 `111122223333` 업로드할 수 있습니다`amzn-s3-demo-bucket`.

```
{
    "Statement": [
        {
            "Action": [
                "s3:PutObject"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
            "Principal": {
                "AWS": [
                    "111122223333"
                ]
            }
        }
    ]
}
```

 AWS 계정 ID를 보려면 [AWS 계정 ID 찾기를 참조하세요](https://docs.aws.amazon.com/IAM/latest/UserGuide/console_account-alias.html#FindingYourAWSId).

이제 Amazon S3 버킷이 참여하는 각 Amazon EC2 인스턴스에서 다운로드 요청을 허용하는지 확인하는 것이 좋습니다. Amazon S3 버킷 정책을 통해 이를 지정할 수 있습니다. 예를 들어, 다음 Amazon S3 버킷 정책에서 와일드카드 문자(\$1)를 사용하면 `arn:aws:iam::444455556666:role/CodeDeployDemo` ARN이 포함된 IAM 인스턴스 프로파일이 연결된 Amazon EC2 인스턴스가 이름이 `amzn-s3-demo-bucket`인 Amazon S3 버킷의 디렉터리에서 파일을 다운로드할 수 있습니다.

```
{
    "Statement": [
        {
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::444455556666:role/CodeDeployDemo"
                ]
            }
        }
    ]
}
```

Amazon S3 버킷 정책 생성 및 연결에 대한 자세한 내용은 [버킷 정책 예제](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html)를 참조하세요.

[1단계: 설정](getting-started-setting-up.md)에서 만든 CodeDeploy 관리 사용자에게도 Amazon S3 버킷으로 개정 버전을 업로드할 수 있는 권한이 있어야 합니다. 이를 지정하는 한 가지 방법은 사용자의 권한 세트나 IAM 역할(사용자에게 수임을 허용한 역할)에 추가하는 IAM 정책을 사용하는 것입니다. 다음 IAM 정책은 사용자가 `amzn-s3-demo-bucket`이라는 Amazon S3 버킷의 어디에나 개정 버전을 업로드할 수 있도록 허용합니다.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	   
  "Statement":[
    {
      "Effect":"Allow",
      "Action":["s3:PutObject"],
      "Resource":"arn:aws:s3:::amzn-s3-demo-bucket/*"
    }
  ]
}
```

------

IAM 정책을 생성하는 방법에 대한 자세한 내용은 **IAM 사용 설명서의 [IAM 정책 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)을 참조하세요. 권한 세트에 정책을 추가하는 방법에 대한 자세한 내용은 **AWS IAM Identity Center 사용 설명서의 [Create a permission set](https://docs.aws.amazon.com/singlesignon/latest/userguide/howtocreatepermissionset.html)(권한 세트 생성)를 참조하세요.

## 버킷에 대한 애플리케이션 파일 준비
<a name="tutorials-windows-upload-application-prepare-application-files"></a>

웹 페이지, AppSpec 파일 및 스크립트가 개발 컴퓨터에서 다음과 같이 구성되어 있는지 확인하세요.

```
c:\
  |-- temp\
        |--HelloWorldApp\
             |-- appspec.yml
             |-- before-install.bat
             |-- index.html
```

## 애플리케이션의 파일을 단일 아카이브 파일로 묶고 아카이브 파일을 푸시합니다.
<a name="tutorials-windows-upload-application-bundle-and-push-archive"></a>

파일을 아카이브 파일(애플리케이션 *수정 버전*이라고도 함)로 번들링합니다.

**참고**  
객체를 버킷에 저장하거나 애플리케이션 수정 버전을 버킷으로 전송한 경우 요금이 부과될 수 있습니다. 자세한 내용은 [Amazon S3 요금](https://aws.amazon.com/s3/pricing/)을 참조하세요.

1. 개발 컴퓨터에서 파일이 저장된 폴더로 전환하세요.

   ```
   cd c:\temp\HelloWorldApp
   ```
**참고**  
이 폴더로 전환하지 않으면 현재 폴더에서 파일 번들링이 시작됩니다. 예를 들어 현재 폴더가 `c:\temp\HelloWorldApp` 대신 `c:\temp`이면 `c:\temp` 폴더의 파일 및 하위 폴더로 번들링이 시작되어 `HelloWorldApp` 하위 폴더보다 더 많은 폴더를 포함할 수 있습니다.

1. **create-application** 명령을 호출하여 CodeDeploy에서 이름이 **HelloWorld\$1App**인 새 애플리케이션을 등록합니다.

   ```
   aws deploy create-application --application-name HelloWorld_App
   ```

1. CodeDeploy [push](https://docs.aws.amazon.com/cli/latest/reference/deploy/push.html) 명령을 호출하여 파일을 묶고, 수정 버전을 Amazon S3로 업로드하고, 업로드된 수정 버전에 대한 정보를 CodeDeploy에 등록할 수 있습니다. 이 모든 작업을 한 번에 수행할 수 있습니다.

   ```
   aws deploy push --application-name HelloWorld_App --s3-location s3://amzn-s3-demo-bucket/HelloWorld_App.zip --ignore-hidden-files
   ```

   이 명령은 현재 디렉터리의 파일(숨겨진 파일 제외)을 단일 아카이브 파일(이름: `HelloWorld_App.zip`)로 번들링하고 수정 버전을 **amzn-s3-demo-bucket** 버킷에 업로드하고 업로드된 수정 버전에 대한 정보를 CodeDeploy에 등록합니다.

# 4단계: Hello World 애플리케이션 배포
<a name="tutorials-windows-deploy-application"></a>

이제 Amazon S3에 업로드한 샘플 Hello, World 애플리케이션 수정 버전을 배포합니다. AWS CLI 또는 CodeDeploy 콘솔을 사용하여 수정 버전을 배포하고 배포 진행 상황을 모니터링합니다. 애플리케이션 수정 배포에 성공한 후에는 결과를 확인합니다.

**Topics**
+ [CodeDeploy로 애플리케이션 수정 버전 배포](#tutorials-windows-deploy-application-create-deployment)
+ [배포 모니터링 및 문제 해결](#tutorials-windows-deploy-application-monitor)
+ [배포 확인](#tutorials-windows-deploy-application-verify)

## CodeDeploy로 애플리케이션 수정 버전 배포
<a name="tutorials-windows-deploy-application-create-deployment"></a>

 CLI 또는 콘솔을 사용하여 애플리케이션을 배포할 수 있습니다.

**Topics**
+ [애플리케이션 수정을 배포하려면(CLI)](#tutorials-windows-deploy-application-create-deployment-cli)
+ [애플리케이션 수정을 배포하려면(콘솔)](#tutorials-windows-deploy-application-create-deployment-console)

### 애플리케이션 수정을 배포하려면(CLI)
<a name="tutorials-windows-deploy-application-create-deployment-cli"></a>

1. 먼저 배포에는 배포 그룹이 필요합니다. 그러나 배포 그룹을 만들기 전에 서비스 역할 ARN이 필요합니다. 서비스 역할은 서비스에 사용자를 대신할 수 있는 권한을 부여하는 IAM 역할입니다. 이 경우에 서비스 역할은 CodeDeploy에 Amazon EC2 인스턴스에 액세스하여 Amazon EC2 인스턴스 태그를 확장할(읽을) 수 있는 권한을 부여합니다.

   [서비스 역할 생성(CLI)](getting-started-create-service-role.md#getting-started-create-service-role-cli)의 지침에 따라 앞에서 서비스 역할을 생성했습니다. 서비스 역할의 ARN을 확인하려면 [서비스 역할 ARN 확인(CLI)](getting-started-create-service-role.md#getting-started-get-service-role-cli) 단원을 참조하세요.

1. 이제 ARN이 있으므로 해당 서비스 역할 ARN으로 **create-deployment-group** 명령을 호출하고, **CodeDeployDemo**(이)라는 Amazon EC2 인스턴스 태그와 **CodeDeployDefault.OneAtATime**(이)라는 배포 구성을 사용하여 **HelloWorld\$1App**(이)라는 애플리케이션과 연결된 **HelloWorld\$1DepGroup**(이)라는 배포 그룹을 만듭니다.

   ```
   aws deploy create-deployment-group --application-name HelloWorld_App --deployment-group-name HelloWorld_DepGroup --deployment-config-name CodeDeployDefault.OneAtATime --ec2-tag-filters Key=Name,Value=CodeDeployDemo,Type=KEY_AND_VALUE --service-role-arn serviceRoleARN
   ```
**참고**  
[create-deployment-group](https://docs.aws.amazon.com/cli/latest/reference/deploy/create-deployment-group.html) 명령은 배포 및 인스턴스의 지정된 이벤트에 대해 주제의 구독자에게 Amazon SNS 알림을 전송하게 하는 트리거를 생성합니다. 또한 해당 명령은 Amazon CloudWatch 경보 모니터링 임계값에 도달한 경우 자동으로 배포를 롤백하고 배포를 중지하도록 경보를 설정하는 옵션을 지원합니다. 이 작업에 대한 명령은 이 자습서에 포함되지 않습니다.

1. 배포를 만들기 전에 배포 그룹의 인스턴스에 CodeDeploy 에이전트가 설치되어 있어야 합니다. AWS Systems Manager 를 사용하여 명령줄에서 다음 명령으로 에이전트를 설치할 수 있습니다.

   ```
   aws ssm create-association --name AWS-ConfigureAWSPackage --targets Key=tag:Name,Values=CodeDeployDemo --parameters action=Install,name=AWSCodeDeployAgent --schedule-expression "cron(0 2 ? * SUN *)" 
   ```

   이 명령은 Systems Manager 상태 관리자에 연결을 생성하여 CodeDeploy 에이전트를 설치하고 매주 일요일 오전 2시에 업데이트를 시도합니다. CodeDeploy 에이전트에 대한 자세한 내용은 [CodeDeploy 에이전트 작업](https://docs.aws.amazon.com/codedeploy/latest/userguide/codedeploy-agent.html)을 참조하세요. Systems Manager에 대한 자세한 내용은 [AWS Systems Manager란 무엇입니까](https://docs.aws.amazon.com/systems-manager/latest/userguide/what-is-systems-manager.html)를 참조하세요.

1. 이제 **create-deployment** 명령을 호출하고 **HelloWorld\$1App**이라는 버킷에 있는 **CodeDeployDefault.OneAtATime**이라는 애플리케이션 수정을 사용하여 **HelloWorld\$1DepGroup**이라는 애플리케이션, **HelloWorld\$1App.zip**이라는 배포 구성 및 **amzn-s3-demo-bucket**이라는 배포 그룹과 연결된 배포를 만듭니다.

   ```
   aws deploy create-deployment --application-name HelloWorld_App --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name HelloWorld_DepGroup --s3-location bucket=amzn-s3-demo-bucket,bundleType=zip,key=HelloWorld_App.zip
   ```

### 애플리케이션 수정을 배포하려면(콘솔)
<a name="tutorials-windows-deploy-application-create-deployment-console"></a>

1. CodeDeploy 콘솔을 사용하여 애플리케이션 수정을 배포하기 전에 서비스 역할 ARN이 필요합니다. 서비스 역할은 서비스에 사용자를 대신할 수 있는 권한을 부여하는 IAM 역할입니다. 이 경우에 서비스 역할은 CodeDeploy에 Amazon EC2 인스턴스에 액세스하여 Amazon EC2 인스턴스 태그를 확장할(읽을) 수 있는 권한을 부여합니다.

   [서비스 역할 생성(콘솔)](getting-started-create-service-role.md#getting-started-create-service-role-console)의 지침에 따라 앞에서 서비스 역할을 생성했습니다. 서비스 역할의 ARN을 확인하려면 [서비스 역할 ARN 확인(콘솔)](getting-started-create-service-role.md#getting-started-get-service-role-console) 단원을 참조하세요.

1. 이제 ARN이 있으므로 CodeDeploy 콘솔을 사용하여 애플리케이션 수정을 배포할 수 있습니다.

   에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/codedeploy](https://console.aws.amazon.com/codedeploy) CodeDeploy 콘솔을 엽니다.
**참고**  
[CodeDeploy 시작하기](getting-started-codedeploy.md)에서 설정한 사용자와 동일한 사용자로 로그인합니다.

1. 탐색 창에서 **배포**를 확장하고 **애플리케이션**을 선택합니다.

1. **HelloWorld\$1App**을 선택합니다.

1. **배포 그룹** 탭에서 **Create deployment group(배포 그룹 생성)**을 선택합니다.

1. **Deployment group name(배포 그룹 이름)**에 **HelloWorld\$1DepGroup**을 입력합니다.

1. **서비스 역할**에서 서비스 역할의 이름을 선택합니다.

1. **배포 유형**에서 **In-place(현재 위치)**를 선택합니다.

1. **환경 구성**에서 **Amazon EC2 인스턴스**를 선택합니다.

1. 를 **사용한 에이전트 구성 AWS Systems Manager**에서 기본값을 유지합니다.

1. **키**에 **Name**을(를) 입력합니다.

1. **값**에 **CodeDeployDemo**을(를) 입력합니다.

1. **배포 구성**에서 **CodeDeployDefault.OneAtATime**을 선택합니다.

1. **로드 밸런서**에서 **Enable load balancing(로드 밸런싱 활성화)**을 선택 해제합니다.

1. [**Create deployment group**]을 선택합니다.

1. **배포 만들기**를 선택합니다.

1. **배포 그룹**에서 **HelloWorld\$1DepGroup**을 선택합니다.

1. **수정 유형**에서 **애플리케이션을 Amazon S3에 저장**을 선택한 후 **수정 버전 위치**에 이전에 Amazon S3에 업로드한 샘플 Hello, World 애플리케이션 수정 버전의 위치를 입력합니다. 위치를 가져오려면:

   1. [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)에서 S3 콘솔을 엽니다.

   1. 버킷 목록에서 **amzn-s3-demo-bucket**(또는 애플리케이션 수정 버전을 업로드한 버킷 이름)을 선택합니다.

   1. 객체 목록에서 [**HelloWorld\$1App.zip**]을 선택합니다.

   1. **개요** 탭에서 **경로 복사**를 선택합니다.

   1. CodeDeploy 콘솔로 돌아가서 **수정 위치**에 **링크** 필드 값을 붙여 넣습니다.

1. **수정 파일 형식**으로 **.zip**을 선택합니다.

1. (선택 사항) **배포 설명**에 설명을 입력합니다.

1. **배포 만들기**를 선택합니다. 새로 만든 배포에 대한 정보가 [**Deployments**] 페이지에 표시됩니다.

## 배포 모니터링 및 문제 해결
<a name="tutorials-windows-deploy-application-monitor"></a>

 AWS CLI 또는 콘솔을 사용하여 배포를 모니터링하고 문제를 해결합니다.

**Topics**
+ [배포를 모니터링하고 문제를 해결하려면(CLI)](#tutorials-windows-deploy-application-monitor-cli)
+ [배포를 모니터링하고 문제를 해결하려면(콘솔)](#tutorials-windows-deploy-application-monitor-console)

### 배포를 모니터링하고 문제를 해결하려면(CLI)
<a name="tutorials-windows-deploy-application-monitor-cli"></a>

1. **HelloWorld\$1App**이라는 애플리케이션 및 **HelloWorld\$1DepGroup**이라는 배포 그룹에 대해 **list-deployments** 명령을 호출하여 배포 ID를 가져옵니다.

   ```
   aws deploy list-deployments --application-name HelloWorld_App --deployment-group-name HelloWorld_DepGroup --query "deployments" --output text
   ```

1. 배포 ID로 **get-deployment** 명령을 호출합니다.

   ```
   aws deploy get-deployment --deployment-id deploymentID --query "deploymentInfo.status" --output text
   ```

1. 이 명령으로 배포의 전체 상태가 반환됩니다. 성공하면 `Succeeded` 값이 반환됩니다.

   전체 상태가 `Failed`이면 [list-deployment-instances](https://docs.aws.amazon.com/cli/latest/reference/deploy/list-deployment-instances.html) 및 [get-deployment-instance](https://docs.aws.amazon.com/cli/latest/reference/deploy/get-deployment-instance.html)와 같은 명령을 호출하여 문제를 해결할 수 있습니다. 문제 해결 옵션을 더 보려면 [인스턴스에 대한 배포 실패를 조사하기 위해 로그 파일 분석](troubleshooting-ec2-instances.md#troubleshooting-deploy-failures)을 참조하세요.

### 배포를 모니터링하고 문제를 해결하려면(콘솔)
<a name="tutorials-windows-deploy-application-monitor-console"></a>

CodeDeploy 콘솔의 **배포 ** 페이지에 있는 **상태** 열에서 배포 상태를 모니터링할 수 있습니다.

배포에 대한 자세한 정보를 확인하려면(특히, [**Status**] 열 값이 [**Succeeded**]가 아닌 경우):

1. **배포** 테이블에서 배포 ID를 선택합니다. 배포에 실패하면 실패 원인을 설명하는 메시지가 배포 세부 정보 페이지에 표시됩니다.

1. 배포의 인스턴스에 대한 자세한 정보가 표시됩니다. 배포에 실패한 후 배포에 실패한 Amazon EC2 인스턴스와 해당 단계를 확인할 수 있습니다.

1. 문제 해결을 더 수행해야 할 경우 [CodeDeploy에서 인스턴스 정보 보기](instances-view-details.md)와 같은 기능을 사용할 수 있습니다. 또한 Amazon EC2 인스턴스의 배포 로그 파일을 분석할 수도 있습니다. 자세한 내용은 [인스턴스에 대한 배포 실패를 조사하기 위해 로그 파일 분석](troubleshooting-ec2-instances.md#troubleshooting-deploy-failures) 단원을 참조하세요.

## 배포 확인
<a name="tutorials-windows-deploy-application-verify"></a>

배포에 성공한 후 설치가 작동 중인지 확인합니다. Amazon EC2 인스턴스의 퍼블릭 DNS 주소를 사용해 웹 브라우저에서 웹 페이지를 확인합니다. (퍼블릭 DNS 값을 확인하려면 Amazon EC2 콘솔에서 Amazon EC2 인스턴스를 선택하고 **설명** 탭에서 **퍼블릭 DNS**의 값을 찾습니다.)

예를 들어, Amazon EC2 인스턴스의 퍼블릭 DNS 주소가 **ec2-01-234-567-890.compute-1.amazonaws.com**이면 다음 URL을 사용합니다.

```
http://ec2-01-234-567-890.compute-1.amazonaws.com
```

성공하면 Hello, World 웹 페이지가 표시되어야 합니다.

# 5 단계: "hello, world\$1" 애플리케이션 업데이트 및 재배포
<a name="tutorials-windows-update-and-redeploy-application"></a>

이제 애플리케이션 수정 버전을 배포했으므로 개발 컴퓨터에서 웹 페이지의 코드를 업데이트한 다음 CodeDeploy를 사용하여 사이트를 다시 배포합니다. 재배포한 후에는 Amazon EC2 인스턴스에서 변경 내용을 확인할 수 있어야 합니다.

**Topics**
+ [웹 페이지 수정](#tutorials-windows-update-and-redeploy-application-modify-code)
+ [사이트 재배포](#tutorials-windows-update-and-redeploy-application-deploy-updates)

## 웹 페이지 수정
<a name="tutorials-windows-update-and-redeploy-application-modify-code"></a>

1. `c:\temp\HelloWorldApp` 하위 폴더로 이동하고 텍스트 편집기를 사용하여 `index.html` 파일을 수정합니다.

   ```
   cd c:\temp\HelloWorldApp
   notepad index.html
   ```

1. `index.html` 파일의 콘텐츠를 수정하여 웹 페이지의 배경 색과 텍스트 일부를 변경한 다음, 파일을 저장합니다.

   ```
   <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
   <html>
   <head>
     <title>Hello Again, World!</title>
     <style>
       body {
         color: #ffffff;
         background-color: #66cc00;
         font-family: Arial, sans-serif;  
         font-size:14px;
       }
     </style>
   </head>
   <body>
     <div align="center"><h1>Hello Again, World!</h1></div>
     <div align="center"><h2>You have successfully deployed a revision of an application using CodeDeploy</h2></div>
     <div align="center">
       <p>What to do next? Take a look through the <a href="https://aws.amazon.com/codedeploy">CodeDeploy Documentation</a>.</p>
     </div>
   </body>
   </html>
   ```

## 사이트 재배포
<a name="tutorials-windows-update-and-redeploy-application-deploy-updates"></a>

코드를 수정했으므로 Amazon S3 및 CodeDeploy를 사용하여 웹 페이지를 다시 배포합니다.

[애플리케이션의 파일을 단일 아카이브 파일로 묶고 아카이브 파일을 푸시합니다.](tutorials-windows-upload-application.md#tutorials-windows-upload-application-bundle-and-push-archive)에 설명된 대로 Amazon S3 변경 사항을 번들로 묶어 업로드합니다. 이러한 지침을 따르면 새 애플리케이션을 만들지 않아도 됩니다. 수정 버전에 이전과 동일한 키(**HelloWorld\$1App.zip**)를 지정하세요. 이전에 생성한 것과 동일한 Amazon S3 버킷(예:**amzn-s3-demo-bucket**)에 업로드합니다.

 AWS CLI 또는 CodeDeploy 콘솔을 사용하여 사이트를 재배포합니다.

**Topics**
+ [사이트를 재배포하려면(CLI)](#tutorials-windows-update-and-redeploy-application-deploy-updates-cli)
+ [사이트를 재배포하려면(콘솔)](#tutorials-windows-update-and-redeploy-application-deploy-updates-console)

### 사이트를 재배포하려면(CLI)
<a name="tutorials-windows-update-and-redeploy-application-deploy-updates-cli"></a>

**create-deployment** 명령을 호출하고 다시 **HelloWorld\$1App**(이)라는 애플리케이션, **CodeDeployDefault.OneAtATime**(이)라는 배포 구성, **HelloWorld\$1DepGroup**(이)라는 배포 그룹, **amzn-s3-demo-bucket**(이)라는 버킷에 있는 **HelloWorld\$1App.zip**(이)라는 애플리케이션 수정 버전을사용하여 업로드된 수정 버전을 기반으로 배포를 생성합니다.

```
 aws deploy create-deployment --application-name HelloWorld_App --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name HelloWorld_DepGroup --s3-location bucket=amzn-s3-demo-bucket,bundleType=zip,key=HelloWorld_App.zip
```

[배포 모니터링 및 문제 해결](tutorials-windows-deploy-application.md#tutorials-windows-deploy-application-monitor)에 설명된 대로 새 배포의 상태를 확인할 수 있습니다.

CodeDeploy가 사이트를 재배포한 경우 웹 브라우저에서 사이트를 다시 방문하여 웹 페이지의 배경색과 텍스트가 변경되었는지 확인합니다. (브라우저를 새로 고쳐야 할 수 있습니다.) 배경색과 텍스트가 변경되었으면 제대로 수행된 것입니다. 사이트를 수정하고 재배포했습니다\$1

### 사이트를 재배포하려면(콘솔)
<a name="tutorials-windows-update-and-redeploy-application-deploy-updates-console"></a>

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/codedeploy](https://console.aws.amazon.com/codedeploy) CodeDeploy 콘솔을 엽니다.
**참고**  
[CodeDeploy 시작하기](getting-started-codedeploy.md)에서 설정한 사용자와 동일한 사용자로 로그인합니다.

1. 탐색 창에서 **애플리케이션**을 선택합니다.

1. **애플리케이션** 목록에서 **HelloWorld\$1App**을 선택합니다.

1. **배포** 탭에서 **배포 만들기**를 선택합니다.

   1. **배포 그룹** 목록에서 **HelloWorld\$1DepGroup**을 선택합니다.

   1.  **수정 버전 위치**에 수정 버전에 대한 Amazon S3 링크를 입력합니다.

      링크 값을 찾으려면:

      1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) Amazon S3 콘솔을 엽니다.

         **amzn-s3-demo-bucket**을 찾아서 열고 Amazon S3 콘솔에서 수정 버전 **HelloWorld\$1App.zip**을 선택합니다.

      1. Amazon S3 콘솔에서 **속성** 창이 보이지 않으면, **속성** 버튼을 선택합니다.

      1. **속성** 창에서 **링크** 필드의 값을 복사합니다.

      1. CodeDeploy 콘솔로 돌아가서 **수정 버전 위치**에 링크를 붙여 넣습니다.

   1. **수정 버전 파일 형식**에서 파일 형식을 찾을 수 없다는 메시지가 표시되는 경우, **.zip**을 선택합니다.

   1. **배포 설명**은 비워 둡니다.

   1. **배포 구성** 목록의 **배포 그룹 재정의**를 확장하고 **CodeDeployDefault.OneAtATime**를 선택한 다음 **배포 만들기**를 선택합니다.

      [배포 모니터링 및 문제 해결](tutorials-windows-deploy-application.md#tutorials-windows-deploy-application-monitor)에 설명된 대로 배포의 상태를 확인할 수 있습니다.

      CodeDeploy가 사이트를 재배포한 경우 웹 브라우저에서 사이트를 다시 방문하여 웹 페이지의 배경색과 텍스트가 변경되었는지 확인합니다. (브라우저를 새로 고쳐야 할 수 있습니다.) 배경색과 텍스트가 변경되었으면 제대로 수행된 것입니다. 사이트를 수정하고 재배포했습니다\$1

# 6단계: "hello, world\$1" 애플리케이션 및 관련 리소스 정리
<a name="tutorials-windows-clean-up"></a>

이제 “Hello, World\$1” 코드를 업데이트했고 사이트를 다시 배포했습니다. 이 자습서를 완료하기 위해 만든 리소스에 계속해서 비용이 부과되지 않도록 하려면 다음 항목을 삭제해야 합니다.
+ 모든 CloudFormation 스택(또는 외부에서 생성한 경우 Amazon EC2 인스턴스 종료 CloudFormation).
+ 모든 Amazon S3 버킷.
+ CodeDeploy의 `HelloWorld_App` 애플리케이션.
+ CodeDeploy 에이전트에 대한 AWS Systems Manager 상태 관리자 연결입니다.

 AWS CLI, CloudFormation, Amazon S3, Amazon EC2 및 CodeDeploy 콘솔 또는 AWS APIs를 수행할 수 있습니다.

**Topics**
+ [정리 리소스를 사용하려면(CLI)](#tutorials-windows-clean-up-cli)
+ [리소스를 정리하려면(콘솔)](#tutorials-windows-clean-up-console)
+ [다음 단계](#tutorials-windows-clean-up-whats-next)

## 정리 리소스를 사용하려면(CLI)
<a name="tutorials-windows-clean-up-cli"></a>

1. 이 자습서에서 CloudFormation 스택을 사용한 경우 라는 스택에 대해 **delete-stack** 명령을 호출하여 스택을 삭제합니다**CodeDeployDemoStack**. 이렇게 하면 수반되는 모든 Amazon EC2 인스턴스가 종료되고 스택에서 원래 생성된 모든 동반 IAM 역할이 삭제됩니다.

   ```
   aws cloudformation delete-stack --stack-name CodeDeployDemoStack
   ```

1. Amazon S3 버킷을 삭제하려면 **amzn-s3-demo-bucket**(이)라는 버킷에 대해 **--recursive** 스위치를 사용하여 **rm** 명령을 호출합니다. 버킷을 비롯해 버킷에 있는 모든 객체가 삭제됩니다.

   ```
   aws s3 rm s3://amzn-s3-demo-bucket --recursive --region region
   ```

1. CodeDeploy 에서 `HelloWorld_App` 애플리케이션을 삭제하려면 **delete-application** 명령을 호출합니다. 이렇게 하면 애플리케이션에 대해 연결된 배포 그룹 레코드와 배포 레코드가 모두 삭제됩니다.

   ```
   aws deploy delete-application --application-name HelloWorld_App
   ```

1. Systems Manager 상태 관리자 연결을 삭제하려면 **delete-association** 명령을 호출합니다.

   ```
   aws ssm delete-association --assocation-id association-id
   ```

   **describe-association** 명령을 호출하여 *association-id*를 얻을 수 있습니다.

   ```
   aws ssm describe-association --name AWS-ConfigureAWSPackage --targets Key=tag:Name,Values=CodeDeployDemo
   ```

1. 이 자습서에서 CloudFormation 스택을 사용하지 않은 경우 **terminate-instances** 명령을 호출하여 수동으로 생성한 Amazon EC2 인스턴스를 종료합니다. 종료할 Amazon EC2 인스턴스의 ID를 입력합니다.

   ```
   aws ec2 terminate-instances --instance-ids instanceId
   ```

## 리소스를 정리하려면(콘솔)
<a name="tutorials-windows-clean-up-console"></a>

이 자습서에서 CloudFormation 템플릿을 사용한 경우 연결된 CloudFormation 스택을 삭제합니다.

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) CloudFormation 콘솔을 엽니다.

1. 검색 상자에 CloudFormation 스택 이름(예: **CodeDeployDemoStack**)을 입력합니다.

1. 스택 이름 옆의 상자를 선택합니다.

1. **작업** 메뉴에서 **스택 삭제**를 선택합니다. 이렇게 하면 스택이 삭제되고, 수반되는 모든 Amazon EC2 인스턴스가 종료되며, 수반되는 모든 IAM 역할이 삭제됩니다.

 CloudFormation 스택 외부에서 생성한 Amazon EC2 인스턴스를 종료하려면:

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) Amazon EC2 콘솔을 엽니다.

1. **인스턴스** 영역에서 **인스턴스**를 선택합니다.

1. 검색 상자에 종료할 Amazon EC2 인스턴스의 이름을 입력한 후 **Enter**를 누릅니다.

1. Amazon EC2 인스턴스를 선택합니다.

1. **작업**을 선택하고 **인스턴스 상태**를 가리킨 다음 **종료**를 선택합니다. 메시지가 나타나면 [**Yes, Terminate**]를 선택합니다. 추가 Amazon EC2 인스턴스에 대해 이 단계를 반복합니다.

Amazon S3 버킷을 삭제하려면

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) Amazon S3 콘솔을 엽니다.

1. 버킷 목록에서 Amazon S3 버킷의 이름(예: **amzn-s3-demo-bucket**)을 찾아서 선택합니다.

1. 버킷을 삭제하려면 먼저 버킷의 콘텐츠를 삭제해야 합니다. 버킷에 있는 모든 파일(예: **HelloWorld\$1App.zip**)을 선택합니다. **작업** 메뉴에서 **삭제**를 선택합니다. 삭제 확인 메시지가 표시되면 **확인**을 선택합니다.

1. 버킷을 비운 후 버킷을 삭제할 수 있습니다. 버킷 목록에서 버킷 행을 선택합니다(버킷 이름은 아님). **버킷 삭제**를 선택하고 확인하라는 메시지가 나타나면**확인**을 선택합니다.

CodeDeploy에서 `HelloWorld_App` 애플리케이션을 삭제하려면

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/codedeploy](https://console.aws.amazon.com/codedeploy) CodeDeploy 콘솔을 엽니다.
**참고**  
[CodeDeploy 시작하기](getting-started-codedeploy.md)에서 설정한 사용자와 동일한 사용자로 로그인합니다.

1. 탐색 창에서 **배포**를 확장하고 **애플리케이션**을 선택합니다.

   

1. **`HelloWorld_App`**을 선택합니다.

1. **애플리케이션 삭제**를 선택합니다.

1. 메시지가 표시되면 **Delete**를 입력한 후 **삭제**를 선택합니다.

Systems Manager 상태 관리자 연결을 삭제하려면

1. https://console.aws.amazon.com/systems-manager AWS Systems Manager 콘솔을 엽니다.

1. 탐색 창에서 **상태 관리자**를 선택합니다.

1. 생성한 연결을 선택하고 **삭제**를 선택합니다.

## 다음 단계
<a name="tutorials-windows-clean-up-whats-next"></a>

여기까지 진행했으면 CodeDeploy를 사용하여 배포를 성공적으로 완료한 것입니다. 축하합니다\$1

# 튜토리얼: CodeDeploy를 사용하여 온프레미스 인스턴스에 애플리케이션 배포(Windows Server, Ubuntu Server 또는 Red Hat Enterprise Linux)
<a name="tutorials-on-premises-instance"></a>

이 튜토리얼에서는 Windows Server, Ubuntu Server 또는 Red Hat Enterprise Linux(RHEL)를 실행하는 단일 온프레미스 인스턴스(Amazon EC2 온프레미스 인스턴스가 아닌 물리적 디바이스)에 샘플 애플리케이션 수정 버전을 배포하는 과정을 안내하여 CodeDeploy를 경험해 볼 수 있습니다. 온프레미스 인스턴스와 이러한 인스턴스가 CodeDeploy와 작동하는 방식에 대한 자세한 내용은 [CodeDeploy용 온프레미스 인스턴스 작업](instances-on-premises.md) 단원을 참조하세요.

찾는 항목이 보이지 않습니까?
+ Amazon Linux 또는 RHEL을 실행하는 Amazon EC2 인스턴스에 배포하려면 [튜토리얼: Amazon EC2 인스턴스(Amazon Linux 또는 Red Hat Enterprise Linux 및 Linux, macOS 또는 Unix)에 WordPress 배포](tutorials-wordpress.md) 단원을 참조하세요.
+ Windows Server를 실행하는 Amazon EC2 인스턴스에 배포하려면 [튜토리얼: CodeDeploy를 사용하여 "hello, world\$1" 애플리케이션 배포(Windows Server)](tutorials-windows.md) 단원을 참조하세요.

**Topics**
+ [사전 조건](tutorials-on-premises-instance-prerequisites.md)
+ [1단계: 온프레미스 인스턴스 구성](tutorials-on-premises-instance-1-configure-instance.md)
+ [2단계: 샘플 애플리케이션 수정 버전 만들기](tutorials-on-premises-instance-2-create-sample-revision.md)
+ [3단계: 애플리케이션 수정 버전을 번들링하여 Amazon S3에 업로드](tutorials-on-premises-instance-3-bundle-sample-revision.md)
+ [4단계: 애플리케이션 수정 버전 배포](tutorials-on-premises-instance-4-deploy-sample-revision.md)
+ [5단계: 배포 확인](tutorials-on-premises-instance-5-verify-deployment.md)
+ [6단계: 리소스 정리](tutorials-on-premises-instance-6-clean-up-resources.md)

# 사전 조건
<a name="tutorials-on-premises-instance-prerequisites"></a>

이 자습서를 시작하기 전에 사용자 구성, 설치 또는 업그레이드, 서비스 역할 AWS CLI생성 [CodeDeploy 시작하기](getting-started-codedeploy.md)등의 사전 조건을 완료해야 합니다. 사전 요구 사항에서 설명하는 것처럼 IAM 인스턴스 프로파일을 만들 필요는 없습니다. 온프레미스 인스턴스에서는 IAM 인스턴스 프로파일을 사용하지 않습니다.

온프레미스 인스턴스로 구성할 물리적 디바이스에서는 [CodeDeploy 에이전트에서 지원하는 운영 체제](codedeploy-agent.md#codedeploy-agent-supported-operating-systems)에 나열된 운영 체제 중 하나를 실행해야 합니다.

# 1단계: 온프레미스 인스턴스 구성
<a name="tutorials-on-premises-instance-1-configure-instance"></a>

온프레미스 인스턴스에 배포하기 전에 먼저, 온프레미스 인스턴스를 구성해야 합니다. [CodeDeploy용 온프레미스 인스턴스 작업](instances-on-premises.md)의 지침을 수행한 다음 이 페이지로 돌아오세요.

## CodeDeploy 에이전트 설치
<a name="tutorials-on-premises-instance-1-configure-instance-agent"></a>

온프레미스 인스턴스를 구성한 후 [CodeDeploy 에이전트 설치](https://docs.aws.amazon.com/codedeploy/latest/userguide/codedeploy-agent-operations-install.html)의 온프레미스 인스턴스 관련 단계를 수행하고 이 페이지로 돌아갑니다.

# 2단계: 샘플 애플리케이션 수정 버전 만들기
<a name="tutorials-on-premises-instance-2-create-sample-revision"></a>

이 단계에서는 온프레미스 인스턴스에 배포할 샘플 애플리케이션 수정을 만듭니다.

온프레미스 인스턴스에 어떤 소프트웨어 및 기능이 이미 설치되어 있는지 또는 조직의 정책에 따라 어떤 소프트웨어 및 기능을 설치할 수 있는지 파악하기 어렵기 때문에 여기서 제공되는 샘플 애플리케이션 수정 버전은 배치 스크립트(Windows Server용) 또는 셸 스크립트(Ubuntu Server 및 RHEL용)를 사용하여 온프레미스 인스턴스의 위치에 텍스트 파일을 씁니다. **Install**, **AfterInstall**, **ApplicationStart**, **ValidateService** 등 여러 CodeDeploy의 배포 수명 주기 이벤트 각각에 대해 하나의 파일이 작성됩니다. **BeforeInstall** 배포 수명 주기 이벤트 중 스크립트가 실행되어 이 샘플의 이전 배포 중 기록된 이전 파일을 제거하고 온프레미스 인스턴스에 새 파일을 기록할 위치를 만듭니다.

**참고**  
다음 중 하나에 해당하면 샘플 애플리케이션 수정을 배포하지 못할 수 있습니다.  
온프레미스 인스턴스에서 CodeDeploy 에이전트를 시작한 사용자에게 스크립트를 실행할 권한이 없는 경우
사용자에게 스크립트에 나열된 위치에 폴더를 만들거나 삭제할 권한이 없는 경우
사용자에게 스크립트에 나열된 위치에 텍스트 파일을 만들 권한이 없는 경우

**참고**  
Windows Server 인스턴스를 구성했는데 다른 샘플을 배포하고자 하는 경우 [튜토리얼: CodeDeploy를 사용하여 "hello, world\$1" 애플리케이션 배포(Windows Server)](tutorials-windows.md) 튜토리얼의 [2단계: Windows Server Amazon EC2 인스턴스에 배포하도록 원본 콘텐츠 구성](tutorials-windows-configure-content.md)에 나와 있는 샘플을 사용할 수 있습니다.  
RHEL 인스턴스를 구성했는데 다른 샘플을 배포하고자 하는 경우 [튜토리얼: Amazon EC2 인스턴스(Amazon Linux 또는 Red Hat Enterprise Linux 및 Linux, macOS 또는 Unix)에 WordPress 배포](tutorials-wordpress.md) 튜토리얼의 [2단계: Amazon Linux 또는 Red Hat Enterprise Linux Amazon EC2 인스턴스에 배포할 원본 콘텐츠 구성](tutorials-wordpress-configure-content.md)에 나와 있는 샘플을 사용할 수 있습니다.  
현재, Ubuntu Server에 사용할 수 있는 대체 샘플은 없습니다.

1. 개발 머신에 샘플 애플리케이션 수정의 파일을 저장할 `CodeDeployDemo-OnPrem`이라는 하위 디렉터리(하위 폴더)를 만든 다음 이 폴더로 이동합니다. 예를 들어 Windows Server에서는 `c:\temp` 폴더, Ubuntu Server 및 RHEL에서는 `/tmp` 폴더를 루트 폴더로 사용한다고 가정합니다. 다른 폴더를 사용하는 경우 이 자습서 전체에서 해당 폴더로 바꾸십시오.

   Windows의 경우:

   ```
   mkdir c:\temp\CodeDeployDemo-OnPrem
   cd c:\temp\CodeDeployDemo-OnPrem
   ```

   Linux, macOS, Unix의 경우:

   ```
   mkdir /tmp/CodeDeployDemo-OnPrem
   cd /tmp/CodeDeployDemo-OnPrem
   ```

1. `CodeDeployDemo-OnPrem` 하위 폴더의 루트에서 텍스트 편집기를 사용하여 `appspec.yml`이라는 파일과 `install.txt`라는 파일을 만듭니다.

   Windows Server의 경우 `appspec.yml`:

   ```
   version: 0.0
   os: windows
   files:
     - source: .\install.txt
       destination: c:\temp\CodeDeployExample
   hooks:
     BeforeInstall:
       - location: .\scripts\before-install.bat
         timeout: 900
     AfterInstall:
       - location: .\scripts\after-install.bat     
         timeout: 900
     ApplicationStart:
       - location: .\scripts\application-start.bat  
         timeout: 900
     ValidateService:
       - location: .\scripts\validate-service.bat    
         timeout: 900
   ```

   Ubuntu Server and RHEL의 경우 `appspec.yml`:

   ```
   version: 0.0
   os: linux
   files:
     - source: ./install.txt
       destination: /tmp/CodeDeployExample
   hooks:
     BeforeInstall:
       - location: ./scripts/before-install.sh
         timeout: 900
     AfterInstall:
       - location: ./scripts/after-install.sh
         timeout: 900
     ApplicationStart:
       - location: ./scripts/application-start.sh
         timeout: 900
     ValidateService:
       - location: ./scripts/validate-service.sh
         timeout: 900
   ```

   AppSpec 파일에 대한 자세한 내용은 [CodeDeploy에 대한 개정에 애플리케이션 사양 파일 추가](application-revisions-appspec-file.md) 및 [CodeDeploy AppSpec 파일 참조](reference-appspec-file.md)를 참조하세요.

   `install.txt`:

   ```
   The Install deployment lifecycle event successfully completed.
   ```

1. `CodeDeployDemo-OnPrem` 하위 폴더의 루트 아래에 `scripts` 하위 폴더를 만든 후 해당 하위 폴더로 이동합니다.

   Windows의 경우:

   ```
   mkdir c:\temp\CodeDeployDemo-OnPrem\scripts
   cd c:\temp\CodeDeployDemo-OnPrem\scripts
   ```

   Linux, macOS, Unix의 경우:

   ```
   mkdir -p /tmp/CodeDeployDemo-OnPrem/scripts
   cd /tmp/CodeDeployDemo-OnPrem/scripts
   ```

1. `scripts` 하위 폴더의 루트에서 텍스트 편집기를 사용하여 Windows Server의 경우 `before-install.bat`, `after-install.bat`, `application-start.bat`, `validate-service.bat`(이)라는 파일 4개를 작성하거나 Ubuntu Server 및 RHEL의 경우 `before-install.sh`, `after-install.sh`, `application-start.sh`, `validate-service.sh`(이)라는 파일 4개를 작성합니다.

   Windows Server의 경우: 

   `before-install.bat`:

   ```
   set FOLDER=%HOMEDRIVE%\temp\CodeDeployExample
   
   if exist %FOLDER% (
     rd /s /q "%FOLDER%"
   )
   
   mkdir %FOLDER%
   ```

   `after-install.bat`:

   ```
   cd %HOMEDRIVE%\temp\CodeDeployExample
   
   echo The AfterInstall deployment lifecycle event successfully completed. > after-install.txt
   ```

   `application-start.bat`:

   ```
   cd %HOMEDRIVE%\temp\CodeDeployExample
   
   echo The ApplicationStart deployment lifecycle event successfully completed. > application-start.txt
   ```

   `validate-service.bat`:

   ```
   cd %HOMEDRIVE%\temp\CodeDeployExample
   
   echo The ValidateService deployment lifecycle event successfully completed. > validate-service.txt
   ```

   Ubuntu Server and RHEL의 경우 :

   `before-install.sh`:

   ```
   #!/bin/bash
   export FOLDER=/tmp/CodeDeployExample
   
   if [ -d $FOLDER ]
   then
    rm -rf $FOLDER
   fi
   
   mkdir -p $FOLDER
   ```

   `after-install.sh`:

   ```
   #!/bin/bash
   cd /tmp/CodeDeployExample
   
   echo "The AfterInstall deployment lifecycle event successfully completed." > after-install.txt
   ```

   `application-start.sh`:

   ```
   #!/bin/bash
   cd /tmp/CodeDeployExample
   
   echo "The ApplicationStart deployment lifecycle event successfully completed." > application-start.txt
   ```

   `validate-service.sh`:

   ```
   #!/bin/bash
   cd /tmp/CodeDeployExample
   
   echo "The ValidateService deployment lifecycle event successfully completed." > validate-service.txt
   
   unset FOLDER
   ```

1. Ubuntu Server 및 RHEL에서만 네 개의 셸 스크립트에 실행 권한이 있는지 확인하세요.

   ```
   chmod +x ./scripts/*
   ```

# 3단계: 애플리케이션 수정 버전을 번들링하여 Amazon S3에 업로드
<a name="tutorials-on-premises-instance-3-bundle-sample-revision"></a>

애플리케이션 수정 버전을 배포하려면 파일을 번들링한 다음 파일 번들을 Amazon S3 버킷에 업로드해야 합니다. [CodeDeploy를 사용하여 애플리케이션 생성](applications-create.md) 및 [Amazon S3에 CodeDeploy의 개정 푸시(EC2 온프레미스 배포 전용)](application-revisions-push.md)의 지침을 따르십시오. 애플리케이션과 배포 그룹에 어떤 이름이든 지정할 수 있지만 애플리케이션 이름으로 `CodeDeploy-OnPrem-App`을, 배포 그룹 이름으로 `CodeDeploy-OnPrem-DG`를 지정하는 것이 좋습니다. 이러한 지침을 완료한 후 이 페이지로 돌아옵니다.

**참고**  
또는 GitHub 리포지토리에 파일 번들을 업로드하고 GitHub 리포지토리에서 배포할 수 있습니다. 자세한 내용은 [GitHub와 CodeDeploy 통합](integrations-partners-github.md) 단원을 참조하십시오.

# 4단계: 애플리케이션 수정 버전 배포
<a name="tutorials-on-premises-instance-4-deploy-sample-revision"></a>

Amazon S3 버킷에 애플리케이션 수정 버전을 업로드한 후 온프레미스 인스턴스에 배포해 보십시오. [CodeDeploy에서 배포 만들기](deployments-create.md)의 지침을 수행한 다음 이 페이지로 돌아오세요.

# 5단계: 배포 확인
<a name="tutorials-on-premises-instance-5-verify-deployment"></a>

배포가 성공적인지 확인하려면 [CodeDeploy 배포 세부 정보 보기](deployments-view-details.md)의 지침을 수행해고 이 페이지로 돌아옵니다.

배포에 성공한 경우 `c:\temp\CodeDeployExample` 폴더(Windows Server의 경우) 또는 `/tmp/CodeDeployExample` (Ubuntu Server 및 RHEL의 경우)에서 텍스트 파일 네 개를 찾을 수 있습니다.

배포에 실패한 경우에는 [CodeDeploy에서 인스턴스 정보 보기](instances-view-details.md) 및 [인스턴스 문제 해결](troubleshooting-ec2-instances.md)의 문제 해결 단계를 수행하세요. 필요한 부분을 수정하고, 애플리케이션 수정을 다시 번들링하여 업로드한 다음 다시 배포해 보십시오.

# 6단계: 리소스 정리
<a name="tutorials-on-premises-instance-6-clean-up-resources"></a>

이 튜토리얼에서 만든 리소스에 대해 비용이 청구되지 않도록 하려면 더 이상 사용할 필요가 없는 경우 Amazon S3 버킷을 삭제합니다. 또한 CodeDeploy 및 온프레미스 인스턴스의 애플리케이션 및 배포 그룹 레코드 등과 같은 관련 리소스를 정리할 수도 있습니다.

 AWS CLI 또는 CodeDeploy 및 Amazon S3 콘솔과의 조합을 사용하여 리소스를 정리 AWS CLI 할 수 있습니다.

## 리소스 정리(CLI)
<a name="tutorials-on-premises-instance-6-clean-up-resources-cli"></a>

**Amazon S3 버킷을 삭제하려면**
+ 버킷(예: `amzn-s3-demo-bucket`)에 대한 `--recursive` 스위치와 함께 [rm](https://docs.aws.amazon.com/cli/latest/reference/s3/rm.html) 명령을 호출합니다. 버킷을 비롯해 버킷에 있는 모든 객체가 삭제됩니다.

  ```
  aws s3 rm s3://your-bucket-name --recursive --region region
  ```

**CodeDeploy에서 배포 그룹 레코드와 애플리케이션을 삭제하려면**
+ 애플리케이션(예: `CodeDeploy-OnPrem-App`)에 대해 [delete-application](https://docs.aws.amazon.com/cli/latest/reference/deploy/delete-application.html) 명령을 호출합니다. 배포 그룹 및 배포에 대한 레코드가 삭제됩니다.

  ```
  aws deploy delete-application --application-name your-application-name
  ```<a name="tutorials-on-premises-instance-6-clean-up-resources-deregister-cli"></a>

**온프레미스 인스턴스의 등록을 취소하고 IAM 사용자를 삭제하려면**
+ 온프레미스 인스턴스 및 리전에 대해 [deregister](https://docs.aws.amazon.com/cli/latest/reference/deploy/deregister.html) 명령을 호출합니다.

  ```
  aws deploy deregister --instance-name your-instance-name --delete-iam-user --region your-region
  ```
**참고**  
이 온프레미스 인스턴스와 연결된 IAM 사용자를 삭제하지 않으려는 경우 `--no-delete-iam-user` 옵션을 대신 사용합니다.

**CodeDeploy 에이전트를 제거하고 온프레미스 인스턴스에서 구성 파일을 삭제하려면**
+ 온프레미스 인스턴스에서 [uninstall](https://docs.aws.amazon.com/cli/latest/reference/deploy/uninstall.html) 명령을 호출합니다.

  ```
  aws deploy uninstall
  ```

이제 자습서에 사용된 리소스를 정리하는 모든 단계를 완료했습니다.

## 리소스 정리(콘솔)
<a name="tutorials-on-premises-instance-6-clean-up-resources-console"></a>

**Amazon S3 버킷을 삭제하려면**

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/) Amazon S3 콘솔을 엽니다.

1. 삭제하려는 버킷(예: `amzn-s3-demo-bucket`) 옆의 아이콘을 선택하고 버킷은 선택하지 않습니다.

1. **작업**을 선택한 후 **삭제**를 선택합니다.

1. 버킷을 삭제할 것인지 묻는 메시지가 나타나면 [**OK**]를 선택합니다.

**CodeDeploy에서 배포 그룹 레코드와 애플리케이션을 삭제하려면**

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/codedeploy](https://console.aws.amazon.com/codedeploy) CodeDeploy 콘솔을 엽니다.
**참고**  
[CodeDeploy 시작하기](getting-started-codedeploy.md)에서 설정한 사용자와 동일한 사용자로 로그인합니다.

1. 탐색 창에서 **애플리케이션**을 선택합니다.

1. 삭제할 애플리케이션 이름(예: `CodeDeploy-OnPrem-App`)을 선택한 후 **애플리케이션 삭제**를 선택합니다.

1. 메시지가 표시되면 삭제를 확인할 애플리케이션의 이름을 입력한 후 **삭제**를 선택합니다.

 AWS CodeDeploy 콘솔을 사용하여 온프레미스 인스턴스의 등록을 취소하거나 CodeDeploy 에이전트를 제거할 수 없습니다. [온프레미스 인스턴스의 등록을 취소하고 IAM 사용자를 삭제하려면](#tutorials-on-premises-instance-6-clean-up-resources-deregister-cli)의 지침을 따르세요.

# 튜토리얼: CodeDeploy를 사용하여 Auto Scaling 그룹에 애플리케이션 배포
<a name="tutorials-auto-scaling-group"></a>

이 튜토리얼에서는 CodeDeploy를 사용하여 Auto Scaling 그룹에 애플리케이션 수정 버전을 배포합니다. Amazon EC2 Auto Scaling은 미리 정의된 조건을 사용하여 Amazon EC2 인스턴스를 시작한 다음 더 이상 필요하지 않을 때 해당 인스턴스를 종료합니다. Amazon EC2 Auto Scaling은 배포 로드를 처리할 수 있는 정확한 수의 Amazon EC2 인스턴스를 유지하도록 보장함으로써 CodeDeploy를 확장하는 데 도움이 됩니다. CodeDeploy와 Amazon EC2 Auto Scaling 통합에 대한 자세한 내용은 [Amazon EC2 Auto Scaling과 CodeDeploy 통합](integrations-aws-auto-scaling.md) 섹션을 참조하세요.

**Topics**
+ [사전 조건](tutorials-auto-scaling-group-prerequisites.md)
+ [1단계: Auto Scaling 그룹 생성 및 구성](tutorials-auto-scaling-group-create-auto-scaling-group.md)
+ [2단계: Auto Scaling 그룹에 애플리케이션 배포](tutorials-auto-scaling-group-create-deployment.md)
+ [3단계: 결과 확인](tutorials-auto-scaling-group-verify.md)
+ [4단계: Auto Scaling 그룹에서 Amazon EC2 인스턴스의 수 늘리기](tutorials-auto-scaling-group-scale-up.md)
+ [5단계: 결과 다시 확인](tutorials-auto-scaling-group-reverify.md)
+ [6단계: 정리](tutorials-auto-scaling-group-clean-up.md)

# 사전 조건
<a name="tutorials-auto-scaling-group-prerequisites"></a>

이 자습서를 따르려면 다음을 수행하세요.
+ 설정 및 구성[CodeDeploy 시작하기](getting-started-codedeploy.md), IAM 인스턴스 프로파일(**CodeDeployDemo-EC2-Instance-Profile**) 및 서비스 역할() AWS CLI 생성을 포함하여의 모든 단계를 완료합니다**CodeDeployDemo**. *서비스 역할*은 사용자를 대신해 수행할 수 있는 서비스 권한을 부여하는 특별한 유형의 IAM 역할입니다.
+ 시작 템플릿으로 Auto Scaling 그룹을 생성한 경우 다음 권한을 추가해야 합니다.
  +  `ec2:RunInstances` 
  +  `ec2:CreateTags` 
  +  `iam:PassRole` 

  자세한 내용은 [2단계: 서비스 역할 생성](getting-started-create-service-role.md), [Auto Scaling 그룹을 위한 시작 템플릿 만들기](https://docs.aws.amazon.com/autoscaling/ec2/userguide/create-launch-template.html) 및 *Amazon EC2 Auto Scaling 사용 설명서*.의 [시작 템플릿 지원](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-launch-template-permissions.html)을 참조하세요.
+  Ubuntu Server 인스턴스 및 CodeDeploy와 호환되는 수정 버전을 생성하고 사용합니다. 수정에 대해 다음 중 하나를 수행할 수 있습니다.
  + [2단계: 샘플 애플리케이션 수정 버전 만들기](tutorials-on-premises-instance-2-create-sample-revision.md) 튜토리얼에서 [튜토리얼: CodeDeploy를 사용하여 온프레미스 인스턴스에 애플리케이션 배포(Windows Server, Ubuntu Server 또는 Red Hat Enterprise Linux)](tutorials-on-premises-instance.md)의 샘플 수정 버전을 생성하고 사용합니다.
  + 수정을 직접 만들려면 [CodeDeploy의 애플리케이션 개정 작업](application-revisions.md) 단원을 참조하세요.
+ 다음 **인바운드 규칙**을 사용하여 **CodeDeployDemo-AS-SG**라는 보안 그룹을 만듭니다.
  + 유형: HTTP
  + 출처: 모든 소스

  이 작업은 애플리케이션을 보고 배포 성공 여부를 확인하는 데 필요합니다. 보안 그룹을 생성하는 방법에 대한 자세한 내용은 *Amazon EC2 사용 설명서*의 [보안 그룹 생성](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/working-with-security-groups.html#creating-security-group)을 참조하세요.

 

# 1단계: Auto Scaling 그룹 생성 및 구성
<a name="tutorials-auto-scaling-group-create-auto-scaling-group"></a>

이 단계에서는 단일 Amazon Linux, RHEL 또는 Windows Server Amazon EC2 인스턴스를 포함하는 Auto Scaling 그룹을 생성합니다. 이후 단계에서는 Amazon EC2 인스턴스를 하나 더 추가하도록 Amazon EC2 Auto Scaling에 지시하고 CodeDeploy에서는 수정 버전을 새로 추가된 인스턴스에 배포합니다.

**Topics**
+ [Auto Scaling 그룹을 생성하고 구성하려면(CLI 사용)](#tutorials-auto-scaling-group-create-auto-scaling-group-cli)
+ [Auto Scaling 그룹을 생성하고 구성하려면(콘솔 사용)](#tutorials-auto-scaling-group-create-auto-scaling-group-console)

## Auto Scaling 그룹을 생성하고 구성하려면(CLI 사용)
<a name="tutorials-auto-scaling-group-create-auto-scaling-group-cli"></a>

1. **create-launch-template** 명령을 호출하여 Amazon EC2 시작 템플릿을 생성합니다.

   이 명령을 호출하기 전에 이 튜토리얼에서 사용할 수 있는 AMI의 ID가 필요합니다(자리 표시자 *image-id*로 표시됨). 또한 Amazon EC2 인스턴스에 액세스할 수 있도록 Amazon EC2 인스턴스 키 페어의 이름도 필요합니다(자리 표시자 *key-name*으로 표시됨).

   이 튜토리얼에서 사용할 수 있는 AMI의 ID를 가져오려면:

   1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

   1. 탐색 창의 [**Instances**]에서 [**Instances**]를 선택한 후 [**Launch Instance**]를 선택합니다.

   1. **Amazon Machine Image 선택(Choose an Amazon Machine Image)** 페이지의 **빠른 시작(Quick Start)** 탭에서 **Amazon Linux 2 AMI**, **Red Hat Enterprise Linux 7.1**, **Ubuntu Server 14.04 LTS** 또는 **Microsoft Windows Server 2012 R2** 옆에 있는 AMI의 ID를 기록해 둡니다.
**참고**  
CodeDeploy와 호환되는 사용자 지정 AMI 버전이 있는 경우 **빠른 시작** 탭에서 찾는 대신 여기에서 해당 버전을 선택하세요. CodeDeploy 및 Amazon EC2 Auto Scaling에서 사용자 지정 AMI 사용에 대한 자세한 내용은 [CodeDeploy 및 Amazon EC2 Auto Scaling에서 사용자 지정 AMI 사용](integrations-aws-auto-scaling.md#integrations-aws-auto-scaling-custom-ami) 단원을 참조하세요.

   Amazon EC2 인스턴스 키 페어의 경우 Amazon EC2 인스턴스 키 페어의 이름을 사용합니다.

   **create-launch-template** 명령을 호출합니다.

   로컬 Linux, macOS 또는 Unix 머신의 경우

   ```
   aws ec2 create-launch-template \
     --launch-template-name CodeDeployDemo-AS-Launch-Template \
     --launch-template-data file://config.json
   ```

   `config.json` 파일 내용은 다음과 같습니다.

   ```
   { 
     "InstanceType":"t1.micro",
     "ImageId":"image-id",
     "IamInstanceProfile":{
       "Name":"CodeDeployDemo-EC2-Instance-Profile"
     },
     "KeyName":"key-name"
   }
   ```

   로컬 Windows 머신의 경우

   ```
   aws ec2 create-launch-template --launch-template-name CodeDeployDemo-AS-Launch-Template --launch-template-data file://config.json
   ```

   `config.json` 파일 내용은 다음과 같습니다.

   ```
   { 
     "InstanceType":"t1.micro",
     "ImageId":"image-id",
     "IamInstanceProfile":{
       "Name":"CodeDeployDemo-EC2-Instance-Profile"
     },
     "KeyName":"key-name"
   }
   ```

   `config.json` 파일과 함께 이러한 명령을 사용하면 다음 단계에서 t1.micro Amazon EC2 인스턴스 유형에 따라 생성되는 Auto Scaling 그룹에 대한 CodeDeployDemo-AS-Launch-Template이라는 Amazon EC2 시작 템플릿이 생성됩니다. `ImageId`, `IamInstanceProfile` 및 `KeyName`에 대한 입력 사항에 따라 시작 템플릿이 AMI ID, 시작 시 인스턴스에 전달할 IAM 역할과 관련된 인스턴스 프로파일의 이름 및 인스턴스에 연결할 때 사용할 Amazon EC2 키 페어도 지정합니다.

1.  **create-auto-scaling-group** 명령을 호출하여 Auto Scaling 그룹을 생성합니다. *AWS 일반 참조*의 [리전 및 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/rande.html#codedeploy_region)에 나열된 리전 중 하나에 있는 가용 영역 중 하나의 이름이 필요합니다. 이는 자리 표시자 *availability-zone*으로 표시됩니다.
**참고**  
리전의 가용 영역 목록을 보려면 다음을 호출합니다.  

   ```
   aws ec2 describe-availability-zones --region region-name
   ```
예를 들어, 미국 서부(오레곤) 리전의 가용 영역 목록을 보려면 다음을 호출합니다.  

   ```
   aws ec2 describe-availability-zones --region us-west-2
   ```
리전 이름 식별자 목록은 [리전별 리소스 키트 버킷 이름](resource-kit.md#resource-kit-bucket-names) 단원을 참조하세요.

   로컬 Linux, macOS 또는 Unix 머신의 경우

   ```
   aws autoscaling create-auto-scaling-group \
     --auto-scaling-group-name CodeDeployDemo-AS-Group \
     --launch-template CodeDeployDemo-AS-Launch-Template,Version='$Latest' \
     --min-size 1 \
     --max-size 1 \
     --desired-capacity 1 \
     --availability-zones availability-zone \
     --tags Key=Name,Value=CodeDeployDemo,PropagateAtLaunch=true
   ```

   로컬 Windows 머신의 경우

   ```
   aws autoscaling create-auto-scaling-group --auto-scaling-group-name CodeDeployDemo-AS-Group --launch-template LaunchTemplateName=CodeDeployDemo-AS-Launch-Template,Version="$Latest" --min-size 1 --max-size 1 --desired-capacity 1 --availability-zones availability-zone --tags Key=Name,Value=CodeDeployDemo,PropagateAtLaunch=true
   ```

   이 명령은 **CodeDeployDemo-AS-Launch-Template**이라는 Amazon EC2 시작 템플릿을 기반으로 **CodeDeployDemo-AS-Group**이라는 Auto Scaling 그룹을 생성합니다. 이 Auto Scaling 그룹에는 Amazon EC2 인스턴스 하나만 있으며, 이 인스턴스는 지정된 가용 영역에 생성됩니다. 이 Auto Scaling 그룹의 각 인스턴스에는 `Name=CodeDeployDemo` 태그가 있습니다. 이 태그는 나중에 CodeDeploy 에이전트를 설치할 때 사용됩니다.

1. **CodeDeployDemo-AS-Group**에 대해 **describe-auto-scaling-groups** 명령을 호출합니다.

   ```
   aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names CodeDeployDemo-AS-Group --query "AutoScalingGroups[0].Instances[*].[HealthStatus, LifecycleState]" --output text
   ```

   반환된 값에 `Healthy` 및 `InService`가 표시될 때까지 진행하지 마십시오.

1.  Auto Scaling 그룹의 인스턴스에 CodeDeploy 배포에 사용할 CodeDeploy 에이전트가 설치되어 있어야 합니다. Auto Scaling 그룹이 생성될 때 추가된 태그를 AWS Systems Manager 사용하여에서 **create-association** 명령을 호출하여 CodeDeploy 에이전트를 설치합니다.

   ```
   aws ssm create-association \
     --name AWS-ConfigureAWSPackage \
     --targets Key=tag:Name,Values=CodeDeployDemo \
      --parameters action=Install, name=AWSCodeDeployAgent \
     --schedule-expression "cron(0 2 ? * SUN *)"
   ```

   이 명령은 Systems Manager 상태 관리자에 연결을 생성하여 Auto Scaling 그룹의 모든 인스턴스에 CodeDeploy 에이전트를 설치하고 매주 일요일 오전 2시에 업데이트를 시도합니다. CodeDeploy 에이전트에 대한 자세한 내용은 [CodeDeploy 에이전트 작업](https://docs.aws.amazon.com/codedeploy/latest/userguide/codedeploy-agent.html)을 참조하세요. Systems Manager에 대한 자세한 내용은 [AWS Systems Manager란 무엇입니까](https://docs.aws.amazon.com/systems-manager/latest/userguide/what-is-systems-manager.html)를 참조하세요.

## Auto Scaling 그룹을 생성하고 구성하려면(콘솔 사용)
<a name="tutorials-auto-scaling-group-create-auto-scaling-group-console"></a>

1. [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

1. 전역 탐색 모음에서 *AWS 일반 참조*의 [리전 및 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/rande.html#codedeploy_region)에 나열된 리전 중 하나를 선택합니다. Amazon EC2 Auto Scaling 리소스는 지정한 리전에 연결되며, CodeDeploy는 일부 리전에서만 지원됩니다.

1. 탐색 창의 **인스턴스**에서 **템플릿 시작**을 선택합니다.

1. **Create launch template**(시작 템플릿 생성)을 선택합니다.

1. **시작 템플릿 이름 및 설명**의 **시작 템플릿 이름**에 **CodeDeployDemo-AS-Launch-Template**을(를) 입력합니다. 다른 필드의 경우 기본값을 그대로 유지합니다.

1. **Amazon Machine Image(AMI)** 대화 상자에서 **AMI** 아래 드롭다운을 클릭하여 이 튜토리얼에서 사용할 수 있는 AMI를 선택합니다.

   1. **AMI** 드롭다운의 **빠른 시작(Quick Start)** 탭에서 **Amazon Linux 2 AMI**, **Red Hat Enterprise Linux 7.1**, **Ubuntu Server 14.04 LTS** 또는 **Microsoft Windows Server 2012 R2** 중 하나를 선택합니다.
**참고**  
CodeDeploy와 호환되는 사용자 지정 AMI 버전이 있는 경우 **빠른 시작** 탭에서 찾는 대신 여기에서 해당 버전을 선택하세요. CodeDeploy 및 Amazon EC2 Auto Scaling에서 사용자 지정 AMI 사용에 대한 자세한 내용은 [CodeDeploy 및 Amazon EC2 Auto Scaling에서 사용자 지정 AMI 사용](integrations-aws-auto-scaling.md#integrations-aws-auto-scaling-custom-ami) 단원을 참조하세요.

1. **인스턴스 유형(Instance type)**에서 드롭다운을 선택한 다음 **t1.micro**를 선택합니다. 검색 창을 사용하면 더 빨리 찾을 수 있습니다.

1. **키 페어(로그인)(Key pair(login))** 대화 상자에서 **기존 키 페어 선택(Choose an existing key pair)**을 선택합니다. **키 페어 선택** 드롭다운 목록에서 이전 단계에서 만들었거나 사용한 Amazon EC2 인스턴스 키 페어를 선택합니다.

1. **네트워크 설정(Network settings)** 대화 상자에서 **가상 퍼블릭 클라우드(VPC)(Virtual Public Cloud (VPC))**를 선택합니다.

   **보안 그룹(Security groups)** 드롭다운에서 [튜토리얼의 사전 요구 사항 섹션](https://docs.aws.amazon.com/codedeploy/latest/userguide/tutorials-auto-scaling-group-prerequisites.html)(**CodeDeployDemo-AS-SG**)에서 생성한 보안 그룹을 선택합니다.

1. **고급 세부 정보** 대화 상자를 펼칩니다. **IAM 인스턴스 프로파일(IAM instance profile)** 드롭다운에서 이전에 **IAM 인스턴스 프로파일(IAM instance profile)** 아래에서 생성한 IAM 역할(**CodeDeployDemo-EC2-Instance-Profile**)을 선택합니다.

   나머지 기본값을 그대로 둡니다.

1. **Create launch template**(시작 템플릿 생성)을 선택합니다.

1. **다음 단계(Next steps)** 대화 상자에서 **Auto Scaling 그룹 생성(Create Auto Scaling group)**을 선택합니다.

1. **시작 템플릿 또는 구성 선택** 페이지에서 **Auto Scaling 그룹 이름**에 **CodeDeployDemo-AS-Group**을(를) 입력합니다.

1. **시작 템플릿(Launch template)** 대화 상자에서 시작 템플릿(**CodeDeployDemo-AS-Launch-Template**)을 작성해야 합니다. 작성하지 않고 드롭다운 메뉴에서 선택해도 됩니다. 기본값을 그대로 두고 **다음**을 선택합니다.

1. **인스턴스 시작 옵션 선택(Choose instance launch options)** 페이지의 **네트워크(Network)** 섹션에서 **VPC**에 대해 기본 VPC를 선택합니다. 그런 다음 **가용 영역 및 서브넷(Availability Zones and subnets)**에 대해 기본 서브넷을 선택합니다. 기본값을 선택할 수 없는 경우 VPC를 생성해야 합니다. 자세한 내용은 [Amazon VPC 시작하기](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-getting-started.html)를 참조하세요.

1. **인스턴스 유형 요구 사항(Instance type requirements)** 섹션에서 기본 설정을 사용하여 이 단계를 단순화합니다. (시작 템플릿을 재정의하지 마세요.) 이 자습서에서는 시작 템플릿에 지정된 인스턴스 유형을 사용하여 온디맨드 인스턴스만 시작합니다.

1. **다음(Next)**을 선택하고 **고급 옵션 구성(Configure advanced options)** 페이지로 이동합니다.

1. 기본값을 유지하고 **다음**을 선택합니다.

1. **그룹 크기 및 조정 정책 구성(Configure group size and scaling policies)** 페이지에서 기본 **그룹 크기(Group size)** 값 1을 유지합니다. **다음**을 선택합니다.

1. 알림을 구성하는 단계를 건너뛰고 **다음**을 선택합니다.

1. **태그 추가(Add tags)** 페이지에서 나중에 CodeDeploy 에이전트를 설치할 때 사용할 태그를 추가합니다. **태그 추가**를 선택합니다.

   1. **키**에 **Name**을(를) 입력합니다.

   1. **값**에 **CodeDeployDemo**을(를) 입력합니다.

   **다음**을 선택합니다.

1. **검토(Review)** 페이지에서 Auto Scaling 그룹 정보를 검토한 다음 **Auto Scaling 그룹 생성(Create Auto Scaling group)**을 선택합니다.

1. 탐색 모음에서 **Auto Scaling 그룹**이 선택된 상태에서 **CodeDeployDemo-AS-Group**을(를) 선택한 후 **인스턴스 관리** 탭을 선택합니다. **수명 주기** 열에 값 **InService**가 나타나고, **상태** 열에 값 **정상**이 나타날 때까지 진행하지 마세요.

1. [CodeDeploy 에이전트 설치](https://docs.aws.amazon.com/codedeploy/latest/userguide/codedeploy-agent-operations-install.html)의 단계에 따르고 `Name=CodeDeployDemo` 인스턴스 태그를 사용하여 CodeDeploy 에이전트를 설치합니다.

# 2단계: Auto Scaling 그룹에 애플리케이션 배포
<a name="tutorials-auto-scaling-group-create-deployment"></a>

이 단계에서는 Auto Scaling 그룹의 단일 Amazon EC2 인스턴스에 수정 버전을 배포합니다.

**Topics**
+ [배포를 만들려면(CLI)](#tutorials-auto-scaling-group-create-deployment-cli)
+ [배포를 만들려면(콘솔)](#tutorials-auto-scaling-group-create-deployment-console)

## 배포를 만들려면(CLI)
<a name="tutorials-auto-scaling-group-create-deployment-cli"></a>

1. **create-application** 명령을 호출하여 **SimpleDemoApp**이라는 애플리케이션을 생성합니다.

   ```
   aws deploy create-application --application-name SimpleDemoApp
   ```

1. [2단계: CodeDeploy에 대한 서비스 역할 생성](getting-started-create-service-role.md)의 지침에 따라 이미 서비스 역할을 만들었을 것입니다. 서비스 역할은 CodeDeploy에 Amazon EC2 인스턴스에 액세스하여 태그를 확장할(읽을) 수 있는 권한을 부여합니다. 서비스 역할 ARN이 필요합니다. 서비스 역할 ARN을 확인하려면 [서비스 역할 ARN 확인(CLI)](getting-started-create-service-role.md#getting-started-get-service-role-cli)의 지침을 따르십시오.

1. 이제 서비스 역할 ARN이 있으므로 지정된 서비스 역할 ARN으로 **create-deployment-group** 명령을 호출하고 **CodeDeployDemo-AS-Group**이라는 Auto Scaling 그룹과 **CodeDeployDefault.OneAtATime**이라는 배포 구성을 사용하여 **SimpleDemoDG**라는 배포 그룹을 생성하고 **SimpleDemoApp**이라는 애플리케이션에 연결합니다.
**참고**  
[create-deployment-group](https://docs.aws.amazon.com/cli/latest/reference/deploy/create-deployment-group.html) 명령은 배포 및 인스턴스의 지정된 이벤트에 대해 주제의 구독자에게 Amazon SNS 알림을 전송하게 하는 트리거를 생성합니다. 또한 해당 명령은 Amazon CloudWatch 경보 모니터링 임계값에 도달한 경우 자동으로 배포를 롤백하고 배포를 중지하도록 경보를 설정하는 옵션을 지원합니다. 이 작업에 대한 명령은 이 자습서에 포함되지 않습니다.

   로컬 Linux, macOS 또는 Unix 머신의 경우

   ```
   aws deploy create-deployment-group \
     --application-name SimpleDemoApp \
     --auto-scaling-groups CodeDeployDemo-AS-Group \
     --deployment-group-name SimpleDemoDG \
     --deployment-config-name CodeDeployDefault.OneAtATime \
     --service-role-arn service-role-arn
   ```

   로컬 Windows 머신의 경우

   ```
   aws deploy create-deployment-group --application-name SimpleDemoApp --auto-scaling-groups CodeDeployDemo-AS-Group --deployment-group-name SimpleDemoDG --deployment-config-name CodeDeployDefault.OneAtATime --service-role-arn service-role-arn
   ```

1. **create-deployment** 명령을 호출하고 지정된 위치의 수정을 사용하여 **SimpleDemoApp**이라는 애플리케이션, **CodeDeployDefault.OneAtATime**이라는 배포 구성 및 **SimpleDemoDG**라는 배포 그룹과 연결된 배포를 만듭니다.

   **Amazon Linux 및 RHEL Amazon EC2 인스턴스의 경우 로컬 Linux, macOS 또는 Unix 시스템에서 호출**

    

   ```
   aws deploy create-deployment \
     --application-name SimpleDemoApp \
     --deployment-config-name CodeDeployDefault.OneAtATime \
     --deployment-group-name SimpleDemoDG \
     --s3-location bucket=bucket-name,bundleType=zip,key=samples/latest/SampleApp_Linux.zip
   ```

   *bucket-name*은 해당 리전의 CodeDeploy 리소스 키트 파일이 포함되어 있는 Amazon S3 버킷의 이름입니다. 예를 들어 미국 동부(오하이오) 리전의 경우 *bucket-name*을 `aws-codedeploy-us-east-2`로 바꿉니다. 버킷 이름 목록은 [리전별 리소스 키트 버킷 이름](resource-kit.md#resource-kit-bucket-names) 단원을 참조하세요.

   **Amazon Linux 및 RHEL Amazon EC2 인스턴스의 경우 로컬 Windows 시스템에서 호출**

    

   ```
   aws deploy create-deployment --application-name SimpleDemoApp --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name SimpleDemoDG --s3-location bucket=bucket-name,bundleType=zip,key=samples/latest/SampleApp_Linux.zip
   ```

   *bucket-name*은 해당 리전의 CodeDeploy 리소스 키트 파일이 포함되어 있는 Amazon S3 버킷의 이름입니다. 예를 들어 미국 동부(오하이오) 리전의 경우 *bucket-name*을 `aws-codedeploy-us-east-2`로 바꿉니다. 버킷 이름 목록은 [리전별 리소스 키트 버킷 이름](resource-kit.md#resource-kit-bucket-names) 단원을 참조하세요.

   **Windows Server Amazon EC2 인스턴스의 경우 로컬 Linux, macOS 또는 Unix 시스템에서 호출**

    

   ```
   aws deploy create-deployment \
     --application-name SimpleDemoApp \
     --deployment-config-name CodeDeployDefault.OneAtATime \
     --deployment-group-name SimpleDemoDG \
     --s3-location bucket=bucket-name,bundleType=zip,key=samples/latest/SampleApp_Windows.zip
   ```

   *bucket-name*은 해당 리전의 CodeDeploy 리소스 키트 파일이 포함되어 있는 Amazon S3 버킷의 이름입니다. 예를 들어 미국 동부(오하이오) 리전의 경우 *bucket-name*을 `aws-codedeploy-us-east-2`로 바꿉니다. 버킷 이름 목록은 [리전별 리소스 키트 버킷 이름](resource-kit.md#resource-kit-bucket-names) 단원을 참조하세요.

   **Windows Server Amazon EC2 인스턴스의 경우 로컬 Windows 시스템에서 호출**

   ```
   aws deploy create-deployment --application-name SimpleDemoApp --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name SimpleDemoDG --s3-location bucket=bucket-name,bundleType=zip,key=samples/latest/SampleApp_Windows.zip
   ```

   *bucket-name*은 해당 리전의 CodeDeploy 리소스 키트 파일이 포함되어 있는 Amazon S3 버킷의 이름입니다. 예를 들어 미국 동부(오하이오) 리전의 경우 *bucket-name*을 `aws-codedeploy-us-east-2`로 바꿉니다. 버킷 이름 목록은 [리전별 리소스 키트 버킷 이름](resource-kit.md#resource-kit-bucket-names) 단원을 참조하세요.
**참고**  
현재 CodeDeploy 는 Ubuntu Server Amazon EC2 인스턴스를 배포하기 위한 샘플 수정 버전을 제공하지 않습니다. 수정을 직접 만들려면 [CodeDeploy의 애플리케이션 개정 작업](application-revisions.md) 단원을 참조하세요.

1. **get-deployment** 명령을 호출하여 배포에 성공했는지 확인합니다.

   이 명령을 호출하기 전에 배포 ID가 필요합니다. 이 ID는 **create-deployment** 명령에 대한 호출로 반환되어야 합니다. 배포 ID를 다시 가져와야 할 경우 **list-deployments**이라는 애플리케이션 및 **SimpleDemoApp**라는 배포 그룹에 대해 **SimpleDemoDG** 명령을 호출하세요.

   ```
   aws deploy list-deployments --application-name SimpleDemoApp --deployment-group-name SimpleDemoDG --query "deployments" --output text
   ```

   이제 배포 ID를 사용하여 **get-deployment** 명령을 호출합니다.

   ```
   aws deploy get-deployment --deployment-id deployment-id --query "deploymentInfo.status" --output text
   ```

   반환된 값이 `Succeeded`일 때까지 계속하지 마십시오.

## 배포를 만들려면(콘솔)
<a name="tutorials-auto-scaling-group-create-deployment-console"></a>

1. [2단계: CodeDeploy에 대한 서비스 역할 생성](getting-started-create-service-role.md)의 지침에 따라 이미 서비스 역할을 만들었을 것입니다. 서비스 역할은 CodeDeploy에 인스턴스에 액세스하여 태그를 확장할(읽을) 수 있는 권한을 부여합니다. CodeDeploy 콘솔을 사용하여 애플리케이션 수정을 배포하기 전에 서비스 역할 ARN이 필요합니다. 서비스 역할 ARN을 확인하려면 [서비스 역할 ARN 확인(콘솔)](getting-started-create-service-role.md#getting-started-get-service-role-console)의 지침을 따르십시오.

1. 이제 서비스 역할 ARN이 있으므로 CodeDeploy 콘솔을 사용하여 애플리케이션 수정을 배포할 수 있습니다.

   에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/codedeploy](https://console.aws.amazon.com/codedeploy) CodeDeploy 콘솔을 엽니다.
**참고**  
[CodeDeploy 시작하기](getting-started-codedeploy.md)에서 설정한 사용자와 동일한 사용자로 로그인합니다.

1. 탐색 창에서 **배포**를 확장하고 **애플리케이션**을 선택합니다.

1. **애플리케이션 생성**을 선택합니다.

1. **사용자 지정 애플리케이션**을 선택합니다.

1. **애플리케이션 이름**에 **SimpleDemoApp**을 입력합니다.

1. **컴퓨팅 플랫폼**에서 **EC2/온프레미스**를 선택합니다.

1. **애플리케이션 생성**을 선택합니다.

1. **배포 그룹** 탭에서 **Create deployment group(배포 그룹 생성)**을 선택합니다.

1. **Deployment group name(배포 그룹 이름)**에 **SimpleDemoDG**을 입력합니다.

1. **서비스 역할**에서 서비스 역할의 이름을 선택합니다.

1. **배포 유형**에서 **In-place(현재 위치)**를 선택합니다.

1. **환경 구성(Environment configuration)**에서 **Auto Scaling 그룹(Auto Scaling groups)**을 선택한 다음 **CodeDeployDemo-AS-Group**을 선택합니다.

1. **배포 구성**에서 **CodeDeployDefault.OneAtATime**을 선택합니다.

1. **로드 밸런싱 활성화**의 선택을 취소합니다.

1. [**Create deployment group**]을 선택합니다.

1. 배포 그룹 페이지에서 **배포 생성**을 선택합니다.

1. **수정 유형**에서 **내 애플리케이션은 Amazon S3에 저장됨**을 선택합니다.

1. **수정 위치**에 운영 체제 및 리전에 적합한 샘플 애플리케이션의 위치를 입력합니다.

   **Amazon Linux 및 RHEL Amazon EC2 인스턴스의 경우**  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/tutorials-auto-scaling-group-create-deployment.html)

   **Windows Server Amazon EC2 인스턴스의 경우**  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/tutorials-auto-scaling-group-create-deployment.html)

    **Ubuntu Server Amazon EC2 인스턴스의 경우**

   Amazon S3에 저장된 사용자 지정 애플리케이션 수정의 위치를 입력합니다.

1. **배포 설명**은 비워 둡니다.

1. **고급**을 확장합니다.

1. **배포 만들기**를 선택합니다.
**참고**  
**성공(Succeeded)** 대신 **실패(Failed)**가 나타난 경우 [배포 모니터링 및 문제 해결](tutorials-wordpress-deploy-application.md#tutorials-wordpress-deploy-application-monitor)(애플리케이션 이름 **SimpleDemoApp**, 배포 그룹 이름 **SimpleDemoDG**를 사용하여)에서 몇 가지 기술을 시도할 수 있습니다.

# 3단계: 결과 확인
<a name="tutorials-auto-scaling-group-verify"></a>

이 단계에서는 CodeDeploy가 Auto Scaling 그룹의 단일 Amazon EC2 인스턴스에 **SimpleDemoApp** 수정 버전을 배포했는지 확인합니다.

**Topics**
+ [결과를 확인하려면(CLI)](#tutorials-auto-scaling-group-verify-cli)
+ [결과를 확인하려면(콘솔)](#tutorials-auto-scaling-group-verify-console)

## 결과를 확인하려면(CLI)
<a name="tutorials-auto-scaling-group-verify-cli"></a>

먼저, Amazon EC2 인스턴스의 퍼블릭 DNS가 필요합니다.

를 사용하여 **describe-instances** 명령을 호출 AWS CLI 하여 Auto Scaling 그룹에 있는 Amazon EC2 인스턴스의 퍼블릭 DNS를 가져옵니다.

이 명령을 호출하기 전에 Amazon EC2 인스턴스의 ID가 필요합니다. ID를 가져오려면 이전에 수행한 것과 같이 **CodeDeployDemo-AS-Group**에 대해 **describe-auto-scaling-groups**를 호출합니다.

```
aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names CodeDeployDemo-AS-Group --query "AutoScalingGroups[0].Instances[*].InstanceId" --output text
```

이제 **describe-instances** 명령을 호출합니다.

```
aws ec2 describe-instances --instance-id instance-id --query "Reservations[0].Instances[0].PublicDnsName" --output text
```

반환되는 값은 Amazon EC2 인스턴스의 퍼블릭 DNS입니다.

웹 브라우저에서 다음과 같은 URL을 사용하여 Amazon EC2 인스턴스에 배포된 SimpleDemoApp 수정 버전을 표시합니다.

```
http://ec2-01-234-567-890.compute-1.amazonaws.com
```

축하 페이지가 표시되면 CodeDeploy를 사용하여 Auto Scaling 그룹의 단일 Amazon EC2 인스턴스에 수정 버전을 성공적으로 배포한 것입니다.

그런 다음 Auto Scaling 그룹에 Amazon EC2 인스턴스를 추가합니다. Amazon EC2 Auto Scaling이 Amazon EC2 인스턴스를 추가하면 CodeDeploy가 새 인스턴스에 수정 버전을 배포합니다.

## 결과를 확인하려면(콘솔)
<a name="tutorials-auto-scaling-group-verify-console"></a>

먼저, Amazon EC2 인스턴스의 퍼블릭 DNS가 필요합니다.

[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)에서 Amazon EC2 콘솔을 엽니다.

Amazon EC2 탐색 창의 **Auto Scaling**에서 **Auto Scaling 그룹**을 선택한 후 **CodeDeployDemo-AS-Group** 항목을 선택합니다.

**인스턴스** 탭의 목록에서 Amazon EC2 인스턴스 ID를 선택합니다.

**인스턴스** 페이지의 **설명** 탭에서 **퍼블릭 DNS** 값을 확인합니다. **ec2-01-234-567-890.compute-1.amazonaws.com**과 같아야 합니다.

웹 브라우저에서 다음과 같은 URL을 사용하여 Amazon EC2 인스턴스에 배포된 SimpleDemoApp 수정 버전을 표시합니다.

```
http://ec2-01-234-567-890.compute-1.amazonaws.com
```

축하 페이지가 표시되면 CodeDeploy를 사용하여 Auto Scaling 그룹의 단일 Amazon EC2 인스턴스에 수정 버전을 성공적으로 배포한 것입니다.

그런 다음 Auto Scaling 그룹에 Amazon EC2 인스턴스를 추가합니다. Amazon EC2 Auto Scaling이 Amazon EC2 인스턴스를 추가하면 CodeDeploy가 새 Amazon EC2 인스턴스에 수정 버전을 배포합니다.

# 4단계: Auto Scaling 그룹에서 Amazon EC2 인스턴스의 수 늘리기
<a name="tutorials-auto-scaling-group-scale-up"></a>

이 단계에서는 Auto Scaling 그룹에 추가 Amazon EC2 인스턴스를 생성하도록 지시합니다. Amazon EC2 Auto Scaling에서 인스턴스를 생성하면 CodeDeploy가 해당 인스턴스에 수정 버전을 배포합니다.

**Topics**
+ [Auto Scaling 그룹에서 Amazon EC2 인스턴스의 수를 확장하려면(CLI 사용)](#tutorials-auto-scaling-group-scale-up-cli)
+ [배포 그룹의 Amazon EC2 인스턴스 수를 늘리려면(콘솔)](#tutorials-auto-scaling-group-scale-up-console)

## Auto Scaling 그룹에서 Amazon EC2 인스턴스의 수를 확장하려면(CLI 사용)
<a name="tutorials-auto-scaling-group-scale-up-cli"></a>

1. **update-auto-scaling-group** 명령을 호출하여 **CodeDeployDemo-AS-Group**이라는 Auto Scaling 그룹 내 Amazon EC2 인스턴스를 하나에서 두 개로 늘립니다.

   로컬 Linux, macOS 또는 Unix 머신의 경우

   ```
   aws autoscaling update-auto-scaling-group \
     --auto-scaling-group-name CodeDeployDemo-AS-Group \
     --min-size 2 \
     --max-size 2 \
     --desired-capacity 2
   ```

   로컬 Windows 머신의 경우

   ```
   aws autoscaling update-auto-scaling-group --auto-scaling-group-name CodeDeployDemo-AS-Group --min-size 2 --max-size 2 --desired-capacity 2
   ```

1. Auto Scaling 그룹에 Amazon EC2 인스턴스가 두 개 있는지 확인합니다. **CodeDeployDemo-AS-Group**에 대해 **describe-auto-scaling-groups** 명령을 호출합니다.

   ```
   aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names CodeDeployDemo-AS-Group --query "AutoScalingGroups[0].Instances[*].[HealthStatus, LifecycleState]" --output text
   ```

   반환된 값에 모두 `Healthy` 및 `InService`가 표시될 때까지 진행하지 마십시오.

## 배포 그룹의 Amazon EC2 인스턴스 수를 늘리려면(콘솔)
<a name="tutorials-auto-scaling-group-scale-up-console"></a>

1. Amazon EC2 탐색 모음의 **Auto Scaling**에서 **Auto Scaling 그룹**을 선택한 후 **CodeDeployDemo-AS-Group**을(를) 선택합니다.

1. **작업**을 선택한 후 **편집**을 선택합니다.

1. **세부 정보** 탭의 **원하는**, **최소** 및 **최대** 상자에 **2**를 입력한 다음** 저장**을 선택합니다.

1. [**Instances**] 탭을 선택합니다. 목록에 새 Amazon EC2 인스턴스가 나타날 것입니다. (인스턴스가 나타나지 않는 경우 [**Refresh**] 버튼을 몇 번 선택해야 할 수 있습니다.) **수명 주기** 열에 값 **InService**가 나타나고, **상태** 열에 값 **정상**이 나타날 때까지 진행하지 마세요.

# 5단계: 결과 다시 확인
<a name="tutorials-auto-scaling-group-reverify"></a>

이 단계에서는 CodeDeploy가 Auto Scaling 그룹의 새 인스턴스에 SimpleDemoApp 수정 버전을 설치했는지 확인합니다.

**Topics**
+ [자동 배포 결과를 확인하려면(CLI)](#tutorials-auto-scaling-group-reverify-cli)
+ [자동 배포 결과를 확인하려면(콘솔)](#tutorials-auto-scaling-group-reverify-console)

## 자동 배포 결과를 확인하려면(CLI)
<a name="tutorials-auto-scaling-group-reverify-cli"></a>

1. **get-deployment** 명령을 호출하기 전에 자동 배포의 ID가 필요합니다. ID를 가져오려면 **list-deployments**이라는 애플리케이션 및 **SimpleDemoApp**라는 배포 그룹에 대해 **SimpleDemoDG** 명령을 호출하세요.

   ```
   aws deploy list-deployments --application-name SimpleDemoApp --deployment-group-name SimpleDemoDG --query "deployments" --output text
   ```

   배포 ID가 두 개 있을 것입니다. **get-deployment** 명령의 호출에 아직 사용하지 않은 ID를 사용합니다.

   ```
   aws deploy get-deployment --deployment-id deployment-id --query "deploymentInfo.[status, creator]" --output text
   ```

   배포 상태 외에도 명령 출력에 `autoScaling`이(가) 표시되어야 합니다(`autoScaling`은(는) Amazon EC2 Auto Scaling​이 배포를 생성했음을 의미).

   배포 상태에 `Succeeded`가 표시될 때까지 진행하지 마십시오.

1. **describe-instances** 명령을 호출하기 전에 새 Amazon EC2 인스턴스의 ID가 필요합니다. 이 ID를 가져오려면 **CodeDeployDemo-AS-Group**에 대해 **describe-auto-scaling-groups** 명령을 또 한 번 호출합니다.

   ```
   aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names CodeDeployDemo-AS-Group --query "AutoScalingGroups[0].Instances[*].InstanceId" --output text
   ```

   이제 **describe-instances** 명령을 호출합니다.

   ```
   aws ec2 describe-instances --instance-id instance-id --query "Reservations[0].Instances[0].PublicDnsName" --output text
   ```

   **describe-instances** 명령의 출력에서 새 Amazon EC2 인스턴스의 퍼블릭 DNS를 기록해 둡니다.

1. 웹 브라우저에서 다음과 같은 URL을 사용하여 Amazon EC2 인스턴스에 배포된 `SimpleDemoApp` 수정 버전을 표시합니다.

   ```
   http://ec2-01-234-567-890.compute-1.amazonaws.com
   ```

   축하 페이지가 표시되면 CodeDeploy를 사용하여 Auto Scaling 그룹의 확장된 Amazon EC2 인스턴스에 수정 버전을 성공적으로 배포한 것입니다.

## 자동 배포 결과를 확인하려면(콘솔)
<a name="tutorials-auto-scaling-group-reverify-console"></a>

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/codedeploy](https://console.aws.amazon.com/codedeploy) CodeDeploy 콘솔을 엽니다.
**참고**  
[CodeDeploy 시작하기](getting-started-codedeploy.md)에서 설정한 사용자와 동일한 사용자로 로그인합니다.

1. 탐색 창에서 **배포**를 확장하고 **배포**를 선택합니다.

   

1. Amazon EC2 Auto Scaling에서 생성한 배포의 배포 ID를 선택합니다.

   .

1.  **배포** 페이지에는 배포에 대한 정보가 표시됩니다. 일반적으로는 사용자가 직접 배포를 생성하지만 Amazon EC2 Auto Scaling이 사용자를 대신해 배포 하나를 생성하여 수정 버전을 새 Amazon EC2 인스턴스에 배포했습니다.

1. 페이지 상단에 **성공**이 표시되면 인스턴스에서 결과를 확인합니다. 먼저 해당 인스턴스의 퍼블릭 DNS를 가져와야 합니다.

1. Amazon EC2 탐색 창의 **Auto Scaling**에서 **Auto Scaling 그룹**을 선택한 후 **CodeDeployDemo-AS-Group** 항목을 선택합니다.

1. **인스턴스** 탭에서 새 Amazon EC2 인스턴스의 ID를 선택합니다.

1. **인스턴스** 페이지의 **설명** 탭에서 **퍼블릭 DNS** 값을 확인합니다. **ec2-01-234-567-890.compute-1.amazonaws.com**과 같아야 합니다.

다음과 같은 URL을 사용하여 인스턴스에 배포된 `SimpleDemoApp` 수정을 표시합니다.

```
http://ec2-01-234-567-890.compute-1.amazonaws.com
```

축하 페이지가 표시되면 CodeDeploy를 사용하여 Auto Scaling 그룹의 확장된 Amazon EC2 인스턴스에 수정 버전을 성공적으로 배포한 것입니다.

# 6단계: 정리
<a name="tutorials-auto-scaling-group-clean-up"></a>

이 단계에서는 이 튜토리얼을 진행하면서 사용한 리소스에 대해 요금이 계속 부과되지 않도록 Auto Scaling 그룹을 삭제합니다. 필요에 따라 Auto Scaling 구성 및 CodeDeploy 배포 구성 요소 레코드를 삭제할 수 있습니다.

**Topics**
+ [리소스를 정리하려면(CLI)](#tutorials-auto-scaling-group-clean-up-cli)
+ [리소스를 정리하려면(콘솔)](#tutorials-auto-scaling-group-clean-up-console)

## 리소스를 정리하려면(CLI)
<a name="tutorials-auto-scaling-group-clean-up-cli"></a>

1. **CodeDeployDemo-AS-Group**에 대해 **delete-auto-scaling-group** 명령을 호출해 Auto Scaling 그룹을 삭제합니다. 그러면 Amazon EC2 인스턴스도 종료됩니다.

   ```
   aws autoscaling delete-auto-scaling-group --auto-scaling-group-name CodeDeployDemo-AS-Group --force-delete
   ```

1. 필요에 따라 **CodeDeployDemo-AS-Launch-Template**이라는 시작 구성에 대해 **delete-launch-template** 명령을 호출하여 Auto Scaling 시작 템플릿을 삭제합니다.

   ```
   aws ec2 delete-launch-template --launch-template-name CodeDeployDemo-AS-Launch-Template
   ```

1. 필요에 따라 **SimpleDemoApp**(이)라는 애플리케이션에 대해 **delete-application** 명령을 호출하여 CodeDeploy에서 애플리케이션을 삭제합니다. 그러면 연결된 모든 배포, 배포 그룹 및 수정 레코드도 삭제됩니다.

   ```
   aws deploy delete-application --application-name SimpleDemoApp
   ```

1. Systems Manager 상태 관리자 연결을 삭제하려면 **delete-association** 명령을 호출합니다.

   ```
   aws ssm delete-association --assocation-id association-id
   ```

   **describe-association** 명령을 호출하여 *association-id*를 얻을 수 있습니다.

   ```
   aws ssm describe-association --name AWS-ConfigureAWSPackage --targets Key=tag:Name,Values=CodeDeployDemo
   ```

## 리소스를 정리하려면(콘솔)
<a name="tutorials-auto-scaling-group-clean-up-console"></a>

Amazon EC2 인스턴스도 종료하는 Auto Scaling 그룹을 삭제하려면 다음을 수행합니다.

1. 

   에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) Amazon EC2 콘솔을 엽니다.

1. Amazon EC2 탐색 창의 **Auto Scaling**에서 **Auto Scaling 그룹**을 선택한 후 **CodeDeployDemo-AS-Group** 항목을 선택합니다.

1. [**Actions**], [**Delete**], [**Yes, Delete**]를 차례로 선택합니다.

(선택 사항) 시작 템플릿을 삭제하려면

1.  탐색 모음의 **Auto Scaling**에서 **시작 구성**을 선택한 다음 **CodeDeployDemo-AS-Launch-Template**을(를) 선택합니다.

1. [**Actions**], [**Delete launch configuration**], [**Yes, Delete**]를 차례로 선택합니다.

1. 필요에 따라 CodeDeploy에서 애플리케이션을 삭제합니다. 그러면 연결된 모든 배포, 배포 그룹 및 수정 레코드도 삭제됩니다. [https://console.aws.amazon.com/codedeploy](https://console.aws.amazon.com/codedeploy)에서 CodeDeploy 콘솔을 엽니다.

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/codedeploy](https://console.aws.amazon.com/codedeploy) CodeDeploy 콘솔을 엽니다.
**참고**  
[CodeDeploy 시작하기](getting-started-codedeploy.md)에서 설정한 사용자와 동일한 사용자로 로그인합니다.

   탐색 창에서 **배포**를 확장하고 **애플리케이션**을 선택합니다.

   

1. 애플리케이션 목록에서 **SimpleDemoApp**을 선택합니다.

1. **애플리케이션 세부 정보** 페이지에서 **애플리케이션 삭제**를 선택합니다.

1. 메시지가 표시되면 **Delete**를 입력한 후 **삭제**를 선택합니다.

Systems Manager 상태 관리자 연결을 삭제하려면

1. https://console.aws.amazon.com/systems-manager AWS Systems Manager 콘솔을 엽니다.

1. 탐색 창에서 **상태 관리자**를 선택합니다.

1. 생성한 연결을 선택하고 **삭제**를 선택합니다.

# 튜토리얼: CodeDeploy를 사용하여 GitHub에서 애플리케이션 배포
<a name="tutorials-github"></a>

이 튜토리얼에서는 CodeDeploy를 사용하여 GitHub에서 Amazon Linux를 실행하는 단일 Amazon EC2 인스턴스, 단일 Red Hat Enterprise Linux(RHEL) 인스턴스 또는 단일 Windows Server 인스턴스로 샘플 애플리케이션 수정 버전을 배포합니다. CodeDeploy와 GitHub 통합에 대한 자세한 내용은 [GitHub와 CodeDeploy 통합](integrations-partners-github.md) 단원을 참조하세요.

**참고**  
또한 CodeDeploy를 사용하여 GitHub에서 Ubuntu Server 인스턴스로 애플리케이션 수정을 배포할 수도 있습니다. [튜토리얼: CodeDeploy를 사용하여 온프레미스 인스턴스에 애플리케이션 배포(Windows Server, Ubuntu Server 또는 Red Hat Enterprise Linux)](tutorials-on-premises-instance.md)의 [2단계: 샘플 애플리케이션 수정 버전 만들기](tutorials-on-premises-instance-2-create-sample-revision.md)에서 설명된 샘플 수정을 사용하거나 Ubuntu Server 인스턴스 및 CodeDeploy와 호환되는 수정을 생성할 수 있습니다. 수정을 직접 만들려면 [CodeDeploy의 개정 계획](application-revisions-plan.md) 및 [CodeDeploy에 대한 개정에 애플리케이션 사양 파일 추가](application-revisions-appspec-file.md) 단원을 참조하세요.

**Topics**
+ [사전 조건](tutorials-github-prerequisites.md)
+ [1단계: GitHub 계정 설정](tutorials-github-create-github-account.md)
+ [2단계: GitHub 리포지토리 만들기](tutorials-github-create-github-repository.md)
+ [3단계: GitHub 리포지토리로 샘플 애플리케이션 업로드](tutorials-github-upload-sample-revision.md)
+ [4단계: 인스턴스 프로비저닝](tutorials-github-provision-instance.md)
+ [5단계: 애플리케이션 및 배포 그룹 만들기](tutorials-github-create-application.md)
+ [6단계: 인스턴스에 애플리케이션 배포](tutorials-github-deploy-application.md)
+ [7단계: 배포 모니터링 및 확인](tutorials-github-verify.md)
+ [8단계: 정리](tutorials-github-clean-up.md)

# 사전 조건
<a name="tutorials-github-prerequisites"></a>

이 자습서를 시작하기 전에 다음 작업을 수행해야 합니다.
+ 로컬 시스템에 Git를 설치합니다. Git를 설치하려면 [Git 다운로드](http://git-scm.com/downloads)를 참조하세요.
+  AWS CLI설치 및 구성을 비롯하여 [CodeDeploy 시작하기](getting-started-codedeploy.md)의 단계를 완료합니다. 이는를 사용하여 GitHub에서 인스턴스 AWS CLI 로 개정을 배포하려는 경우에 특히 중요합니다.

# 1단계: GitHub 계정 설정
<a name="tutorials-github-create-github-account"></a>

수정을 저장할 GitHub 리포지토리를 만들려면 GitHub 계정이 필요합니다. 이미 GitHub 계정이 있으면 [2단계: GitHub 리포지토리 만들기](tutorials-github-create-github-repository.md) 단계로 건너뜁니다.

1. [https://github.com/join](https://github.com)으로 이동합니다.

1. 사용자 이름, 이메일 주소 및 암호를 입력합니다.

1. [**Sign up for GitHub**]를 선택한 후 지침을 따릅니다.

# 2단계: GitHub 리포지토리 만들기
<a name="tutorials-github-create-github-repository"></a>

수정을 저장할 GitHub 리포지토리가 필요합니다.

GitHub 리포지토리가 이미 있는 경우 이 자습서 전체에서 기존 리포지토리의 이름으로 **CodeDeployGitHubDemo**를 대체한 다음 [3단계: GitHub 리포지토리로 샘플 애플리케이션 업로드](tutorials-github-upload-sample-revision.md) 단계로 건너뜁니다.

1. [GitHub 홈 페이지](https://github.com/dashboard)에서 다음 중 하나를 수행합니다.
   + [**Your repositories**]에서 [**New repository**]를 선택합니다.
   + 탐색 모음에서 [**Create new**]([**\$1**])를 선택한 후 [**New repository**]를 선택합니다.

1. [**Create a new repository**] 페이지에서 다음을 수행합니다.
   + **리포지토리 이름** 상자에 **CodeDeployGitHubDemo**를 입력합니다.
   + [**Public**]을 선택합니다.
**참고**  
기본 [**Public**] 옵션을 선택하면 모든 사람이 이 리포지토리를 볼 수 있습니다. **Private(프라이빗)** 옵션을 선택하여 리포지토리를 보고 커밋할 수 있는 사람을 제한할 수 있습니다.
   + [**Initialize this repository with a README**] 확인란의 선택을 취소합니다. 대신에 다음 단계에서 `README.md` 파일을 수동으로 만듭니다.
   + **리포지토리 생성**을 선택합니다.

1. 로컬 머신 유형의 지침에 따라 명령줄을 사용하여 리포지토리를 만듭니다.
**참고**  
GitHub에서 이중 인증을 활성화한 경우, 암호를 물으면 GitHub 로그인 암호 대신에 개인 액세스 토큰을 입력해야 합니다. 자세한 내용은 [2FA 인증 코드 제공](https://help.github.com/articles/providing-your-2fa-authentication-code/) 단원을 참조하세요.

**로컬 Linux, macOS 또는 Unix 머신의 경우**

1. 터미널에서 다음 명령을 한 번에 하나씩 실행합니다. 여기에서 *user-name*은 GitHub 사용자 이름입니다.

   ```
   mkdir /tmp/CodeDeployGitHubDemo
   ```

   ```
   cd /tmp/CodeDeployGitHubDemo
   ```

   ```
   touch README.md
   ```

   ```
   git init
   ```

   ```
   git add README.md
   ```

   ```
   git commit -m "My first commit"
   ```

   ```
   git remote add origin https://github.com/user-name/CodeDeployGitHubDemo.git
   ```

   ```
   git push -u origin master
   ```

1. `/tmp/CodeDeployGitHubDemo` 위치에서 터미널을 열린 상태로 둡니다.

**로컬 Windows 머신의 경우**

1. 관리자로 실행되는 명령 프롬프트에서 다음 명령을 한 번에 하나씩 실행합니다.

   ```
   mkdir c:\temp\CodeDeployGitHubDemo
   ```

   ```
   cd c:\temp\CodeDeployGitHubDemo
   ```

   ```
   notepad README.md
   ```

1. 메모장에 `README.md` 파일을 저장합니다. 메모장을 닫습니다. 다음 명령을 한 번에 하나씩 실행합니다. 여기에서 *user-name*은 GitHub 사용자 이름입니다.

   ```
   git init
   ```

   ```
   git add README.md
   ```

   ```
   git commit -m "My first commit"
   ```

   ```
   git remote add origin https://github.com/user-name/CodeDeployGitHubDemo.git
   ```

   ```
   git push -u origin master
   ```

1. `c:\temp\CodeDeployGitHubDemo` 위치에서 명령 프롬프트를 열린 상태로 둡니다.

# 3단계: GitHub 리포지토리로 샘플 애플리케이션 업로드
<a name="tutorials-github-upload-sample-revision"></a>

이 단계에서는 퍼블릭 Amazon S3 버킷에서 GitHub 리포지토리로 샘플 계정을 복사합니다. (간결한 설명을 위해 이 튜토리얼에서 제공되는 샘플 수정은 단일 웹 페이지입니다.)

**참고**  
샘플 수정 대신 자체 수정 중 하나를 사용하려는 경우 수정은 다음과 같아야 합니다.  
[CodeDeploy의 개정 계획](application-revisions-plan.md) 및 [CodeDeploy에 대한 개정에 애플리케이션 사양 파일 추가](application-revisions-appspec-file.md)의 지침을 따라야 합니다.
해당 인스턴스 유형에서 사용할 수 있어야 합니다.
GitHub 대시보드에서 액세스할 수 있어야 합니다.
자체 수정이 이러한 요구 사항을 충족하는 경우 [5단계: 애플리케이션 및 배포 그룹 만들기](tutorials-github-create-application.md) 단계로 건너뜁니다.  
Ubuntu Server 인스턴스에 배포하는 경우, Ubuntu Server인스턴스 및 CodeDeploy와 호환되는 수정을 GitHub 리포지토리로 업로드해야 합니다. 자세한 내용은 [CodeDeploy의 개정 계획](application-revisions-plan.md) 및 [CodeDeploy에 대한 개정에 애플리케이션 사양 파일 추가](application-revisions-appspec-file.md) 단원을 참조하세요.

**Topics**
+ [로컬 Linux, macOS 또는 Unix 시스템에서 샘플 수정 버전 푸시](#tutorials-github-upload-sample-revision-unixes)
+ [로컬 Windows 시스템에서 샘플 수정 푸시](#tutorials-github-upload-sample-revision-windows)

## 로컬 Linux, macOS 또는 Unix 시스템에서 샘플 수정 버전 푸시
<a name="tutorials-github-upload-sample-revision-unixes"></a>

예를 들어 `/tmp/CodeDeployGitHubDemo` 위치에서 아직 열려 있는 터미널을 사용하여 다음 명령을 한 번에 하나씩 실행합니다.

**참고**  
Windows Server 인스턴스에 배포하려는 경우 명령에서 `SampleApp_Linux.zip`을(를) `SampleApp_Windows.zip`(으)로 대체합니다.

```
(Amazon S3 copy command)
```

```
unzip SampleApp_Linux.zip
```

```
rm SampleApp_Linux.zip
```

 

```
git add .
```

```
git commit -m "Added sample app"
```

```
git push
```

여기서 *(Amazon S3 복사 명령)*은 다음 중 하나입니다.
+ 미국 동부(오하이오) 리전에 `aws s3 cp s3://aws-codedeploy-us-east-2/samples/latest/SampleApp_Linux.zip . --region us-east-2`
+ 미국 동부(버지니아 북부) 리전에 `aws s3 cp s3://aws-codedeploy-us-east-1/samples/latest/SampleApp_Linux.zip . --region us-east-1`
+ 미국 서부(캘리포니아 북부) 리전에 `aws s3 cp s3://aws-codedeploy-us-west-1/samples/latest/SampleApp_Linux.zip . --region us-west-1`
+ 미국 서부(오레곤) 리전에 `aws s3 cp s3://aws-codedeploy-us-west-2/samples/latest/SampleApp_Linux.zip . --region us-west-2`
+ 캐나다(중부) 리전에 `aws s3 cp s3://aws-codedeploy-ca-central-1/samples/latest/SampleApp_Linux.zip . --region ca-central-1`
+ 유럽(아일랜드) 리전에 `aws s3 cp s3://aws-codedeploy-eu-west-1/samples/latest/SampleApp_Linux.zip . --region eu-west-1` 
+ 유럽(런던) 리전에 `aws s3 cp s3://aws-codedeploy-eu-west-2/samples/latest/SampleApp_Linux.zip . --region eu-west-2` 
+ 유럽(파리) 리전에 `aws s3 cp s3://aws-codedeploy-eu-west-3/samples/latest/SampleApp_Linux.zip . --region eu-west-3` 
+ 유럽(프랑크푸르트) 리전 `aws s3 cp s3://aws-codedeploy-eu-central-1/samples/latest/SampleApp_Linux.zip . --region eu-central-1`
+ 이스라엘(텔아비브) 리전용 `aws s3 cp s3://aws-codedeploy-il-central-1/samples/latest/SampleApp_Linux.zip . --region il-central-1`
+ 아시아 태평양(홍콩) 리전에 `aws s3 cp s3://aws-codedeploy-ap-east-1/samples/latest/SampleApp_Linux.zip . --region ap-east-1`
+ 아시아 태평양(도쿄) 리전에 `aws s3 cp s3://aws-codedeploy-ap-northeast-1/samples/latest/SampleApp_Linux.zip . --region ap-northeast-1`
+ 아시아 태평양(서울) 리전에 `aws s3 cp s3://aws-codedeploy-ap-northeast-2/samples/latest/SampleApp_Linux.zip . --region ap-northeast-2`
+ 아시아 태평양(싱가포르) 리전에 `aws s3 cp s3://aws-codedeploy-ap-southeast-1/samples/latest/SampleApp_Linux.zip . --region ap-southeast-1`
+ 아시아 태평양(시드니) 리전에 `aws s3 cp s3://aws-codedeploy-ap-southeast-2/samples/latest/SampleApp_Linux.zip . --region ap-southeast-2`
+ 아시아 태평양(멜버른) 리전의 경우 `aws s3 cp s3://aws-codedeploy-ap-southeast-4/samples/latest/SampleApp_Linux.zip . --region ap-southeast-4`
+ 아시아 태평양(뭄바이) 리전에 `aws s3 cp s3://aws-codedeploy-ap-south-1/samples/latest/SampleApp_Linux.zip . --region ap-south-1`
+ 남아메리카(상파울루) 리전에 `aws s3 cp s3://aws-codedeploy-sa-east-1/samples/latest/SampleApp_Linux.zip . --region sa-east-1`

## 로컬 Windows 시스템에서 샘플 수정 푸시
<a name="tutorials-github-upload-sample-revision-windows"></a>

 예를 들어 `c:\temp\CodeDeployGitHubDemo` 위치에서 아직 열려 있는 명령 프롬프트를 사용하여 다음 명령을 한 번에 하나씩 실행합니다.

**참고**  
Amazon Linux 또는 RHEL 인스턴스에 배포하려는 경우 명령에서 `SampleApp_Windows.zip`을(를) `SampleApp_Linux.zip`(으)로 대체합니다.

```
(Amazon S3 copy command)
```

새 하위 디렉터리가 아니라 로컬 디렉터리(예: `c:\temp\CodeDeployGitHubDemo`)에 직접 `the` ZIP 파일의 내용을 풉니다.

```
git add .
```

```
git commit -m "Added sample app"
```

```
git push
```

여기서 *(Amazon S3 복사 명령)*은 다음 중 하나입니다.
+ 미국 동부(오하이오) 리전에 `aws s3 cp s3://aws-codedeploy-us-east-2/samples/latest/SampleApp_Windows.zip . --region us-east-2`
+ 미국 동부(버지니아 북부) 리전에 `aws s3 cp s3://aws-codedeploy-us-east-1/samples/latest/SampleApp_Windows.zip . --region us-east-1`
+ 미국 서부(캘리포니아 북부) 리전에 `aws s3 cp s3://aws-codedeploy-us-west-1/samples/latest/SampleApp_Windows.zip . --region us-west-1`
+ 미국 서부(오레곤) 리전에 `aws s3 cp s3://aws-codedeploy-us-west-2/samples/latest/SampleApp_Windows.zip . --region us-west-2`
+ 캐나다(중부) 리전에 `aws s3 cp s3://aws-codedeploy-ca-central-1/samples/latest/SampleApp_Windows.zip . --region ca-central-1`
+ 유럽(아일랜드) 리전에 `aws s3 cp s3://aws-codedeploy-eu-west-1/samples/latest/SampleApp_Windows.zip . --region eu-west-1`
+ 유럽(런던) 리전에 `aws s3 cp s3://aws-codedeploy-eu-west-2/samples/latest/SampleApp_Windows.zip . --region eu-west-2`
+ 유럽(파리) 리전에 `aws s3 cp s3://aws-codedeploy-eu-west-3/samples/latest/SampleApp_Windows.zip . --region eu-west-3`
+ 유럽(프랑크푸르트) 리전 `aws s3 cp s3://aws-codedeploy-eu-central-1/samples/latest/SampleApp_Windows.zip . --region eu-central-1`
+ 이스라엘(텔아비브) 리전용 `aws s3 cp s3://aws-codedeploy-il-central-1/samples/latest/SampleApp_Windows.zip . --region il-central-1`
+ 아시아 태평양(홍콩) 리전에 `aws s3 cp s3://aws-codedeploy-ap-east-1/samples/latest/SampleApp_Windows.zip . --region ap-east-1`
+ 아시아 태평양(도쿄) 리전에 `aws s3 cp s3://aws-codedeploy-ap-northeast-1/samples/latest/SampleApp_Windows.zip . --region ap-northeast-1`
+ 아시아 태평양(서울) 리전에 `aws s3 cp s3://aws-codedeploy-ap-northeast-2/samples/latest/SampleApp_Windows.zip . --region ap-northeast-2`
+ 아시아 태평양(싱가포르) 리전에 `aws s3 cp s3://aws-codedeploy-ap-southeast-1/samples/latest/SampleApp_Windows.zip . --region ap-southeast-1`
+ 아시아 태평양(시드니) 리전에 `aws s3 cp s3://aws-codedeploy-ap-southeast-2/samples/latest/SampleApp_Windows.zip . --region ap-southeast-2`
+ 아시아 태평양(멜버른) 리전의 경우 `aws s3 cp s3://aws-codedeploy-ap-southeast-4/samples/latest/SampleApp_Windows.zip . --region ap-southeast-4`
+ 아시아 태평양(뭄바이) 리전에 `aws s3 cp s3://aws-codedeploy-ap-south-1/samples/latest/SampleApp_Windows.zip . --region ap-south-1`
+ 남아메리카(상파울루) 리전에 `aws s3 cp s3://aws-codedeploy-sa-east-1/samples/latest/SampleApp_Windows.zip . --region sa-east-1`

Ubuntu Server 인스턴스로 자체 수정을 푸시하려면 로컬 repo로 계정을 복사하고 다음 명령을 호출합니다.

```
git add .
git commit -m "Added Ubuntu app"
git push
```

# 4단계: 인스턴스 프로비저닝
<a name="tutorials-github-provision-instance"></a>

이 단계에는 샘플 애플리케이션을 배포할 인스턴스를 만들거나 구성합니다. CodeDeploy에서 지원하는 운영 체제 중 하나를 실행하는 Amazon EC2 인스턴스 또는 온프레미스 인스턴스에 배포할 수 있습니다. 자세한 내용은 [CodeDeploy 에이전트에서 지원하는 운영 체제](codedeploy-agent.md#codedeploy-agent-supported-operating-systems) 단원을 참조하세요. CodeDeploy 배포에서 사용하기 위해 구성한 인스턴스가 이미 있는 경우에는 다음 단계로 건너뜁니다.

**인스턴스를 프로비저닝하려면**

1. [Amazon EC2 인스턴스 시작(콘솔)](instances-ec2-create.md#instances-ec2-create-console)의 지침에 따라 인스턴스를 프로비저닝할 수 있습니다.

1. 인스턴스를 시작할 때, **태그 추가**에서 태그를 지정하는 것을 잊지 마십시오. 태그를 지정하는 방법에 대한 자세한 내용은 [Amazon EC2 인스턴스 시작(콘솔)](instances-ec2-create.md#instances-ec2-create-console) 단원을 참조하세요.

**인스턴스에서 CodeDeploy 에이전트가 실행 중인지 확인하려면**
+ 에이전트가 실행 중인지 확인하려면 [CodeDeploy 에이전트가 실행 중인지 확인](codedeploy-agent-operations-verify.md)의 지침을 따릅니다.

인스턴스를 성공적으로 프로비저닝했으면 CodeDeploy 에이전트가 실행 중인지 확인한 후 다음 단계로 진행합니다.

# 5단계: 애플리케이션 및 배포 그룹 만들기
<a name="tutorials-github-create-application"></a>

이 단계에서는 CodeDeploy 콘솔 또는 AWS CLI 를 사용하여 GitHub 리포지토리에서 샘플 개정을 배포하는 데 사용할 애플리케이션 및 배포 그룹을 생성합니다.



## 애플리케이션 및 배포 그룹 만들기(콘솔)
<a name="tutorials-github-create-application-console"></a>

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/codedeploy](https://console.aws.amazon.com/codedeploy) CodeDeploy 콘솔을 엽니다.
**참고**  
[CodeDeploy 시작하기](getting-started-codedeploy.md)에서 설정한 사용자와 동일한 사용자로 로그인합니다.

1. 탐색 창에서 **배포**를 확장하고 **애플리케이션**을 선택합니다.

   

1. **애플리케이션 생성**을 선택한 후 **사용자 지정 애플리케이션**을 선택합니다.

1. **애플리케이션 이름**에 **CodeDeployGitHubDemo-App**을 입력합니다.

1. **Compute Platform(컴퓨팅 플랫폼)**에서 **EC2/On-premises(EC2/온프레미스)**를 선택합니다.

1. **애플리케이션 생성**을 선택합니다.

1. **배포 그룹** 탭에서 **Create deployment group(배포 그룹 생성)**을 선택합니다.

1. **Deployment group name(배포 그룹 이름)**에 **CodeDeployGitHubDemo-DepGrp**을 입력합니다.

1. **서비스 역할**에서 [CodeDeploy 에 대한 서비스 역할 생성](getting-started-create-service-role.md)에서 생성한 CodeDeploy 서비스 역할의 이름을 선택합니다.

1. **배포 유형**에서 **In-place(현재 위치)**를 선택합니다.

1. **환경 구성**에서 사용 중인 인스턴스 유형에 따라 **Amazon EC2 인스턴스** 또는 **온프레미스 인스턴스**를 선택합니다. **키** 및 **값**에 [4단계: 인스턴스 프로비저닝](tutorials-github-provision-instance.md)의 일부로 인스턴스에 적용된 인스턴스 태그 키와 값을 입력합니다.

1. **Deployment configuration(배포 구성)**에서 **CodeDeployDefault.AllatOnce**를 선택합니다.

1. **로드 밸런서**에서 **Enable load balancing(로드 밸런싱 활성화)**을 선택 해제합니다.

1. **고급**을 확장합니다.

1. **경보**에서 **Ignore alarm configuration(경보 구성 무시)**을 선택합니다.

1. **배포 그룹 생성**을 선택하고 다음 단계로 계속 진행합니다.

## 애플리케이션 및 배포 그룹 만들기(CLI)
<a name="tutorials-github-create-application-cli"></a>

1. **create-application** 명령을 호출하여 CodeDeploy에 `CodeDeployGitHubDemo-App`(이)라는 애플리케이션을 생성합니다.

   ```
   aws deploy create-application --application-name CodeDeployGitHubDemo-App
   ```

1. **create-deployment-group** 명령을 호출하여 `CodeDeployGitHubDemo-DepGrp`라는 배포 그룹을 생성합니다.
   + Amazon EC2 인스턴스에 배포하는 경우 *ec2-tag-key*는 [4단계: 인스턴스 프로비저닝](tutorials-github-provision-instance.md)의 일부로 Amazon EC2 인스턴스에 적용된 Amazon EC2 인스턴스 태그 키입니다.
   + Amazon EC2 인스턴스에 배포하는 경우 *ec2-tag-value*는 [4단계: 인스턴스 프로비저닝](tutorials-github-provision-instance.md)의 일부로 Amazon EC2 인스턴스에 적용된 Amazon EC2 인스턴스 태그 값입니다.
   + 온프레미스 인스턴스에 배포하는 경우, *on-premises-tag-key*는 [4단계: 인스턴스 프로비저닝](tutorials-github-provision-instance.md)의 일부로 온프레미스 인스턴스에 적용된 온프레미스 인스턴스 태그 키입니다.
   + 온프레미스 인스턴스에 배포하는 경우, *on-premises-tag-value*는 [4단계: 인스턴스 프로비저닝](tutorials-github-provision-instance.md)의 일부로 온프레미스 인스턴스에 적용된 온프레미스 인스턴스 태그 값입니다.
   + *service-role-arn*은 [CodeDeploy에 대한 서비스 역할 생성](getting-started-create-service-role.md)에서 생성한 서비스 역할의 서비스 역할 ARN 입니다. (서비스 역할 ARN을 찾으려면 [서비스 역할 ARN 확인(CLI)](getting-started-create-service-role.md#getting-started-get-service-role-cli)의 지침을 따르십시오.)

   ```
   aws deploy create-deployment-group --application-name CodeDeployGitHubDemo-App --ec2-tag-filters Key=ec2-tag-key,Type=KEY_AND_VALUE,Value=ec2-tag-value --on-premises-tag-filters Key=on-premises-tag-key,Type=KEY_AND_VALUE,Value=on-premises-tag-value --deployment-group-name CodeDeployGitHubDemo-DepGrp --service-role-arn service-role-arn
   ```
**참고**  
[create-deployment-group](https://docs.aws.amazon.com/cli/latest/reference/deploy/create-deployment-group.html) 명령은 배포 및 인스턴스의 지정된 이벤트에 대해 주제의 구독자에게 Amazon SNS 알림을 전송하게 하는 트리거를 생성합니다. 또한 해당 명령은 Amazon CloudWatch 경보 모니터링 임계값에 도달한 경우 자동으로 배포를 롤백하고 배포를 중지하도록 경보를 설정하는 옵션을 지원합니다. 이 작업에 대한 명령은 이 자습서에 포함되지 않습니다.

# 6단계: 인스턴스에 애플리케이션 배포
<a name="tutorials-github-deploy-application"></a>

이 단계에서는 CodeDeploy 콘솔 또는 AWS CLI 를 사용하여 GitHub 리포지토리에서 인스턴스로 샘플 개정을 배포합니다.



## 수정을 배포하려면(콘솔)
<a name="tutorials-github-deploy-application-console"></a>

1. **배포 그룹 세부 정보** 페이지에서 **배포 생성**을 선택합니다.

1. **배포 그룹**에서 **`CodeDeployGitHubDemo-DepGrp`**을(를) 선택합니다.

1. **Revision type(수정 유형)**에서 **GitHub**를 선택합니다.

1. [**Connect to GitHub**]에서 다음 중 하나를 수행합니다.
   + GitHub 계정에 대한 CodeDeploy 애플리케이션의 연결을 만들려면 별도의 웹 브라우저 탭에서 GitHub에서 로그아웃합니다. **GitHub 계정**에서 이 연결을 식별하는 이름을 입력한 후 **GitHub에 연결**을 선택합니다. 웹 페이지에 `CodeDeployGitHubDemo-App`(이)라는 애플리케이션에 대해 GitHub와 상호 작용할 권한을 CodeDeploy에 부여하라는 메시지가 표시됩니다. 계속해서 5단계를 진행합니다.
   + 이미 만든 연결을 사용하려면 [**GitHub account**]에서 이름을 선택한 후 [**Connect to GitHub**]를 선택합니다. 계속해서 7단계를 진행합니다.
   + 다른 GitHub 계정에 대한 연결을 만들려면 별도의 웹 브라우저 탭에서 GitHub에서 로그아웃합니다. [**Connect to a different GitHub account**]를 선택한 후 [**Connect to GitHub**]를 선택합니다. 계속해서 5단계를 진행합니다.

1. [**Sign in**] 페이지의 지침에 따라 GitHub 계정에 로그인합니다.

1. [**Authorize application**] 페이지에서 [**Authorize application**]을 선택합니다.

1. CodeDeploy **배포 생성** 페이지에서 **리포지토리 이름**에 로그인하는 데 사용한 GitHub 사용자 이름과 그 뒤에 슬래시(`/`) 및 애플리케이션 수정 버전(예: ***my-github-user-name*/CodeDeployGitHubDemo**)을 푸시한 리포지토리 이름을 입력합니다.

   입력할 값을 잘 모르거나 다른 리포지토리를 지정하려면 다음과 같이 합니다.

   1. 별도의 웹 브라우저 탭에서 [GitHub 대시보드](https://github.com/dashboard)로 이동합니다.

   1. [**Your repositories**]에서 마우스 포인터를 대상 리포지토리 이름 위에 올려놓습니다. 도구 설명에 GitHub 사용자 또는 조직 이름과 그 뒤에 슬래시(`/`) 및 리포지토리 이름이 표시됩니다. 이 값을 **리포지토리 이름**에 입력합니다.
**참고**  
대상 리포지토리 이름이 **Your repositories(리포지토리)**에 표시되지 않는 경우, **Search GitHub(GitHub 검색)** 상자를 사용하여 대상 리포지토리와 GitHub 사용자 또는 조직 이름을 찾습니다.

1. **커밋 ID** 상자에 애플리케이션 수정을 GitHub에 푸시한 것과 연결된 커밋 ID를 입력합니다.

   입력할 값을 잘 모를 경우 다음과 같이 합니다.

   1. 별도의 웹 브라우저 탭에서 [GitHub 대시보드](https://github.com/dashboard)로 이동합니다.

   1. **리포지토리**에서 **CodeDeployGitHubDemo**를 선택합니다.

   1. 커밋 목록에서 애플리케이션 수정을 GitHub에 푸시한 것과 연결된 커밋 ID를 찾아 복사합니다. 이 ID는 일반적으로 40자이고 문자와 숫자로 구성됩니다. (일반적으로 더 긴 버전의 첫 10자인 더 짧은 커밋 ID 버전을 사용하지 마십시오.)

   1. 커밋 ID를 [**Commit ID**] 상자에 붙여 넣습니다.

1. [**Deploy**]를 선택하고 다음 단계로 계속 진행합니다.

## 수정을 배포하려면(CLI)
<a name="tutorials-github-deploy-application-cli"></a>

GitHub와 상호 작용하는 AWS CLI 명령(예: 다음에 호출할 **create-deployment** 명령)을 호출하려면 먼저 CodeDeploy에 GitHub 사용자 계정을 사용하여 `CodeDeployGitHubDemo-App` 애플리케이션의 GitHub와 상호 작용할 수 있는 권한을 부여해야 합니다. 현재는 CodeDeploy 콘솔을 사용하여 이를 수행해야 합니다.

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/codedeploy](https://console.aws.amazon.com/codedeploy) CodeDeploy 콘솔을 엽니다.
**참고**  
[CodeDeploy 시작하기](getting-started-codedeploy.md)에서 설정한 사용자와 동일한 사용자로 로그인합니다.

1. 탐색 창에서 **배포**를 확장하고 **애플리케이션**을 선택합니다.

   

1. **CodeDeployGitHubDemo-App**를 선택합니다.

1. **배포 탭**에서 **배포 만들기**를 선택합니다.
**참고**  
새 배포를 만들지 않습니다. 이는 현재 GitHub 사용자 계정을 대신하여 CodeDeploy에 GitHub와 상호 작용할 권한을 부여하는 유일한 방법입니다.

1. **배포 그룹**에서 **CodeDeployGitHubDemo-DepGrp**를 선택합니다.

1. **Revision type(수정 유형)**에서 **GitHub**를 선택합니다.

1. [**Connect to GitHub**]에서 다음 중 하나를 수행합니다.
   + GitHub 계정에 대한 CodeDeploy 애플리케이션의 연결을 만들려면 별도의 웹 브라우저 탭에서 GitHub에서 로그아웃합니다. [**GitHub account**]에 이 연결을 식별하는 이름을 입력한 후 [**Connect to GitHub**]를 선택합니다. 웹 페이지에 `CodeDeployGitHubDemo-App`(이)라는 애플리케이션에 대해 GitHub와 상호 작용할 권한을 CodeDeploy에 부여하라는 메시지가 표시됩니다. 계속해서 8단계를 진행합니다.
   + 이미 만든 연결을 사용하려면 [**GitHub account**]에서 이름을 선택한 후 [**Connect to GitHub**]를 선택합니다. 계속해서 10단계를 진행합니다.
   + 다른 GitHub 계정에 대한 연결을 만들려면 별도의 웹 브라우저 탭에서 GitHub에서 로그아웃합니다. [**Connect to a different GitHub account**]를 선택한 후 [**Connect to GitHub**]를 선택합니다. 계속해서 8단계를 진행합니다.

1. [**Sign in**] 페이지의 지침에 따라 GitHub 사용자 이름 또는 이메일 및 암호로 로그인합니다.

1. [**Authorize application**] 페이지에서 [**Authorize application**]을 선택합니다.

1. CodeDeploy **배포 생성** 페이지에서 **취소**를 선택합니다.

1. **create-deployment** 명령을 호출하여 GitHub 리포지토리에서 인스턴스로 수정을 배포합니다. 여기에서,
   + *repository*는 GitHub 계정 이름에 슬래시(`/`)와 리포지토리 이름(`CodeDeployGitHubDemo`)이 추가된 형태입니다(예: `MyGitHubUserName/CodeDeployGitHubDemo`).

     사용할 값을 잘 모르거나 다른 리포지토리를 지정하려면:

     1. 별도의 웹 브라우저 탭에서 [GitHub 대시보드](https://github.com/dashboard)로 이동합니다.

     1. [**Your repositories**]에서 마우스 포인터를 대상 리포지토리 이름 위에 올려놓습니다. 도구 설명에 GitHub 사용자 또는 조직 이름과 그 뒤에 슬래시(`/`) 및 리포지토리 이름이 표시됩니다. 이것이 사용할 값입니다.
**참고**  
[**Your repositories**]에 대상 리포지토리 이름이 표시되지 않는 경우, [**Search GitHub**] 상자를 사용하여 대상 리포지토리와 해당 GitHub 사용자 또는 조직 이름을 찾습니다.
   + *commit-id*는 리포지토리에 푸시한 애플리케이션 수정과 연결된 커밋입니다(예: `f835159a...528eb76f`).

     사용할 값을 잘 모를 경우:

     1. 별도의 웹 브라우저 탭에서 [GitHub 대시보드](https://github.com/dashboard)로 이동합니다.

     1. **리포지토리**에서 **CodeDeployGitHubDemo**를 선택합니다.

     1. 커밋 목록에서 애플리케이션 수정을 GitHub에 푸시한 것과 연결된 커밋 ID를 찾습니다. 이 ID는 일반적으로 40자이고 문자와 숫자로 구성됩니다. (일반적으로 더 긴 버전의 첫 10자인 더 짧은 커밋 ID 버전을 사용하지 마십시오.) 이 값을 사용합니다.

   로컬 Linux, macOS 또는 Unix 머신에서 작업하는 경우:

   ```
   aws deploy create-deployment \
     --application-name CodeDeployGitHubDemo-App \
     --deployment-config-name CodeDeployDefault.OneAtATime \
     --deployment-group-name CodeDeployGitHubDemo-DepGrp \
     --description "My GitHub deployment demo" \
     --github-location repository=repository,commitId=commit-id
   ```

   로컬 Windows 머신에서 작업하는 경우:

   ```
   aws deploy create-deployment --application-name CodeDeployGitHubDemo-App --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name CodeDeployGitHubDemo-DepGrp --description "My GitHub deployment demo" --github-location repository=repository,commitId=commit-id
   ```

# 7단계: 배포 모니터링 및 확인
<a name="tutorials-github-verify"></a>

이 단계에서는 CodeDeploy 콘솔 또는 AWS CLI 를 사용하여 배포의 성공을 확인합니다. 직접 만들거나 구성한 인스턴스에 배포된 웹 페이지를 웹 브라우저에서 확인합니다.

**참고**  
Ubuntu Server 인스턴스에 배포하는 경우, 배포된 수정이 해당 인스턴스에서 정상 작동하는지 자체 테스트 전략에 따라 확인한 후 다음 단계로 진행합니다.

**배포를 모니터링하고 확인하려면(콘솔)**

1. 탐색 창에서 **배포**를 확장하고 **배포**을 선택합니다.

   

1. 배포 목록에서 **애플리케이션** 값이 **CodeDeployGitHubDemo-App**이고 **배포 그룹** 값이 **CodeDeployGitHubDemo-DepGrp**인 행을 찾습니다. **상태** 열에 **성공** 또는 **실패**가 표시되지 않은 경우 **새로 고침** 버튼을 몇 차례 누릅니다.

1. **상태** 열에 **실패**가 나타난 경우 [인스턴스 정보 보기(콘솔)](instances-view-details.md#instances-view-details-console)의 지침을 따라 배포 문제를 해결합니다.

1. **상태**열에 **성공**이 나타난 경우 웹 브라우저를 통해 배포를 확인할 수 있습니다. 이 샘플 수정에서는 인스턴스에 단일 웹 페이지를 배포합니다. Amazon EC2 인스턴스에 배포하는 경우 웹 브라우저에서 해당 인스턴스의 `http://public-dns`(으)로 이동합니다(예: `http://ec2-01-234-567-890.compute-1.amazonaws.com`).

1. 웹 페이지가 보이면 성공한 것입니다. 이제 AWS CodeDeploy 를 사용하여 GitHub에서 수정을 배포했으므로 [8단계: 정리](tutorials-github-clean-up.md) 단원으로 건너뛸 수 있습니다.

**배포를 모니터링하고 확인하려면(CLI)**

1. **list-deployments** 명령을 호출하여 `CodeDeployGitHubDemo-App`이라는 애플리케이션의 배포 ID와 `CodeDeployGitHubDemo-DepGrp`라는 배포 그룹을 가져옵니다.

   ```
   aws deploy list-deployments --application-name CodeDeployGitHubDemo-App --deployment-group-name CodeDeployGitHubDemo-DepGrp --query "deployments" --output text
   ```

1. **list-deployments** 명령의 출력에 배포 ID를 입력하여 **get-deployment** 명령을 호출합니다.

   ```
   aws deploy get-deployment --deployment-id deployment-id --query "deploymentInfo.[status, creator]" --output text
   ```

1. [**Failed**]가 반환되면 [인스턴스 정보 보기(콘솔)](instances-view-details.md#instances-view-details-console)의 지침에 따라 배포 문제를 해결합니다.

1. [**Succeeded**]가 반환되면 이제 웹 브라우저를 통해 배포를 확인해 볼 수 있습니다. 이 샘플 수정은 인스턴스에 배포된 단일 웹 페이지입니다. Amazon EC2 인스턴스에 배포하는 경우 웹 브라우저에서 Amazon EC2 인스턴스의 `http://public-dns`(으)로 이동하여 이 페이지를 볼 수 있습니다(예: `http://ec2-01-234-567-890.compute-1.amazonaws.com`).

1. 웹 페이지가 보이면 성공한 것입니다. AWS CodeDeploy 를 사용하여 GitHub 리포지토리에서 성공적으로 배포했습니다.

# 8단계: 정리
<a name="tutorials-github-clean-up"></a>

이 자습서를 진행하면서 사용한 리소스에 요금이 부과되지 않도록 Amazon EC2 인스턴스와 연결된 리소스를 종료해야 합니다. 원한다면 이 자습서와 연결된 CodeDeploy 배포 구성 요소 레코드를 삭제할 수 있습니다. 이 자습서 진행을 위해서만 GitHub 리포지토리를 사용한 경우에는 지금 그 리포지토리도 삭제할 수 있습니다.

## CloudFormation 스택을 삭제하려면(템 CloudFormation 플릿을 사용하여 Amazon EC2 인스턴스를 생성한 경우)
<a name="tutorials-github-clean-up-cloudformation-template"></a>

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) CloudFormation 콘솔을 엽니다.

1. **Stacks(스택)** 열에서 `CodeDeploySampleStack`으로 시작하는 스택을 선택합니다.

1. **삭제**를 선택합니다.

1. 메시지가 나타나면 **스택 삭제**를 선택합니다. Amazon EC2 인스턴스 및 연결된 IAM 인스턴스 프로파일과 서비스 역할이 삭제됩니다.

## 온프레미스 인스턴스를 수동으로 등록 취소 및 정리하려면(온프레미스 인스턴스를 프로비저닝한 경우)
<a name="tutorials-github-clean-up-on-premises-instance"></a>

1.  AWS CLI 를 사용하여 여기에서 *your-instance-name*으로 표시되는 온프레미스 인스턴스와 해당 리전으로 연결된 리전에 대해 [등록 취소](https://docs.aws.amazon.com/cli/latest/reference/deploy/deregister.html) 명령을 호출*합니다.*

   ```
   aws deploy deregister --instance-name your-instance-name --no-delete-iam-user --region your-region
   ```

1. 온프레미스 인스턴스에서 [uninstall](https://docs.aws.amazon.com/cli/latest/reference/deploy/uninstall.html) 명령을 호출합니다.

   ```
   aws deploy uninstall
   ```

## Amazon EC2 인스턴스를 수동으로 종료하려면(Amazon EC2 인스턴스를 수동으로 시작한 경우)
<a name="tutorials-github-clean-up-ec2-instance"></a>

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) Amazon EC2 콘솔을 엽니다.

1. 탐색 창의 **인스턴스**에서 **인스턴스**를 선택합니다.

1. 종료할 Amazon EC2 인스턴스 옆의 상자를 선택합니다. [**Actions**] 메뉴에서 [**Instance State**]를 가리킨 다음 [**Terminate**]를 선택합니다.

1. 메시지가 나타나면 [**Yes, Terminate**]를 선택합니다.

## CodeDeploy 배포 구성 요소 레코드를 삭제하려면
<a name="tutorials-github-clean-up-codedeploy-records"></a>

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/codedeploy](https://console.aws.amazon.com/codedeploy) CodeDeploy 콘솔을 엽니다.
**참고**  
[CodeDeploy 시작하기](getting-started-codedeploy.md)에서 설정한 사용자와 동일한 사용자로 로그인합니다.

1. 탐색 창에서 **배포**를 확장하고 **애플리케이션**을 선택합니다.

   

1. **CodeDeployGitHubDemo-App**를 선택합니다.

1. **애플리케이션 삭제**를 선택합니다.

1. 메시지가 표시되면 **Delete**를 입력한 후 **삭제**를 선택합니다.

## GitHub 리포지토리를 삭제하려면
<a name="tutorials-github-clean-up-github-repository"></a>

[GitHub 도움말](https://help.github.com)의 [리포지토리 삭제](https://help.github.com/articles/deleting-a-repository/)를 참조하세요.

# 튜토리얼: Amazon ECS에 애플리케이션 배포
<a name="tutorial-ecs-deployment"></a>

 이 튜토리얼에서는 CodeDeploy를 사용하여 Amazon ECS에 애플리케이션을 배포하는 방법을 알아봅니다. 이미 만들고 Amazon ECS에 배포한 애플리케이션으로 시작합니다. 첫 번째 단계는 새 태그로 작업 정의 파일을 수정하여 애플리케이션을 업데이트하는 것입니다. 다음에는 CodeDeploy를 사용하여 업데이트를 배포합니다. 배포 중에 CodeDeploy는 새로운 대체 작업 세트에 업데이트를 설치합니다. 그런 다음, 원래 작업 세트에 있는 Amazon ECS 애플리케이션의 원래 버전에서 대체 작업 세트에 있는 업데이트된 버전으로 프로덕션 트래픽을 이동합니다.

 Amazon ECS 배포 중에 CodeDeploy는 대상 그룹 두 개와 프로덕션 트래픽 리스너 하나로 구성된 로드 밸런서를 사용합니다. 다음 다이어그램에서는 배포가 시작되기 전에 로드 밸런서, 프로덕션 리스너, 대상 그룹 및 Amazon ECS 애플리케이션이 관련되는 방식을 보여 줍니다. 이 튜토리얼에서는 Application Load Balancer를 사용합니다. Network Load Balancer를 사용할 수도 있습니다.

![\[Application Load Balancer 또는 Network Load Balancer, 프로덕션 리스너 1개, 대상 그룹 2개, 태스크 세트 1개, Amazon ECS 서비스 1개입니다.\]](http://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/images/codedeploy-ecs-deployment-with-no-test-listener-step-1.png)


 성공적인 배포 후, 프로덕션 트래픽 리스너는 새로운 대체 작업 세트에 트래픽을 제공하고 원래 작업 세트는 종료됩니다. 다음 다이어그램에서는 성공적인 배포 후에 리소스가 관련되는 방식을 보여 줍니다. 자세한 내용은 [Amazon ECS 배포 중에 발생하는 일](deployment-steps-ecs.md#deployment-steps-what-happens) 단원을 참조하십시오.

![\[Application Load Balancer 또는 Network Load Balancer, 프로덕션 리스너 1개, 대상 그룹 2개, 대체 태스크 세트 1개입니다.\]](http://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/images/codedeploy-ecs-deployment-with-no-test-listener-step-5.png)


를 사용하여 Amazon ECS에 애플리케이션을 AWS CLI 배포하는 방법에 대한 자세한 내용은 [ 자습서: 블루/그린 배포를 사용하여 서비스 생성을](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-blue-green.html) 참조하세요. CodePipeline을 사용하여 CodeDeploy가 있는 Amazon ECS 서비스에 대한 변경 사항을 감지하고 자동으로 배포하는 방법에 대한 자세한 내용은 [튜토리얼: Amazon ECR 소스 및 ECS-to-CodeDeploy 배포를 사용하여 파이프라인 생성](https://docs.aws.amazon.com/codepipeline/latest/userguide/tutorials-ecs-ecr-codedeploy.html)을 참조하세요.

이 자습서를 완료한 후에는 [튜토리얼: Amazon ECS 서비스 배포 및 확인 테스트](tutorial-ecs-deployment-with-hooks.md)에서 CodeDeploy 애플리케이션과 생성한 배포 그룹을 사용하여 배포 확인 테스트를 추가할 수 있습니다.

**Topics**
+ [사전 조건](tutorial-ecs-prereqs.md)
+ [1단계: Amazon ECS 애플리케이션 업데이트](tutorial-ecs-update-the-ecs-application.md)
+ [2단계: AppSpec 파일 생성](tutorial-ecs-create-appspec-file.md)
+ [3단계: CodeDeploy 콘솔을 사용하여 애플리케이션 배포](tutorial-ecs-deployment-deploy.md)
+ [4단계: 정리](tutorial-ecs-clean-up.md)

# 사전 조건
<a name="tutorial-ecs-prereqs"></a>

이 자습서를 완료하려면 먼저 다음을 수행해야 합니다.
+  [CodeDeploy 시작하기](getting-started-codedeploy.md)의 2단계와 3단계를 완료합니다.
+  대상 그룹 두 개와 리스너 하나로 구성된 Application Load Balancer를 생성합니다. 콘솔을 사용하여 로드 밸런서를 생성하는 방법에 대한 자세한 내용은 [CodeDeploy Amazon ECS 배포를 위한 로드 밸런서, 대상 그룹 및 리스너 설정](deployment-groups-create-load-balancer-for-ecs.md) 단원을 참조하세요. 를 사용하여 로드 밸런서를 생성하는 방법에 대한 자세한 내용은 *Amazon Elastic Container Service 사용 설명서*의 [1단계: Application Load Balancer 생성을](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-blue-green.html#create-blue-green-loadbalancer) AWS CLI참조하세요. 로드 밸런서를 생성할 때 이 자습서를 위해 다음을 기록해 둡니다.
  +  로드 밸런서의 이름입니다.
  +  대상 그룹의 이름입니다.
  +  로드 밸런서의 리스너에서 사용되는 포트입니다.
+  Amazon ECS 클러스터 및 서비스를 생성합니다. 자세한 내용은 *Amazon Elastic Container Service 사용 설명서*에서 [튜토리얼: 블루/그린 배포를 사용하여 서비스 생성](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-blue-green.html)의 2단계, 3단계, 4단계를 참조하세요. 이 자습서를 위해 다음을 기록해 둡니다.
  +  Amazon ECS 클러스터의 이름입니다.
  +  Amazon ECS 서비스에 사용되는 작업 정의의 ARN입니다.
  +  Amazon ECS 서비스에 사용되는 컨테이너의 이름입니다.
+  AppSpec 파일용 Amazon S3 버킷을 만듭니다.

# 1단계: Amazon ECS 애플리케이션 업데이트
<a name="tutorial-ecs-update-the-ecs-application"></a>

 이 단원에서는 해당 작업 정의의 새 버전을 사용하여 Amazon ECS 애플리케이션을 업데이트합니다. 업데이트된 수정은 새로운 키 및 태그 페어를 추가합니다. [3단계: CodeDeploy 콘솔을 사용하여 애플리케이션 배포](tutorial-ecs-deployment-deploy.md)에서는 Amazon ECS 애플리케이션의 업데이트된 버전을 배포합니다.

**작업 정의를 업데이트하려면**

1. [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)에서 콘솔을 엽니다.

1.  탐색 창에서 **태스크 정의**를 선택합니다.

1. Amazon ECS 서비스에 사용되는 태스크 정의를 선택합니다.

1. 태스크 정의 개정을 선택한 다음 **새 개정 생성**, **새 개정 생성**을 선택합니다.

1.  이 자습서를 위해 태그를 추가하여 작업 정의에 대한 작은 업데이트를 수행합니다. 페이지 하단의 **태그**에서 새 키 및 값 페어를 입력하여 새 태그를 만듭니다.

1.  **생성(Create)**을 선택합니다.

   태스크 정의의 개정 번호가 하나 증가됩니다.

1.  **JSON** 탭을 선택합니다. 다음 단계에서 이 정보가 필요하므로 다음 사항을 기록해 둡니다.
   +  `taskDefinitionArn`의 값입니다. 형식은 `arn:aws:ecs:aws-region:account-id:task-definition/task-definition-family:task-definition-revision`입니다. 이 항목은 업데이트된 작업 정의의 ARN입니다.
   +  `containerDefinitions` 요소에서 `name`의 값입니다. 이 항목은 컨테이너의 이름입니다.
   +  `portMappings` 요소에서 `containerPort`의 값입니다. 이 항목은 컨테이너의 포트입니다.

# 2단계: AppSpec 파일 생성
<a name="tutorial-ecs-create-appspec-file"></a>

 이 단원에서는 AppSpec 파일을 생성하고 [사전 조건](tutorial-ecs-prereqs.md) 섹션에서 생성한 Amazon S3 버킷에 업로드합니다. Amazon ECS 배포를 위한 AppSpec 파일은 작업 정의, 컨테이너 이름 및 컨테이너 포트를 지정합니다. 자세한 내용은 [Amazon ECS 배포용 AppSpec 파일 예제](reference-appspec-file-example.md#appspec-file-example-ecs) 및 [Amazon ECS 배포를 위한 AppSpec 'resources' 섹션](reference-appspec-file-structure-resources.md#reference-appspec-file-structure-resources-ecs) 단원을 참조하세요.

**AppSpec 파일을 생성하려면**

1.  YAML을 사용하여 AppSpec 파일을 생성하려는 경우 `appspec.yml`(이)라는 파일을 만듭니다. JSON을 사용하여 AppSpec 파일을 생성하려는 경우 `appspec.json`(이)라는 파일을 만듭니다.

1.  AppSpec 파일에 YAML을 사용하는지 또는 JSON을 사용하는지에 따라 적절한 탭을 선택하고, 해당 내용을 방금 생성한 AppSpec 파일로 복사합니다. `TaskDefinition` 속성에는 [1단계: Amazon ECS 애플리케이션 업데이트](tutorial-ecs-update-the-ecs-application.md) 단원에서 기록한 작업 정의 ARN을 사용합니다.

------
#### [ JSON AppSpec ]

   ```
   {
     "version": 0.0,
     "Resources": [
       {
         "TargetService": {
           "Type": "AWS::ECS::Service",
           "Properties": {
             "TaskDefinition": "arn:aws:ecs:aws-region-id:aws-account-id:task-definition/ecs-demo-task-definition:revision-number",
             "LoadBalancerInfo": {
               "ContainerName": "your-container-name",
               "ContainerPort": your-container-port
             }
           }
         }
       }
     ]
   }
   ```

------
#### [ YAML AppSpec ]

   ```
   version: 0.0
   Resources:
     - TargetService:
         Type: AWS::ECS::Service
         Properties:
           TaskDefinition: "arn:aws:ecs:aws-region-id:aws-account-id:task-definition/ecs-demo-task-definition:revision-number"
           LoadBalancerInfo:
             ContainerName: "your-container-name"
             ContainerPort: your-container-port
   ```

------
**참고**  
 대체 작업 세트는 원래 작업 세트로부터 서브넷, 보안 그룹, 플랫폼 버전 및 할당된 퍼블릭 IP 값을 상속합니다. AppSpec 파일에서 선택적 속성을 설정하여 대체 작업 세트에 대한 이러한 값을 재정의할 수 있습니다. 자세한 내용은 [Amazon ECS 배포를 위한 AppSpec 'resources' 섹션](reference-appspec-file-structure-resources.md#reference-appspec-file-structure-resources-ecs) 및 [Amazon ECS 배포용 AppSpec 파일 예제](reference-appspec-file-example.md#appspec-file-example-ecs) 단원을 참조하세요.

1.  AppSpec 파일을 이 튜토리얼의 사전 조건으로 생성한 S3 버킷에 업로드합니다.

# 3단계: CodeDeploy 콘솔을 사용하여 애플리케이션 배포
<a name="tutorial-ecs-deployment-deploy"></a>

 이 섹션에서는 CodeDeploy 애플리케이션과 배포 그룹을 생성하여 업데이트된 애플리케이션을 Amazon ECS에 배포합니다. 배포 중에 CodeDeploy는 애플리케이션에 대한 프로덕션 트래픽을 새로운 대체 작업 세트의 새로운 버전으로 이동합니다. 이 단계를 완료하려면 다음 항목이 필요합니다.
+  Amazon ECS 클러스터 이름.
+  Amazon ECS 서비스 이름.
+  Application Load Balancer 이름 
+  프로덕션 리스너 포트.
+  대상 그룹 이름.
+  생성한 S3 버킷의 이름.

**CodeDeploy 애플리케이션을 만들려면**

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/codedeploy/](https://console.aws.amazon.com/codedeploy/) CodeDeploy 콘솔을 엽니다.

1. **애플리케이션 생성**을 선택합니다.

1. **애플리케이션 이름**에 **ecs-demo-codedeploy-app**을 입력합니다.

1. **컴퓨팅 플랫폼**에서 **Amazon ECS**를 선택합니다.

1. **애플리케이션 생성**을 선택합니다.

**CodeDeploy 배포 그룹을 생성하려면**

1. 애플리케이션 페이지의 **Deployment groups(배포 그룹)** 탭에서 **Create deployment group(배포 그룹 생성)**을 선택합니다.

1. **Deployment group name(배포 그룹 이름)**에 **ecs-demo-dg**을 입력합니다.

1. **서비스 역할**에서 Amazon ECS에 액세스할 수 있는 권한을 CodeDeploy에 부여하는 서비스 역할을 선택합니다. 자세한 내용은 [에 대한 자격 증명 및 액세스 관리 AWS CodeDeploy](security-iam.md) 단원을 참조하십시오.

1. **환경 구성**에서 Amazon ECS 클러스터 이름과 서비스 이름을 선택합니다.

1. **로드 밸런서**에서 Amazon ECS 서비스에 트래픽을 공급하는 로드밸런서의 이름을 선택합니다.

1. **프로덕션 리스너 포트**에서 Amazon ECS 서비스에 서비스 프로덕션 트래픽을 공급하는 리스너의 포트와 프로토콜을 선택합니다(예: **HTTP: 80**). 이 자습서에는 선택 사항인 테스트 리스너가 포함되지 않으므로, **Test listener port(테스트 리스너 포트)**에서 포트를 선택하지 마십시오.

1. **Target group 1 name(대상 그룹 1 이름)**과 **Target group 2 name(대상 그룹 2 이름)**에서 배포 중 트래픽을 라우팅하기 위한 다른 대상 그룹 두 개를 선택합니다. 해당 로드밸런서용으로 생성한 대상 그룹인지 확인합니다. 무엇이 대상 그룹 1에 사용되고 무엇이 대상 그룹 2에 사용되는지는 문제되지 않습니다.

1. **Reroute traffic immediately(즉시 트래픽 다시 라우팅)**를 선택합니다.

1. **Original revision termination(원래 수정 종료)**에서 0일, 0시간, 5분을 선택합니다. 이렇게 하면 기본값(1시간)을 선택하는 경우보다 더 빠르게 배포가 완료됩니다.  
![\[CodeDeploy 콘솔의 환경 구성 섹션입니다.\]](http://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/images/ecs-demo-create-acd-dg.png)

1. [**Create deployment group**]을 선택합니다.

**Amazon ECS 애플리케이션을 배포하려면**

1. 배포 그룹 콘솔 페이지에서 **Create deployment(배포 생성)**를 선택합니다.

1.  **Deployment group(배포 그룹)**에서 **ecs-demo-dg**를 선택합니다.

1.  **Revision type(수정 유형)**에서 **My application is stored in Amazon S3(내 애플리케이션은 Amazon S3에 저장됨)**를 선택합니다. **Revision location(수정 위치)**에 S3 버킷의 이름을 입력합니다.

1.  **Revision file type(수정 파일 유형)**에서 **.json** 또는 **.yaml**을 적절하게 선택합니다.

1.  (선택 사항) **Deployment description(배포 설명)**에 배포에 대한 설명을 입력합니다.

1. **배포 만들기**를 선택합니다.

1.  **Deployment status(배포 상태)**에서 배포를 모니터링할 수 있습니다. 프로덕션 트래픽의 100%가 대체 작업 세트로 라우팅된 후 5분 대기 시간이 만료되기 전에 **원래 작업 세트 종료**를 선택하여 원래 작업 세트를 즉시 종료할 수 있습니다. **Terminate original task set(원래 작업 세트 종료)**를 선택하지 않으면 지정한 5분 대기 시간이 만료된 후에 원래 작업 세트가 종료됩니다.  
![\[CodeDeploy 콘솔의 배포 상태 섹션입니다.\]](http://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/images/ecs-tutorial-deployment-status-without-test-listener.png)

# 4단계: 정리
<a name="tutorial-ecs-clean-up"></a>

 다음 자습서인 [튜토리얼: Amazon ECS 서비스 배포 및 확인 테스트](tutorial-ecs-deployment-with-hooks.md)은(는) 이 자습서를 기반으로 진행되며 여기서 생성한 CodeDeploy 애플리케이션과 배포 그룹을 사용합니다. 해당 튜토리얼의 단계를 따르려는 경우 이 단계를 건너뛰고 여기서 생성한 리소스를 삭제하지 마십시오.

**참고**  
 AWS 계정에는 생성한 CodeDeploy 리소스에 대한 요금이 부과되지 않습니다.

이러한 단계의 리소스 이름은 이 튜토리얼에서 제안된 이름입니다(예: CodeDeploy 애플리케이션의 이름은 **ecs-demo-codedeploy-app**). 다른 이름을 사용한 경우 정리 중에 반드시 해당 이름을 사용해야 합니다.

1. [delete-deployment-group](https://docs.aws.amazon.com/cli/latest/reference/deploy/delete-deployment-group.html) 명령을 사용하여 CodeDeploy 배포 그룹을 삭제합니다.

   ```
   aws deploy delete-deployment-group --application-name ecs-demo-codedeploy-app --deployment-group-name ecs-demo-dg --region aws-region-id
   ```

1. [delete-application](https://docs.aws.amazon.com/cli/latest/reference/deploy/delete-application.html) 명령을 사용하여 CodeDeploy 애플리케이션을 삭제합니다.

   ```
   aws deploy delete-application --application-name ecs-demo-codedeploy-app --region aws-region-id
   ```

# 튜토리얼: Amazon ECS 서비스 배포 및 확인 테스트
<a name="tutorial-ecs-deployment-with-hooks"></a>

 이 튜토리얼에서는 Lambda 함수를 사용하여 업데이트된 Amazon ECS 애플리케이션의 배포 부분을 확인합니다. 이 튜토리얼에서는 [튜토리얼: Amazon ECS에 애플리케이션 배포](tutorial-ecs-deployment.md)에서 사용한 CodeDeploy 애플리케이션, CodeDeploy 배포 그룹, Amazon ECS 애플리케이션을 사용합니다. 이 자습서를 시작하기 전에 해당 자습서를 완료하십시오.

 확인 테스트를 추가하려면 먼저 Lambda 함수에서 테스트를 구현합니다. 다음에는, 배포 AppSpec 파일에서 테스트할 수명 주기 후크에 대한 Lambda 함수를 지정합니다. 확인 테스트가 실패하면 배포가 중지되고 롤백되며 실패로 표시됩니다. 테스트가 성공하면 배포가 다음 배포 수명 주기 이벤트 또는 후크로 계속됩니다.

 확인 테스트를 포함한 Amazon ECS 배포 중에 CodeDeploy는 프로덕션 트래픽 리스너 하나와 테스트 트래픽 리스너 하나라는 두 개의 대상 그룹으로 구성된 로드 밸런서를 사용합니다. 다음 다이어그램에서는 배포가 시작되기 전에 로드 밸런서, 프로덕션 및 테스트 리스너, 대상 그룹 및 Amazon ECS 애플리케이션이 관련되는 방식을 보여 줍니다. 이 튜토리얼에서는 Application Load Balancer를 사용합니다. Network Load Balancer를 사용할 수도 있습니다.

![\[Application Load Balancer 또는 Network Load Balancer, 리스너, 대상 그룹, 태스크 세트 및 Amazon ECS 서비스 간의 연결입니다.\]](http://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/images/codedeploy-ecs-deployment-step-1.png)


 Amazon ECS 배포 중에는 테스트를 위한 다섯 개의 수명 주기 후크가 있습니다. 이 튜토리얼에서는 세 번째 수명 주기 배포 후크인 `AfterAllowTestTraffic` 중에 테스트 하나를 구현합니다. 자세한 내용은 [Amazon ECS 배포를 위한 수명 주기 이벤트 후크 목록](reference-appspec-file-structure-hooks.md#reference-appspec-file-structure-hooks-list-ecs) 단원을 참조하십시오. 성공적인 배포 후, 프로덕션 트래픽 리스너는 새로운 대체 작업 세트에 트래픽을 제공하고 원래 작업 세트는 종료됩니다. 다음 다이어그램에서는 성공적인 배포 후에 리소스가 관련되는 방식을 보여 줍니다. 자세한 내용은 [Amazon ECS 배포 중에 발생하는 일](deployment-steps-ecs.md#deployment-steps-what-happens) 단원을 참조하십시오.

![\[배포 후 Application Load Balancer 또는 Network Load Balancer, 리스너, 대상 그룹 및 교체 태스크 세트 간의 연결입니다.\]](http://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/images/codedeploy-ecs-deployment-step-6.png)


**참고**  
이 자습서를 완료하면 AWS 계정에 요금이 부과될 수 있습니다. 여기에는 CodeDeploy AWS Lambda및 CloudWatch에 부과될 수 있는 요금이 포함됩니다. 자세한 내용은 [AWS CodeDeploy 요금](https://aws.amazon.com/codedeploy/pricing/), [AWS Lambda 요금](https://aws.amazon.com/lambda/pricing/) 및 [Amazon CloudWatch 요금](https://aws.amazon.com/cloudwatch/pricing/)을 참조하세요.

**Topics**
+ [사전 조건](tutorial-ecs-with-hooks-prereqs.md)
+ [1단계: 테스트 리스너 생성](tutorial-ecs-with-hooks-create-second-listener.md)
+ [2단계: Amazon ECS 애플리케이션 업데이트](tutorial-ecs-with-hooks-update-the-ecs-application.md)
+ [3단계: 수명 주기 후크 Lambda 함수 생성](tutorial-ecs-with-hooks-create-hooks.md)
+ [4단계: AppSpec 파일 업데이트](tutorial-ecs-with-hooks-create-appspec-file.md)
+ [5단계: CodeDeploy 콘솔을 사용하여 Amazon ECS 서비스 배포](tutorial-ecs-with-hooks-deployment.md)
+ [6단계: CloudWatch Logs에서 Lambda 후크 함수 출력 보기](tutorial-ecs-with-hooks-view-cw-logs.md)
+ [7단계: 정리](tutoria-ecs-with-hooks-clean-up.md)

# 사전 조건
<a name="tutorial-ecs-with-hooks-prereqs"></a>

이 자습서를 성공적으로 완료하려면 먼저 다음을 수행해야 합니다.
+  [튜토리얼: Amazon ECS에 애플리케이션 배포](tutorial-ecs-deployment.md)에 대해 [사전 조건](tutorial-ecs-prereqs.md)의 사전 조건을 충족합니다.
+  [튜토리얼: Amazon ECS에 애플리케이션 배포](tutorial-ecs-deployment.md)의 단계를 수행하세요. 다음 사항을 기록해 둡니다.
  +  로드 밸런서의 이름입니다.
  +  대상 그룹의 이름입니다.
  +  로드 밸런서의 리스너에서 사용되는 포트입니다.
  +  로드 밸런서의 ARN입니다. 이 항목을 사용하여 새 리스너를 생성합니다.
  +  대상 그룹 중 하나의 ARN입니다. 이 항목을 사용하여 새 리스너를 생성합니다.
  +  사용자가 생성하는 CodeDeploy 애플리케이션 및 배포 그룹입니다.
  +  사용자가 생성하는 AppSpec 파일입니다. 이 항목은 CodeDeploy 배포에서 사용됩니다. 이 튜토리얼에서는 이 파일을 편집합니다.

# 1단계: 테스트 리스너 생성
<a name="tutorial-ecs-with-hooks-create-second-listener"></a>

 확인 테스트를 포함한 Amazon ECS 배포에는 두 번째 리스너가 필요합니다. 이 리스너는 대체 작업 세트에 있는 업데이트된 Amazon ECS 애플리케이션에 테스트 트래픽을 제공하는 데 사용됩니다. 확인 테스트는 테스트 트래픽에 대해 실행됩니다.

 테스트 트래픽에 대한 리스너는 대상 그룹 중 하나를 사용할 수 있습니다. [create-listener](https://docs.aws.amazon.com/cli/latest/reference/elbv2/create-listener.html) AWS CLI 명령을 사용하여 테스트 트래픽을 포트 8080으로 전달하는 기본 규칙으로 두 번째 리스너를 생성합니다. 로드 밸런서의 ARN과 대상 그룹 중 하나의 ARN을 사용합니다.

```
aws elbv2 create-listener --load-balancer-arn your-load-balancer-arn \
--protocol HTTP --port 8080 \
--default-actions Type=forward,TargetGroupArn=your-target-group-arn --region your-aws-region
```

# 2단계: Amazon ECS 애플리케이션 업데이트
<a name="tutorial-ecs-with-hooks-update-the-ecs-application"></a>

 이 단원에서는 해당 작업 정의의 새 버전을 사용하도록 Amazon ECS 애플리케이션을 업데이트합니다. 새 버전을 만들고 태그를 추가하여 마이너 업데이트를 새 버전에 추가합니다.

**작업 정의를 업데이트하려면**

1. [https://console.aws.amazon.com/ecs/](https://console.aws.amazon.com/ecs/)에서 Amazon ECS 클래식 콘솔을 엽니다.

1.  탐색 창에서 **태스크 정의**를 선택합니다.

1.  Amazon ECS 서비스에 사용되는 작업 정의에 대한 확인란을 선택합니다.

1.  **Create new revision(새 수정 생성)**을 선택합니다.

1.  태그를 추가하여 작업 정의에 대한 작은 업데이트를 수행합니다. 페이지 하단의 **Tags(태그)**에서 새 키 및 값 페어를 입력하여 새 태그를 만듭니다.

1.  **생성(Create)**을 선택합니다. 작업 정의의 수정 번호가 하나 증가된 것이 보여야 합니다.

1.  **JSON** 탭을 선택합니다. `taskDefinitionArn`의 값을 기록해 둡니다. 형식은 `arn:aws:ecs:aws-region: account-id:task-definition/task-definition-family: task-definition-revision`입니다. 이 항목은 업데이트된 작업 정의의 ARN입니다.

# 3단계: 수명 주기 후크 Lambda 함수 생성
<a name="tutorial-ecs-with-hooks-create-hooks"></a>

이 단원에서는 Amazon ECS 배포의 `AfterAllowTestTraffic` 후크에 대한 Lambda 함수를 구현합니다. Lambda 함수는 업데이트된 Amazon ECS 애플리케이션이 설치되기 전에 확인 테스트를 실행합니다. 이 튜토리얼의 경우 Lambda 함수는 `Succeeded`을(를) 반환합니다. 실제 배포 중에 확인 테스트는 확인 테스트의 결과에 따라 `Succeeded` 또는 `Failed`를 반환합니다. 또한 실제 배포 중에는 다른 Amazon ECS 배포 수명 주기 이벤트 후크(`BeforeInstall`, `AfterInstall`, `BeforeAllowTraffic`, `AfterAllowTraffic`) 중 하나 이상에 대한 Lambda 테스트 함수를 구현할 수 있습니다. 자세한 내용은 [Amazon ECS 배포를 위한 수명 주기 이벤트 후크 목록](reference-appspec-file-structure-hooks.md#reference-appspec-file-structure-hooks-list-ecs) 단원을 참조하십시오.

 Lambda 함수를 생성하려면 IAM 역할이 필요합니다. 이 역할은 CloudWatch Logs에 쓰고 CodeDeploy 수명 주기 후크의 상태를 설정할 수 있는 권한을 Lambda 함수에 부여합니다.

**IAM 역할을 생성하려면**

1. [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)에서 IAM 콘솔을 엽니다.

1. 탐색 창에서 **역할**을 선택한 후 **역할 생성**을 선택합니다.

1.  다음 속성을 사용하여 역할을 만듭니다.
   +  **신뢰할 수 있는 엔터티**: **AWS Lambda**.
   +  **권한**: **AWSLambdaBasicExecutionRole**. 이 항목은 CloudWatch Logs에 기록할 수 있는 권한을 Lambda 함수에 부여합니다.
   +  **역할 이름**: **`lambda-cli-hook-role`**.

   자세한 내용은 [AWS Lambda 실행 역할 생성을 참조하세요](https://docs.aws.amazon.com/lambda/latest/dg/with-userapp.html#with-userapp-walkthrough-custom-events-create-iam-role).

1.  생성한 역할에 `codedeploy:PutLifecycleEventHookExecutionStatus` 권한을 연결합니다. 이 항목은 배포 중에 CodeDeploy 수명 주기 후크의 상태를 설정할 수 있는 권한을 Lambda 함수에 부여합니다. 자세한 내용은 *AWS Identity and Access Management 사용 설명서*의 [IAM 자격 증명 권한 추가](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html#add-policies-console) 및 *CodeDeploy API 참조*의 [PutLifecycleEventHookExecutionStatus](https://docs.aws.amazon.com/codedeploy/latest/APIReference/API_PutLifecycleEventHookExecutionStatus.html)를 참조하세요.

**`AfterAllowTestTraffic` 후크 Lambda 함수를 생성하려면**

1.  다음 콘텐츠를 가진 `AfterAllowTestTraffic.js`이라는 파일을 생성합니다: 

   ```
   'use strict';
    
    const AWS = require('aws-sdk');
    const codedeploy = new AWS.CodeDeploy({apiVersion: '2014-10-06'});
    
    exports.handler = (event, context, callback) => {
    
    	console.log("Entering AfterAllowTestTraffic hook.");
    	
    	// Read the DeploymentId and LifecycleEventHookExecutionId from the event payload
     var deploymentId = event.DeploymentId;
    	var lifecycleEventHookExecutionId = event.LifecycleEventHookExecutionId;
    	var validationTestResult = "Failed";
    	
    	// Perform AfterAllowTestTraffic validation tests here. Set the test result 
    	// to "Succeeded" for this tutorial.
    	console.log("This is where AfterAllowTestTraffic validation tests happen.")
    	validationTestResult = "Succeeded";
    	
    	// Complete the AfterAllowTestTraffic hook by sending CodeDeploy the validation status
    	var params = {
    		deploymentId: deploymentId,
    		lifecycleEventHookExecutionId: lifecycleEventHookExecutionId,
    		status: validationTestResult // status can be 'Succeeded' or 'Failed'
    	};
    	
    	// Pass CodeDeploy the prepared validation test results.
    	codedeploy.putLifecycleEventHookExecutionStatus(params, function(err, data) {
    		if (err) {
    			// Validation failed.
    			console.log('AfterAllowTestTraffic validation tests failed');
    			console.log(err, err.stack);
    			callback("CodeDeploy Status update failed");
    		} else {
    			// Validation succeeded.
    			console.log("AfterAllowTestTraffic validation tests succeeded");
    			callback(null, "AfterAllowTestTraffic validation tests succeeded");
    		}
    	});
    }
   ```

1.  Lambda 배포 패키지를 만듭니다.

   ```
   zip AfterAllowTestTraffic.zip AfterAllowTestTraffic.js 
   ```

1.  `create-function` 명령을 사용하여 `AfterAllowTestTraffic` 후크에 대한 Lambda 함수를 생성합니다.

   ```
   aws lambda create-function --function-name AfterAllowTestTraffic \
          --zip-file fileb://AfterAllowTestTraffic.zip \
          --handler AfterAllowTestTraffic.handler \
          --runtime nodejs10.x \
          --role arn:aws:iam::aws-account-id:role/lambda-cli-hook-role
   ```

1.  `create-function` 응답에 있는 Lambda 함수 ARN을 기록해 둡니다. 다음 단계에서 CodeDeploy 배포의 AppSpec 파일을 업데이트할 때 이 ARN을 사용합니다.

# 4단계: AppSpec 파일 업데이트
<a name="tutorial-ecs-with-hooks-create-appspec-file"></a>

 이 단원에서는 `Hooks` 섹션을 사용하여 AppSpec 파일을 업데이트합니다. `Hooks` 섹션에서는 `AfterAllowTestTraffic` 수명 주기 후크에 대한 Lambda 함수를 지정합니다.

**AppSpec 파일을 업데이트하려면**

1.  [튜토리얼: Amazon ECS에 애플리케이션 배포](tutorial-ecs-deployment.md)의 [2단계: AppSpec 파일 생성](tutorial-ecs-create-appspec-file.md)에서 생성한 AppSpec 파일을 엽니다.

1.  [2단계: Amazon ECS 애플리케이션 업데이트](tutorial-ecs-with-hooks-update-the-ecs-application.md)에서 기록한 작업 정의 ARN을 사용하여 `TaskDefinition` 속성을 업데이트합니다.

1. `Hooks` 섹션을 복사하여 AppSpec 파일에 붙여 넣습니다. [3단계: 수명 주기 후크 Lambda 함수 생성](tutorial-ecs-with-hooks-create-hooks.md)에서 기록한 Lambda 함수의 ARN을 사용하여 `AfterAllowTestTraffic` 이후에 ARN을 업데이트합니다.

------
#### [ JSON AppSpec ]

   ```
   {
     "version": 0.0,
     "Resources": [
       {
         "TargetService": {
           "Type": "AWS::ECS::Service",
           "Properties": {
             "TaskDefinition": "arn:aws:ecs:aws-region-id:aws-account-id::task-definition/ecs-demo-task-definition:revision-number",
             "LoadBalancerInfo": {
               "ContainerName": "sample-website",
               "ContainerPort": 80
             }
           }
         }
       }
     ],
     "Hooks": [
       {
         "AfterAllowTestTraffic": "arn:aws:lambda:aws-region-id:aws-account-id:function:AfterAllowTestTraffic"
       }
     ]
   }
   ```

------
#### [ YAML AppSpec ]

   ```
   version: 0.0
   Resources:
     - TargetService:
         Type: AWS::ECS::Service
         Properties:
           TaskDefinition: "arn:aws:ecs:aws-region-id:aws-account-id::task-definition/ecs-demo-task-definition:revision-number"
           LoadBalancerInfo:
             ContainerName: "sample-website"
             ContainerPort: 80
   Hooks:
     - AfterAllowTestTraffic: "arn:aws:lambda:aws-region-id:aws-account-id:function:AfterAllowTestTraffic"
   ```

------

1.  AppSpec 파일을 저장하고 S3 버킷에 업로드합니다.

# 5단계: CodeDeploy 콘솔을 사용하여 Amazon ECS 서비스 배포
<a name="tutorial-ecs-with-hooks-deployment"></a>

 이 단원에서는 테스트 리스너를 위한 포트를 지정하여 배포 그룹을 업데이트합니다. 이 리스너는 [1단계: 테스트 리스너 생성](tutorial-ecs-with-hooks-create-second-listener.md)에서 생성한 리스너입니다. 배포 중에 CodeDeploy는 테스트 리스너를 사용하여 대체 작업 세트에 제공되는 테스트 트래픽을 사용하여 `AfterAllowTestTraffic` 배포 수명 주기 후크 중에 확인 테스트를 실행합니다. 확인 테스트는 `Succeeded` 결과를 반환하므로, 배포는 다음 배포 수명 주기 이벤트로 진행됩니다. 실제 시나리오에서 테스트 함수는 `Succeeded` 또는 `Failed`를 반환합니다.

**테스트 리스너를 배포 그룹에 추가하려면**

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/codedeploy/](https://console.aws.amazon.com/codedeploy/) CodeDeploy 콘솔을 엽니다.

1. 탐색 창에서 **Applications(애플리케이션)**을 선택합니다.

1. [튜토리얼: Amazon ECS에 애플리케이션 배포](tutorial-ecs-deployment.md)에서 생성한 애플리케이션을 선택합니다. 제안된 이름을 사용한 경우 이 항목은 **ecs-demo-codedeploy-app**입니다.

1. **Deployment groups(배포 그룹)**에서, [튜토리얼: Amazon ECS에 애플리케이션 배포](tutorial-ecs-deployment.md)에서 생성한 배포 그룹을 선택합니다. 제안된 이름을 사용한 경우 이 항목은 **ecs-demo-dg**입니다.

1.  **편집**을 선택합니다.

1. **Test listener port(테스트 리스너 포트)**에서 이 튜토리얼의 앞부분에서 생성한 테스트 리스너를 위한 포트와 프로토콜을 선택합니다. 이 항목은 **HTTP: 8080**이어야 합니다.

1.  **변경 사항 저장**을 선택합니다.

**Amazon ECS 애플리케이션을 배포하려면**

1. 배포 그룹 콘솔 페이지에서 **Create deployment(배포 생성)**를 선택합니다.

1.  **Deployment group(배포 그룹)**에서 **ecs-demo-dg**를 선택합니다.

1.  **Revision type(수정 유형)**에서 **My application is stored in Amazon S3(내 애플리케이션은 Amazon S3에 저장됨)**를 선택합니다. **수정 버전 위치**에 S3 버킷의 이름과 AppSpec 파일(예: **s3://my-s3-bucket/appspec.json**)을 입력합니다.

1.  **Revision file type(수정 파일 유형)**에서 **.json** 또는 **.yaml**을 적절하게 선택합니다.

1.  (선택 사항) **Deployment description(배포 설명)**에 배포에 대한 설명을 입력합니다.

1. **배포 만들기**를 선택합니다.

 **Deployment status(배포 상태)**에서 배포를 모니터링할 수 있습니다. 프로덕션 트래픽의 100%가 대체 작업 세트로 라우팅된 후에는 **원래 작업 세트 종료**를 선택하여 원래 작업 세트를 즉시 종료할 수 있습니다. **원래 작업 세트 종료**를 선택하지 않으면 배포 그룹을 생성할 때 지정한 기간 후에 원래 작업 세트가 종료됩니다.

![\[CodeDeploy 콘솔의 배포 상태 섹션입니다.\]](http://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/images/ecs-tutorial-deployment-status-with-test-listener.png)


# 6단계: CloudWatch Logs에서 Lambda 후크 함수 출력 보기
<a name="tutorial-ecs-with-hooks-view-cw-logs"></a>

 CodeDeploy 배포가 성공하면 Lambda 후크 함수의 확인 테스트도 성공합니다. CloudWatch Logs에서 후크 함수에 대한 로그를 조회하여 이 결과를 확인할 수 있습니다.

1. [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)에서 CloudWatch 콘솔을 엽니다.

1.  탐색 창에서 **로그**를 선택합니다. AppSpec 파일에서 지정한 Lambda 후크 함수에 대한 새로운 로그 그룹 하나가 보여야 합니다.  
![\[CloudWatch 콘솔의 새 로그 그룹입니다.\]](http://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/images/ecs-demo-cw-logs.png)

1.  새로운 로그 그룹을 선택합니다. 이 항목은 **/aws/lambda/AfterAllowTestTrafficHook**여야 합니다.

1.  로그 스트림을 선택합니다. 두 개 이상의 로그 그룹이 보이면 **Last Event Time(마지막 이벤트 시간)** 아래에 가장 최근 날짜와 시간이 있는 로그 그룹을 선택합니다.

1.  로그 스크림 이벤트를 확장하여 Lambda 후크 함수가 성공 메시지를 로그에 기록했는지 확인합니다. 다음은 `AfterAllowTraffic` Lambda 후크 함수가 성공했음을 보여 줍니다.  
![\[AfterAllowTraffic 후크를 보여주는 로그 스트림 이벤트입니다.\]](http://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/images/ecs-demo-cw-log-events.png)

# 7단계: 정리
<a name="tutoria-ecs-with-hooks-clean-up"></a>

 이 자습서를 완료한 후에는 사용하지 않는 리소스에 요금이 발생하지 않도록 연결된 리소스를 정리합니다. 이 단계의 리소스 이름은 이 튜토리얼에서 제안된 이름입니다(예: CodeDeploy 애플리케이션의 이름은**ecs-demo-codedeploy-app**). 다른 이름을 사용한 경우 정리에서 반드시 해당 이름을 사용해야 합니다.

**자습서 리소스를 정리하려면**

1. [delete-deployment-group](https://docs.aws.amazon.com/cli/latest/reference/deploy/delete-deployment-group.html) 명령을 사용하여 CodeDeploy 배포 그룹을 삭제합니다.

   ```
   aws deploy delete-deployment-group --application-name ecs-demo-deployment-group --deployment-group-name ecs-demo-dg --region aws-region-id
   ```

1. [delete-application](https://docs.aws.amazon.com/cli/latest/reference/deploy/delete-application.html) 명령을 사용하여 CodeDeploy 애플리케이션을 삭제합니다.

   ```
   aws deploy delete-application --application-name ecs-demo-deployment-group --region aws-region-id
   ```

1. [delete-function](https://docs.aws.amazon.com/cli/latest/reference/lambda/delete-function.html) 명령을 사용하여 Lambda 후크 함수를 삭제합니다.

   ```
   aws lambda delete-function --function-name AfterAllowTestTraffic
   ```

1. [delete-log-group](https://docs.aws.amazon.com/cli/latest/reference/logs/delete-log-group.html) 명령을 사용하여 CloudWatch 로그 그룹을 삭제합니다.

   ```
   aws logs delete-log-group --log-group-name /aws/lambda/AfterAllowTestTraffic
   ```

# 자습서: CodeDeploy 및 AWS 서버리스 애플리케이션 모델을 사용하여 업데이트된 Lambda 함수 배포
<a name="tutorial-lambda-sam"></a>

AWS SAM은 서버리스 애플리케이션을 빌드하기 위한 오픈 소스 프레임워크입니다. AWS SAM 템플릿의 YAML 구문을 CloudFormation 구문으로 변환하고 확장하여 Lambda 함수와 같은 서버리스 애플리케이션을 빌드합니다. 자세한 내용은 [AWS Serverless Application Model이란 무엇입니까?](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html)를 참조하세요.

 이 자습서에서는 AWS SAM을 사용하여 다음을 수행하는 솔루션을 생성합니다.
+  Lambda 함수를 생성합니다.
+  CodeDeploy 애플리케이션 및 배포 그룹을 생성합니다.
+  CodeDeploy 수명 주기 후크 중에 배포 확인 테스트를 실행하는 Lambda 함수 두 개를 생성합니다.
+  언제 Lambda 함수가 업데이트되는지를 감지합니다. Lambda 함수를 업데이트하면 Lambda 함수의 원래 버전에서 업데이트된 버전으로 프로덕션 트래픽을 증분식으로 이동하는 CodeDeploy를 통해 배포가 트리거됩니다.

**참고**  
이 튜토리얼에서는 결과적으로 AWS 계정에 요금이 부과될 수 있는 리소스를 생성해야 합니다. 여기에는 CodeDeploy, Amazon CloudWatch 및에 대해 발생할 수 있는 요금이 포함됩니다 AWS Lambda. 자세한 내용은 [CodeDeploy 요금](https://aws.amazon.com/codedeploy/pricing/), [Amazon CloudWatch 요금](https://aws.amazon.com/cloudwatch/pricing/) 및 [AWS Lambda 요금](https://aws.amazon.com/lambda/pricing/)을 참조하세요.

**Topics**
+ [사전 조건](tutorial-lambda-sam-prereqs.md)
+ [1단계: 인프라 설정](tutorial-lambda-sam-setup-infrastructure.md)
+ [2단계: Lambda 함수 업데이트](tutorial-lambda-sam-update-function.md)
+ [3단계: 업데이트된 Lambda 함수 배포](tutorial-lambda-sam-deploy-update.md)
+ [4단계: 배포 결과 보기](tutorial-lambda-sam-deploy-view-results.md)
+ [5단계: 정리](tutorial-lambda-clean-up.md)

# 사전 조건
<a name="tutorial-lambda-sam-prereqs"></a>

이 자습서를 완료하려면 먼저 다음을 수행해야 합니다.
+  [CodeDeploy 시작하기](getting-started-codedeploy.md)의 단계를 수행하세요.
+  AWS Serverless Application Model CLI를 설치합니다. 자세한 내용은 [AWS SAM CLI 설치를 참조하세요](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html).
+  S3 버킷을 생성합니다. AWS SAM은 [AWS SAM 템플릿](https://docs.aws.amazon.com/en_us/codedeploy/latest/userguide/tutorial-lambda-sam-template.html)에서 참조되는 아티팩트를이 버킷에 업로드합니다.

# 1단계: 인프라 설정
<a name="tutorial-lambda-sam-setup-infrastructure"></a>

 이 주제에서는를 AWS SAM 사용하여 AWS SAM 템플릿 및 Lambda 함수에 대한 파일을 생성하는 방법을 보여줍니다. 그런 다음 및 `deploy` 명령을 사용하여 AWS SAM `package` 인프라에서 구성 요소를 생성합니다. 인프라가 준비되면 CodeDeploy 애플리케이션 및 배포 그룹, 업데이트하고 배포할 Lambda 함수, Lambda 함수를 배포할 때 실행되는 확인 테스트가 포함된 Lambda 함수 두 개를 갖추게 됩니다. 완료되면 CloudFormation 를 사용하여 Lambda 콘솔 또는에서 구성 요소를 보고 Lambda 함수를 테스트 AWS CLI 할 수 있습니다.

**Topics**
+ [파일 생성](tutorial-lambda-create-files.md)
+ [AWS SAM 애플리케이션 패키징](tutorial-lambda-sam-package.md)
+ [AWS SAM 애플리케이션 배포](tutorial-lambda-sam-deploy.md)
+ [(선택 사항) 인프라 검사 및 테스트](tutorial-lambda-sam-confirm-components.md)

# 파일 생성
<a name="tutorial-lambda-create-files"></a>

 인프라를 생성하려면 다음 파일을 생성해야 합니다.
+ `template.yml`
+ `myDateTimeFunction.js`
+ `beforeAllowTraffic.js`
+ `afterAllowTraffic.js`

**Topics**
+ [AWS SAM 템플릿 생성](tutorial-lambda-sam-template.md)
+ [Lambda 함수에 대한 파일 생성](tutorial-lambda-sam-create-lambda-function.md)
+ [BeforeAllowTraffic Lambda 함수에 대한 파일 생성](tutorial-lambda-sam-create-lambda-before-traffic.md)
+ [AfterAllowTraffic Lambda 함수에 대한 파일 생성](tutorial-lambda-sam-create-lambda-after-traffic.md)

# AWS SAM 템플릿 생성
<a name="tutorial-lambda-sam-template"></a>

인프라의 구성 요소를 지정하는 AWS SAM 템플릿 파일을 생성합니다.

**AWS SAM 템플릿을 생성하려면**

1.  `SAM-Tutorial`이라는 디렉터리를 생성합니다.

1.  `SAM-Tutorial` 디렉터리에서 `template.yml`이라는 파일을 생성합니다.

1.  다음 YAML 코드를 `template.yml`에 복사합니다. 이 파일은 AWS SAM 템플릿입니다.

   ```
   AWSTemplateFormatVersion : '2010-09-09'
   Transform: AWS::Serverless-2016-10-31
   Description: A sample SAM template for deploying Lambda functions.
   
   Resources:
   # Details about the myDateTimeFunction Lambda function
     myDateTimeFunction:
       Type: AWS::Serverless::Function
       Properties:
         Handler: myDateTimeFunction.handler
         Runtime: nodejs18.x
   # Instructs your myDateTimeFunction is published to an alias named "live".      
         AutoPublishAlias: live
   # Grants this function permission to call lambda:InvokeFunction
         Policies:
           - Version: "2012-10-17"		 	 	 
             Statement: 
             - Effect: "Allow"
               Action: 
                 - "lambda:InvokeFunction"
               Resource: '*'
         DeploymentPreference:
   # Specifies the deployment configuration      
             Type: Linear10PercentEvery1Minute
   # Specifies Lambda functions for deployment lifecycle hooks
             Hooks:
               PreTraffic: !Ref beforeAllowTraffic
               PostTraffic: !Ref afterAllowTraffic
               
   # Specifies the BeforeAllowTraffic lifecycle hook Lambda function
     beforeAllowTraffic:
       Type: AWS::Serverless::Function
       Properties:
         Handler: beforeAllowTraffic.handler
         Policies:
           - Version: "2012-10-17"		 	 	 
   # Grants this function permission to call codedeploy:PutLifecycleEventHookExecutionStatus        
             Statement: 
             - Effect: "Allow"
               Action: 
                 - "codedeploy:PutLifecycleEventHookExecutionStatus"
               Resource:
                 !Sub 'arn:aws:codedeploy:${AWS::Region}:${AWS::AccountId}:deploymentgroup:${ServerlessDeploymentApplication}/*'
           - Version: "2012-10-17"		 	 	 
   # Grants this function permission to call lambda:InvokeFunction        
             Statement: 
             - Effect: "Allow"
               Action: 
                 - "lambda:InvokeFunction"
               Resource: !Ref myDateTimeFunction.Version
         Runtime: nodejs18.x
   # Specifies the name of the Lambda hook function      
         FunctionName: 'CodeDeployHook_beforeAllowTraffic'
         DeploymentPreference:
           Enabled: false
         Timeout: 5
         Environment:
           Variables:
             NewVersion: !Ref myDateTimeFunction.Version
             
   # Specifies the AfterAllowTraffic lifecycle hook Lambda function
     afterAllowTraffic:
       Type: AWS::Serverless::Function
       Properties:
         Handler: afterAllowTraffic.handler
         Policies:
           - Version: "2012-10-17"		 	 	 
             Statement: 
   # Grants this function permission to call codedeploy:PutLifecycleEventHookExecutionStatus         
             - Effect: "Allow"
               Action: 
                 - "codedeploy:PutLifecycleEventHookExecutionStatus"
               Resource:
                 !Sub 'arn:aws:codedeploy:${AWS::Region}:${AWS::AccountId}:deploymentgroup:${ServerlessDeploymentApplication}/*'
           - Version: "2012-10-17"		 	 	 
             Statement: 
   # Grants this function permission to call lambda:InvokeFunction          
             - Effect: "Allow"
               Action: 
                 - "lambda:InvokeFunction"
               Resource: !Ref myDateTimeFunction.Version
         Runtime: nodejs18.x
   # Specifies the name of the Lambda hook function      
         FunctionName: 'CodeDeployHook_afterAllowTraffic'
         DeploymentPreference:
           Enabled: false
         Timeout: 5
         Environment:
           Variables:
             NewVersion: !Ref myDateTimeFunction.Version
   ```

이 템플릿은 다음을 지정합니다. 자세한 내용은 [AWS SAM 템플릿 개념](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-template-basics.html)을 참조하세요.

**Lambda 함수 `myDateTimeFunction`**  
 이 Lambda 함수가 게시되면 템플릿의 `AutoPublishAlias`줄은 이 함수를 `live` (이)라는 별칭에 연결합니다. 이 자습서의 뒷부분에서이 함수를 업데이트 AWS CodeDeploy 하면 프로덕션 트래픽을 원래 버전에서 업데이트된 버전으로 점진적으로 이동하는 배포가 트리거됩니다.

**두 개의 Lambda 배포 확인 함수**  
 다음 Lambda 함수는 CodeDeploy 수명 주기 후크 중에 실행됩니다. 이 함수에는 업데이트된 `myDateTimeFunction`의 배포를 확인하는 코드가 포함되어 있습니다. 확인 테스트의 결과는 `PutLifecycleEventHookExecutionStatus` API 메서드를 사용하여 CodeDeploy에 전달됩니다. 확인 테스트가 실패하면 배포가 실패하고 롤백됩니다.  
+  `CodeDeployHook_beforeAllowTraffic`은 `BeforeAllowTraffic` 후크 중에 실행됩니다.
+  `CodeDeployHook_afterAllowTraffic`은 `AfterAllowTraffic` 후크 중에 실행됩니다.
두 함수의 이름은 모두 `CodeDeployHook_`로 시작합니다. `CodeDeployRoleForLambda` 역할은 이름이 이 접두사로 시작하는 Lambda 함수의 Lambda `invoke` 메서드에 대한 호출만 허용합니다. 자세한 내용은 [AWS Lambda 배포를 위한 AppSpec 'hooks' 섹션](reference-appspec-file-structure-hooks.md#appspec-hooks-lambda)와(과) *CodeDeploy API 참조*의 [PutLifecycleEventHookExecutionStatus](https://docs.aws.amazon.com/codedeploy/latest/APIReference/API_PutLifecycleEventHookExecutionStatus.html)를 참조하세요.

**업데이트된 Lambda 함수의 자동 감지**  
 `AutoPublishAlias` 기간은 `myDateTimeFunction` 함수가 언제 변경되는지를 감지한 다음 `live` 별칭을 사용하여 함수를 배포합니다.

**배포 구성**  
 배포 구성에 따라 CodeDeploy 애플리케이션이 Lambda 함수의 원래 버전에서 새 버전으로 트래픽을 이동하는 속도가 결정됩니다. 이 템플릿은 미리 정의된 배포 구성인 `Linear10PercentEvery1Minute`를 지정합니다.  
 AWS SAM 템플릿에서는 사용자 지정 배포 구성을 지정할 수 없습니다. 자세한 내용은 [CodeDeploy에서 배포 구성 만들기](deployment-configurations-create.md) 단원을 참조하십시오.

**배포 수명 주기 후크 함수**  
 `Hooks` 섹션은 수명 주기 이벤트 후크 중에 실행할 함수를 지정합니다. `PreTraffic`은 `BeforeAllowTraffic` 후크 중에 실행되는 함수를 지정합니다. `PostTraffic`는 `AfterAllowTraffic` 후크 중에 실행되는 함수를 지정합니다.

**또 다른 Lambda 함수를 호출할 Lambda의 권한**  
 지정된 `lambda:InvokeFunction` 권한은 AWS SAM 애플리케이션에서 사용하는 역할에 Lambda 함수를 호출할 수 있는 권한을 부여합니다. 이 권한은 확인 테스트 중에 `CodeDeployHook_beforeAllowTraffic` 및 `CodeDeployHook_afterAllowTraffic` 함수가 배포된 Lambda 함수를 호출할 때 필요합니다.

# Lambda 함수에 대한 파일 생성
<a name="tutorial-lambda-sam-create-lambda-function"></a>

이 튜토리얼에서 나중에 업데이트하고 배포하는 함수에 대한 파일을 생성합니다.

**참고**  
 Lambda 함수는 AWS Lambda에서 지원되는 모든 런타임을 사용할 수 있습니다. 자세한 내용은 [AWS Lambda 런타임](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html)을 참조하세요.

**Lambda 함수를 만들려면**

1.  텍스트 파일을 생성하고 `SAM-Tutorial` 디렉터리에 `myDateTimeFunction.js`로 저장합니다.

1.  다음 Node.js 코드를 `myDateTimeFunction.js`에 복사합니다.

   

   ```
   'use strict';
       
       exports.handler = function(event, context, callback) {
       
         if (event.body) {
           event = JSON.parse(event.body);
         }
       
         var sc; // Status code
         var result = ""; // Response payload
       
         switch(event.option) {
           case "date": 
             switch(event.period) {
               case "yesterday":
                 result = setDateResult("yesterday");
                 sc = 200;
                 break;
               case "today":
                 result = setDateResult();
                 sc = 200;
                 break;
               case "tomorrow":
                 result = setDateResult("tomorrow");
                 sc = 200;
                 break;
               default:
                 result = {
                   "error": "Must specify 'yesterday', 'today', or 'tomorrow'."
                 };
                 sc = 400;
                 break;
             }
             break;
             
       /*      Later in this tutorial, you update this function by uncommenting 
               this section. The framework created by AWS SAM detects the update 
               and triggers a deployment by CodeDeploy. The deployment shifts 
               production traffic to the updated version of this function.
               
               case "time":
               var d = new Date();
               var h = d.getHours();
               var mi = d.getMinutes();
               var s = d.getSeconds();
       
               result = {
                 "hour": h,
                 "minute": mi,
                 "second": s
               };
               sc = 200;
               break;
       */
             default:
               result = {
                 "error": "Must specify 'date' or 'time'."
               };
               sc = 400;
             break;
         }
       
         const response = {
           statusCode: sc,
           headers: { "Content-type": "application/json" },
           body: JSON.stringify( result )
         };
       
         callback(null, response);
       
         function setDateResult(option) {
       
           var d = new Date(); // Today
           var mo; // Month
           var da; // Day
           var y; // Year
       
           switch(option) {
             case "yesterday":
               d.setDate(d.getDate() - 1);
               break;
             case "tomorrow":
               d.setDate(d.getDate() + 1);
             default:
              break;
           }
       
           mo = d.getMonth() + 1; // Months are zero offset (0-11)
           da = d.getDate();
           y = d.getFullYear();
       
           result = {
             "month": mo,
             "day": da,
             "year": y
           };
       
           return result;
         }
       };
   ```

Lambda 함수는 어제, 오늘 또는 내일의 일, 월 및 연도를 반환합니다. 이 튜토리얼의 뒷부분에서, 지정하는 일 또는 시간(예: 일, 월, 년 또는 현재 시간, 분, 초)에 대한 정보를 반환하도록 함수를 업데이트하는 코드의 주석 처리를 해제합니다. 에서 생성한 프레임워크는 업데이트된 버전의 함수를 AWS SAM 감지하고 배포합니다.

**참고**  
 이 Lambda 함수는 AWS Cloud9 자습서에서도 사용됩니다.는 클라우드 기반 통합 개발 환경 AWS Cloud9 입니다. 에서이 함수를 생성, 실행, 업데이트 및 디버깅하는 방법에 대한 자세한 내용은 자습서를 AWS Cloud9참조하세요. [AWS LambdaAWS Cloud9](https://docs.aws.amazon.com/cloud9/latest/user-guide/tutorial-lambda.html) 

# BeforeAllowTraffic Lambda 함수에 대한 파일 생성
<a name="tutorial-lambda-sam-create-lambda-before-traffic"></a>

`beforeAllowTraffic` 후크 Lambda 함수에 대한 파일을 생성합니다.

1.  텍스트 파일을 생성하고 `SAM-Tutorial` 디렉터리에 `beforeAllowTraffic.js`로 저장합니다.

1.  다음 Node.js 코드를 `beforeAllowTraffic.js`에 복사합니다. 이 함수는 배포의 `BeforeAllowTraffic` 후크 중에 실행됩니다.

   ```
   'use strict';
       
       const AWS = require('aws-sdk'); 
       const codedeploy = new AWS.CodeDeploy({apiVersion: '2014-10-06'});
       var lambda = new AWS.Lambda();
       
       exports.handler = (event, context, callback) => {
       
       	console.log("Entering PreTraffic Hook!");
       	
       	// Read the DeploymentId and LifecycleEventHookExecutionId from the event payload
         var deploymentId = event.DeploymentId;
       	var lifecycleEventHookExecutionId = event.LifecycleEventHookExecutionId;
       
       	var functionToTest = process.env.NewVersion;
       	console.log("BeforeAllowTraffic hook tests started");
       	console.log("Testing new function version: " + functionToTest);
       
       	// Create parameters to pass to the updated Lambda function that
       	// include the newly added "time" option. If the function did not
       	// update, then the "time" option is invalid and function returns
       	// a statusCode of 400 indicating it failed.
       	var lambdaParams = {
       		FunctionName: functionToTest,    
       		Payload: "{\"option\": \"time\"}", 
       		InvocationType: "RequestResponse"
       	};
       
       	var lambdaResult = "Failed";
       	// Invoke the updated Lambda function.
       	lambda.invoke(lambdaParams, function(err, data) {
       		if (err){	// an error occurred
       			console.log(err, err.stack);
       			lambdaResult = "Failed";
       		}
       		else{	// successful response
       			var result = JSON.parse(data.Payload);
       			console.log("Result: " +  JSON.stringify(result));
             console.log("statusCode: " + result.statusCode);
             
             // Check if the status code returned by the updated
             // function is 400. If it is, then it failed. If 
             // is not, then it succeeded.
       			if (result.statusCode != "400"){
               console.log("Validation succeeded");
       				lambdaResult = "Succeeded";
             }
             else {
               console.log("Validation failed");
             }
       
       			// Complete the PreTraffic Hook by sending CodeDeploy the validation status
       			var params = {
       				deploymentId: deploymentId,
       				lifecycleEventHookExecutionId: lifecycleEventHookExecutionId,
       				status: lambdaResult // status can be 'Succeeded' or 'Failed'
       			};
       			
       			// Pass CodeDeploy the prepared validation test results.
       			codedeploy.putLifecycleEventHookExecutionStatus(params, function(err, data) {
       				if (err) {
       					// Validation failed.
       					console.log("CodeDeploy Status update failed");
       					console.log(err, err.stack);
       					callback("CodeDeploy Status update failed");
       				} else {
       					// Validation succeeded.
       					console.log("CodeDeploy status updated successfully");
       					callback(null, "CodeDeploy status updated successfully");
       				}
       			});
       		}  
       	});
       }
   ```

# AfterAllowTraffic Lambda 함수에 대한 파일 생성
<a name="tutorial-lambda-sam-create-lambda-after-traffic"></a>

`afterAllowTraffic` 후크 Lambda 함수에 대한 파일을 생성합니다.

1.  텍스트 파일을 생성하고 `SAM-Tutorial` 디렉터리에 `afterAllowTraffic.js`로 저장합니다.

1.  다음 Node.js 코드를 `afterAllowTraffic.js`에 복사합니다. 이 함수는 배포의 `AfterAllowTraffic` 후크 중에 실행됩니다.

   ```
   'use strict';
       
       const AWS = require('aws-sdk');
       const codedeploy = new AWS.CodeDeploy({apiVersion: '2014-10-06'});
       var lambda = new AWS.Lambda();
       
       exports.handler = (event, context, callback) => {
       
       	console.log("Entering PostTraffic Hook!");
       	
       	// Read the DeploymentId and LifecycleEventHookExecutionId from the event payload
         var deploymentId = event.DeploymentId;
       	var lifecycleEventHookExecutionId = event.LifecycleEventHookExecutionId;
       
       	var functionToTest = process.env.NewVersion;
       	console.log("AfterAllowTraffic hook tests started");
       	console.log("Testing new function version: " + functionToTest);
       
       	// Create parameters to pass to the updated Lambda function that
       	// include the original "date" parameter. If the function did not 
       	// update as expected, then the "date" option might be invalid. If 
       	// the parameter is invalid, the function returns
       	// a statusCode of 400 indicating it failed.
       	var lambdaParams = {
       		FunctionName: functionToTest,    
       		Payload: "{\"option\": \"date\", \"period\": \"today\"}", 
       		InvocationType: "RequestResponse"
       	};
       
       	var lambdaResult = "Failed";
       	// Invoke the updated Lambda function.
       	lambda.invoke(lambdaParams, function(err, data) {
       		if (err){	// an error occurred
       			console.log(err, err.stack);
       			lambdaResult = "Failed";
       		}
       		else{	// successful response
       			var result = JSON.parse(data.Payload);
       			console.log("Result: " +  JSON.stringify(result));
             console.log("statusCode: " + result.statusCode);
             
             // Check if the status code returned by the updated
             // function is 400. If it is, then it failed. If 
             // is not, then it succeeded.
       			if (result.statusCode != "400"){
               console.log("Validation of time parameter succeeded");
       				lambdaResult = "Succeeded";
             }
             else {
               console.log("Validation failed");
             }
       
       			// Complete the PostTraffic Hook by sending CodeDeploy the validation status
       			var params = {
       				deploymentId: deploymentId,
       				lifecycleEventHookExecutionId: lifecycleEventHookExecutionId,
       				status: lambdaResult // status can be 'Succeeded' or 'Failed'
       			};
       			
       			// Pass CodeDeploy the prepared validation test results.
       			codedeploy.putLifecycleEventHookExecutionStatus(params, function(err, data) {
       				if (err) {
       					// Validation failed.
       					console.log("CodeDeploy Status update failed");
       					console.log(err, err.stack);
       					callback("CodeDeploy Status update failed");
       				} else {
       					// Validation succeeded.
       					console.log("CodeDeploy status updated successfully");
       					callback(null, "CodeDeploy status updated successfully");
       				}
       			});
       		}  
       	});
       }
   ```

# AWS SAM 애플리케이션 패키징
<a name="tutorial-lambda-sam-package"></a>

 이제 `SAM-Tutorial` 디렉터리에는 다음과 같은 네 개의 파일이 있습니다.
+ `beforeAllowTraffic.js`
+ `afterAllowTraffic.js`
+ `myDateTimeFunction.js`
+ `template.yml`

 이제 AWS SAM **sam package** 명령을 사용하여 Lambda 함수 및 CodeDeploy 애플리케이션에 대한 아티팩트를 생성하고 패키징할 준비가 되었습니다. 아티팩트는 S3 버킷에 업로드됩니다. 명령의 출력은 `package.yml`이라는 새 파일입니다. 이 파일은 다음 단계에서 AWS SAM **sam deploy** 명령에 사용됩니다.

**참고**  
 **sam package** 명령에 대한 자세한 내용은*AWS Serverless Application Model 개발자 가이드*의 [AWS SAM CLI 명령 참조](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-command-reference.html)를 참조하세요.

 `SAM-Tutorial` 디렉터리에서 다음을 실행합니다.

```
sam package \
  --template-file template.yml \
  --output-template-file package.yml \
  --s3-bucket amzn-s3-demo-bucket
```

`s3-bucket` 파라미터의 경우 이 자습서에 대한 사전 조건으로 생성한 Amazon S3 버킷을 지정합니다. 는 AWS SAM **sam deploy** 명령에서 사용하는 새 파일의 이름을 `output-template-file` 지정합니다.

# AWS SAM 애플리케이션 배포
<a name="tutorial-lambda-sam-deploy"></a>

 `package.yml` 파일과 함께 AWS SAM **sam deploy** 명령을 사용하여를 사용하여 Lambda 함수와 CodeDeploy 애플리케이션 및 배포 그룹을 생성합니다 CloudFormation.

**참고**  
**sam deploy** 명령에 대한 자세한 내용은 *AWS Serverless Application Model 개발자 가이드*의 [AWS SAM CLI 명령 참조](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-command-reference.html)를 참조하세요.

 `SAM-Tutorial` 디렉터리에서 다음 명령을 실행합니다.

```
sam deploy \
  --template-file package.yml \
  --stack-name my-date-time-app \
  --capabilities CAPABILITY_IAM
```

 `--capabilities CAPABILITY_IAM` 파라미터는 CloudFormation 을(를) 인증하여 IAM 역할을 생성하는 데 필요합니다.

# (선택 사항) 인프라 검사 및 테스트
<a name="tutorial-lambda-sam-confirm-components"></a>

 이 주제에서는 인프라 구성 요소를 보고 Lambda 함수를 테스트하는 방법을 보여 줍니다.

**`sam deploy`를 실행한 후 스택의 결과를 보려면**

1. [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) CloudFormation 콘솔을 엽니다.

1.  탐색 창에서 **스택**을 선택합니다. `my-date-time-app` 스택은 맨 위에 나타납니다.

1.  **Events(이벤트)** 탭을 선택하여 어떤 이벤트가 완료되었는지를 확인합니다. 스택 생성이 진행 중인 동안 이벤트를 볼 수 있습니다. 스택 생성이 완료되면 모든 스택 생성 이벤트를 볼 수 있습니다.

1.  스택이 선택된 상태에서 **Resources(리소스)**를 선택합니다. **유형** 열에서 Lambda 함수인 `myDateTimeFunction`, `CodeDeployHook_beforeAllowTraffic`, `CodeDeployHook_afterAllowTraffic`을(를) 볼 수 있습니다. 각 Lambda 함수의 **물리적 ID** 열에는 Lambda 콘솔에서 함수를 볼 수 있는 링크가 포함되어 있습니다.
**참고**  
 `myDateTimeFunction` Lambda 함수의 이름 앞에 스택 이름이 추가되고 CloudFormation 여기에 식별자가 추가되므로 처럼 보입니다`my-date-time-app-myDateTimeFunction-123456ABCDEF`.

1. [https://console.aws.amazon.com/codedeploy/](https://console.aws.amazon.com/codedeploy/)에서 CodeDeploy 콘솔을 엽니다.

1.  탐색 창에서 **배포**를 확장하고 **애플리케이션**을 선택합니다.

1.  이름이 로 시작하는 CloudFormation 에서 생성된 새 CodeDeploy 애플리케이션이 표시됩니다`my-date-time-app-ServerlessDeploymentApplication`. 이 애플리케이션을 선택합니다.

1.  `my-date-time-app-myDateTimeFunctionDeploymentGroup`으로 시작하는 이름의 배포 그룹이 보여야 합니다. 이 배포 그룹을 선택합니다.

    **Deployment configuration(배포 구성)** 아래에 **CodeDeployDefault.LambdaLinear10PercentEvery1Minute**가 보여야 합니다.

**(선택 사항) 함수를 테스트하려면(콘솔)**

1. [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) AWS Lambda 콘솔을 엽니다.

1.  탐색 창에서 `my-date-time-app-myDateTimeFunction` 함수를 선택합니다. 콘솔에서는 이름에 ID가 포함되므로 `my-date-time-app-myDateTimeFunction-123456ABCDEF`와 비슷하게 보입니다.

1.  **테스트**를 선택합니다.

1.  **Event name(이벤트 이름)**에 테스트 이벤트의 이름을 입력합니다.

1.  테스트 이벤트에 대해 다음을 입력한 다음 **Create(생성)**을 선택합니다.

   ```
   {
     "option": "date",
     "period": "today"
   }
   ```

1.  **테스트**를 선택합니다. 테스트 이벤트 목록에서 테스트 이벤트만 보여야 합니다.

    **Execution result(실행 결과)**의 경우 **succeeded(성공)**가 보여야 합니다.

1.  **Execution result(실행 결과)**에서 **Details(세부 정보)**를 확장하여 결과를 봅니다. 현재 월, 일 및 연도가 보여야 합니다.

**(선택 사항) 함수(AWS CLI)를 테스트하려면**

1.  Lambda 함수의 ARN을 찾습니다. 함수를 볼 때 Lambda 콘솔 맨 위에 나타납니다.

1.  다음 명령을 실행합니다. *your-function-arn*을 함수ARN으로 바꿉니다.

   ```
   aws lambda invoke \
   --function your-function-arn \
   --cli-binary-format raw-in-base64-out \
   --payload "{\"option\": \"date\", \"period\": \"today\"}" out.txt
   ```

1.  `out.txt`를 열고 결과에 현재 월, 일, 연도가 포함되어 있는지 확인합니다.

# 2단계: Lambda 함수 업데이트
<a name="tutorial-lambda-sam-update-function"></a>

 이 주제에서는 `myDateTimeFunction.js` 파일을 업데이트합니다. 다음 단계에서는 이 파일을 사용하여 업데이트된 함수를 배포합니다. 이 함수는 Lambda 함수의 현재 버전에서 업데이트된 버전으로 프로덕션 트래픽을 이동하여 함수를 배포하도록 CodeDeploy를 트리거합니다.

**Lambda 함수를 업데이트하려면**

1.  `myDateTimeFunction.js`을(를) 엽니다.

1.  `switch` 블록에 있는 `time`이라는 `case`의 시작과 끝에서 두 개의 주석 마커("`/*`" 및 "`*/`")와 설명 텍스트를 제거합니다.

    주석 처리가 해제된 코드를 사용하면 새 파라미터인 `time`을 함수에 전달할 수 있습니다. `time`을 업데이트된 함수에 전달하면 이 함수는 현재 `hour`, `minute` 및 `second`를 반환합니다.

1.  `myDateTimeFunction.js`을(를) 저장합니다. 이 템플릿은 다음과 같습니다.

   ```
   'use strict';
   
   exports.handler = function(event, context, callback) {
   
     if (event.body) {
       event = JSON.parse(event.body);
     }
   
     var sc; // Status code
     var result = ""; // Response payload
   
     switch(event.option) {
       case "date":
         switch(event.period) {
           case "yesterday":
             result = setDateResult("yesterday");
             sc = 200;
             break;
           case "today":
             result = setDateResult();
             sc = 200;
             break;
           case "tomorrow":
             result = setDateResult("tomorrow");
             sc = 200;
             break;
           default:
             result = {
               "error": "Must specify 'yesterday', 'today', or 'tomorrow'."
             };
             sc = 400;
             break;
         }
         break;
         case "time":
           var d = new Date();
           var h = d.getHours();
           var mi = d.getMinutes();
           var s = d.getSeconds();
   
           result = {
             "hour": h,
             "minute": mi,
             "second": s
           };
           sc = 200;
           break;
   
         default:
           result = {
             "error": "Must specify 'date' or 'time'."
           };
           sc = 400;
         break;
     }
   
     const response = {
       statusCode: sc,
       headers: { "Content-type": "application/json" },
       body: JSON.stringify( result )
     };
   
     callback(null, response);
   
     function setDateResult(option) {
   
       var d = new Date(); // Today
       var mo; // Month
       var da; // Day
       var y; // Year
   
       switch(option) {
         case "yesterday":
           d.setDate(d.getDate() - 1);
           break;
         case "tomorrow":
           d.setDate(d.getDate() + 1);
         default:
          break;
       }
   
       mo = d.getMonth() + 1; // Months are zero offset (0-11)
       da = d.getDate();
       y = d.getFullYear();
   
       result = {
         "month": mo,
         "day": da,
         "year": y
       };
   
       return result;
     }
   };
   ```

# 3단계: 업데이트된 Lambda 함수 배포
<a name="tutorial-lambda-sam-deploy-update"></a>

 이 단계에서는 업데이트된 `myDateTimeFunction.js`을(를) 사용하여 Lambda 함수의 배포를 업데이트하고 시작합니다. CodeDeploy 또는 AWS Lambda 콘솔에서 배포 진행 상황을 모니터링할 수 있습니다.

 AWS SAM 템플릿의 `AutoPublishAlias: live` 줄을 사용하면 인프라가 `live`별칭을 사용하는 함수에 대한 업데이트를 감지합니다. 함수를 업데이트하면 함수의 원래 버전에서 업데이트된 버전으로 프로덕션 트래픽을 이동하는 CodeDeploy를 통해 배포가 트리거됩니다.

 **sam package** 및 **sam deploy** 명령은 Lambda 함수의 배포를 업데이트하고 트리거하는 데 사용됩니다. [AWS SAM 애플리케이션 패키징](tutorial-lambda-sam-package.md) 및 [AWS SAM 애플리케이션 배포](tutorial-lambda-sam-deploy.md)에서 이러한 명령을 실행했습니다 

**업데이트된 Lambda 함수를 배포하려면**

1.  `SAM-Tutorial` 디렉터리에서 다음 명령을 실행합니다.

   ```
   sam package \
     --template-file template.yml \
     --output-template-file package.yml  \
     --s3-bucket amzn-s3-demo-bucket
   ```

    그러면 S3 버킷에서 업데이트된 Lambda 함수를 참조하는 새로운 아티팩트 세트가 생성됩니다.

1.  `SAM-Tutorial` 디렉터리에서 다음 명령을 실행합니다.

   ```
   sam deploy \
     --template-file package.yml \
     --stack-name my-date-time-app \
     --capabilities CAPABILITY_IAM
   ```

   스택 이름은 여전히 이므로는 스택 업데이트임을 `my-date-time-app` CloudFormation 인식합니다. 업데이트된 스택을 보려면 CloudFormation 콘솔을 반환하고 탐색 창에서 **스택을** 선택합니다.

**(선택 사항) 배포 중에 트래픽을 보려면(CodeDeploy 콘솔)**

1. [https://console.aws.amazon.com/codedeploy/](https://console.aws.amazon.com/codedeploy/)에서 CodeDeploy 콘솔을 엽니다.

1.  탐색 창에서 **Applications(애플리케이션)**를 확장한 다음 **my-date-time-app-ServerlessDeploymentApplication** 애플리케이션을 선택합니다.

1.  **Deployment groups(배포 그룹)**에서 애플리케이션의 배포 그룹을 선택합니다. 상태는 **In progress(진행 중)**여야 합니다.

1.  **Deployment group history(배포 그룹 기록)**에서 진행 중인 배포를 선택합니다.

   **트래픽 이동** 진행률 표시줄과 이 페이지의 **원본** 및 **대체** 상자에 진행 상황이 표시됩니다.  
![\[CodeDeploy 콘솔의 트래픽 전환 진행률 섹션입니다.\]](http://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/images/lambda-tutorial-codedeploy-console-20-percent-deployed.png)

**(선택 사항) 배포 중에 트래픽을 보려면(Lambda 콘솔)**

1. [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) AWS Lambda 콘솔을 엽니다.

1.  탐색 창에서 `my-date-time-app-myDateTimeFunction` 함수를 선택합니다. 콘솔에서는 이름에 ID가 포함되므로 `my-date-time-app-myDateTimeFunction-123456ABCDEF`와 비슷하게 보입니다.

1.  **별칭**을 선택한 다음 **라이브**를 선택합니다.

원래 함수 버전(버전 1)과 업데이트된 함수 버전(버전 2) 옆에 있는 가중치는 이 AWS Lambda 콘솔 페이지가 로드될 때 얼마나 많은 트래픽이 각 버전에 제공되는지를 표시합니다. 이 페이지에서 가중치는 시간 경과에 따라 업데이트되지 않습니다. 1분에 한 번 페이지를 새로 고치면 버전 1의 가중치는 10%씩 감소하고 버전 2의 가중치가 100이 될 때까지 버전 2의 가중치는 10%씩 증가합니다.

![\[CodeDeploy 콘솔의 별칭 섹션입니다.\]](http://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/images/lambda-tutorial-lambda-console-20-percent-deployed.png)


# 4단계: 배포 결과 보기
<a name="tutorial-lambda-sam-deploy-view-results"></a>

이 단계에서는 배포의 결과를 봅니다. 배포가 성공하면 업데이트된 Lambda 함수가 프로덕션 트래픽을 수신하는 것을 확인할 수 있습니다. 배포가 실패하면 CloudWatch Logs를 사용하여 배포의 수명 주기 후크 중에 실행된 Lambda 함수에서 확인 테스트의 출력을 볼 수 있습니다.

**Topics**
+ [배포된 함수 테스트](#tutorial-lambda-sam-deploy-test-deployed-function)
+ [CloudWatch Logs에서 후크 이벤트 보기](#tutorial-lambda-view-hook-events)

## 배포된 함수 테스트
<a name="tutorial-lambda-sam-deploy-test-deployed-function"></a>

 **sam deploy** 명령은 `my-date-time-app-myDateTimeFunction` Lambda 함수를 업데이트합니다. 함수 버전은 2로 업데이트되고 `live` 별칭에 추가됩니다.

**Lambda 콘솔에서 업데이트를 보려면**

1. [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/) AWS Lambda 콘솔을 엽니다.

1.  탐색 창에서 `my-date-time-app-myDateTimeFunction` 함수를 선택합니다. 콘솔에서는 이름에 ID가 포함되므로 `my-date-time-app-myDateTimeFunction-123456ABCDEF`와 비슷하게 보입니다.

1.  **Qualifiers(한정자)**를 선택한 다음 **Aliases(별칭)**를 선택합니다. 배포가 완료된(약 10분) 후, `live` 별칭에서 **Version: 2(버전 2)**가 보여야 합니다.  
![\[CodeDeploy 콘솔의 별칭 섹션입니다.\]](http://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/images/lambda-tutorial-function-version.png)

1.  **Function code(함수 코드)**에서 함수의 소스 코드를 봅니다. 변경 내용이 나타나야 합니다.

1.  (선택 사항) [2단계: Lambda 함수 업데이트](tutorial-lambda-sam-update-function.md)의 테스트 명령을 사용하여 업데이트된 함수를 테스트할 수 있습니다. 다음 페이로드가 있는 새 테스트 이벤트를 생성한 다음, 결과에 현재 시간, 분 및 초가 포함되어 있는지 확인합니다.

   ```
   {
       "option": "time"
     }
   ```

    AWS CLI 를 사용하여 업데이트된 함수를 테스트하려면 다음 명령을 실행한 다음 `out.txt`를 열어 결과에 현재 시간, 분 및 초가 포함되어 있는지 확인합니다.

   ```
   aws lambda invoke --function your-function-arn --payload "{\"option\": \"time\"}" out.txt 
   ```
**참고**  
 배포가 완료되기 전에 AWS CLI 를 사용하여 함수를 테스트하면 예상치 못한 결과가 발생할 수 있습니다. 이 결과는 CodeDeploy가 1분마다 트래픽의 10%를 업데이트된 버전으로 증분식으로 이동하기 때문입니다. 배포 중에 일부 트래픽은 여전히 원래 버전을 가리키므로, `aws lambda invoke`가 원래 버전을 사용할 수 있습니다. 10분 후에 배포가 완료되고 모든 트래픽이 함수의 새 버전을 가리킵니다.

## CloudWatch Logs에서 후크 이벤트 보기
<a name="tutorial-lambda-view-hook-events"></a>

 `BeforeAllowTraffic` 후크 중에 CodeDeploy는 `CodeDeployHook_beforeAllowTraffic` Lambda 함수를 실행합니다. `AfterAllowTraffic` 후크 중에 CodeDeploy는 `CodeDeployHook_afterAllowTraffic` Lambda 함수를 실행합니다. 각 함수는 새 `time` 파라미터를 사용하여 함수의 업데이트된 버전을 호출하는 평가 테스트를 실행합니다. Lambda 함수의 업데이트가 성공하면 `time` 옵션으로 인해 오류가 발생하지 않고 확인이 성공합니다. 함수가 업데이트되지 않은 경우 인식되지 않는 파라미터로 인해 오류가 발생하고 확인이 실패합니다. 이러한 확인 테스트는 데모용일 뿐입니다. 각자 고유의 테스트를 작성하여 배포를 확인합니다. CloudWatch Logs 콘솔을 사용하여 확인 테스트를 볼 수 있습니다.

**CodeDeploy 후크 이벤트를 보려면**

1. [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)에서 CloudWatch 콘솔을 엽니다.

1.  탐색 창에서 **로그**를 선택합니다.

1.  로그 그룹 목록에서 **/aws/lambda/CodeDeployHook\$1beforeAllowTraffic** 또는 **/aws/lambda/CodeDeployHook\$1afterAllowTraffic**을 선택합니다.

1.  로그 스트림을 선택합니다. 하나만 보여야 합니다.

1.  이벤트를 확장하여 세부 정보를 확인합니다.  
![\[CodeDeployHook 로그 그룹의 로그 스트림입니다.\]](http://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/images/lambda-tutorial-cloudwatch.png)

# 5단계: 정리
<a name="tutorial-lambda-clean-up"></a>

이 자습서에서 사용한 리소스에 대한 추가 요금이 부과되지 않도록 AWS SAM 템플릿에서 생성한 리소스와 Lambda 검증 함수에서 생성한 CloudWatch 로그를 삭제합니다.

**CloudFormation 스택을 삭제하려면**

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) CloudFormation 콘솔을 엽니다.

1. **Stacks(스택)** 열에서 `my-date-time-app` 스택을 선택한 다음 **Delete(삭제)**를 선택합니다.

1. 메시지가 나타나면 **스택 삭제**를 선택합니다. 에서 생성한 Lambda 함수, CodeDeploy 애플리케이션 및 배포 그룹, IAM 역할 AWS SAM 이 삭제됩니다.

**CloudWatch Logs에서 로그를 삭제하려면**

1. [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)에서 CloudWatch 콘솔을 엽니다.

1.  탐색 창에서 **로그**를 선택합니다.

1.  로그 그룹 목록에서 **/aws/lambda/CodeDeployHook\$1beforeAllowTraffic** 옆의 버튼을 선택합니다.

1.  **Actions(작업)**에서 **Delete log group(로그 그룹 삭제)**을 선택한 다음 **Yes, Delete(예, 삭제합니다)**를 선택합니다.

1.  로그 그룹 목록에서 **/aws/lambda/CodeDeployHook\$1afterAllowTraffic** 옆의 버튼을 선택합니다.

1.  **Actions(작업)**에서 **Delete log group(로그 그룹 삭제)**을 선택한 다음 **Yes, Delete(예, 삭제합니다)**를 선택합니다.