

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

# 튜토리얼: 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
   ```