

Amazon CodeCatalyst는 더 이상 신규 고객에게 공개되지 않습니다. 기존 고객은 정상적으로 서비스를 계속 이용할 수 있습니다. 자세한 내용은 [CodeCatalyst에서 마이그레이션하는 방법](migration.md) 단원을 참조하십시오.

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

# 자습서: Amazon ECS에 애플리케이션 배포
<a name="deploy-tut-ecs"></a>

이 자습서에서는 워크플로, Amazon ECS 및 기타 몇 가지 AWS 서비스를 사용하여 Amazon Elastic Container Service(Amazon ECS)에 서버리스 애플리케이션을 배포하는 방법을 알아봅니다. 배포된 애플리케이션은 Apache 웹 서버 Docker 이미지를 기반으로 구축된 간단한 Hello World 웹 사이트입니다. 자습서에서는 클러스터 설정과 같은 필수 준비 작업을 안내한 다음 애플리케이션을 빌드하고 배포하기 위한 워크플로를 생성하는 방법을 설명합니다.

**작은 정보**  
이 자습서를 진행하는 대신 전체 Amazon ECS 설정을 수행하는 블루프린트를 사용할 수 있습니다. **Node.js API with AWS Fargate** 또는 **Java API with AWS Fargate** 블루프린트를 사용해야 합니다. 자세한 내용은 [블루프린트를 사용하여 프로젝트 생성](projects-create.md#projects-create-console-template) 섹션을 참조하세요.

**Topics**
+ [사전 조건](#deploy-tut-ecs-prereqs)
+ [1단계: AWS 사용자 설정 및 AWS CloudShell](#deploy-tut-ecs-user-cloudshell)
+ [2단계: Amazon ECS에 자리 표시자 애플리케이션 배포](#deploy-tut-ecs-placeholder)
+ [3단계: Amazon ECR 이미지 리포지토리 생성](#deploy-tut-ecs-ecr)
+ [4단계: AWS 역할 생성](#deploy-tut-ecs-build-deploy-roles)
+ [5단계: CodeCatalyst에 AWS 역할 추가](#deploy-tut-ecs-import-roles)
+ [6단계: 소스 리포지토리 생성](#deploy-tut-ecs-source-repo)
+ [7단계: 소스 파일 추가](#deploy-tut-ecs-source-files)
+ [8단계: 워크플로 생성 및 실행](#deploy-tut-ecs-workflow)
+ [9단계: 소스 파일 변경](#deploy-tut-ecs-change)
+ [정리](#deploy-tut-ecs-cleanup)

## 사전 조건
<a name="deploy-tut-ecs-prereqs"></a>

시작하기 전:
+ 연결된 AWS 계정이 있는 CodeCatalyst **스페이스**가 필요합니다. 자세한 내용은 [스페이스 생성](spaces-create.md) 단원을 참조하십시오.
+ 스페이스에는 다음과 같은 빈 프로젝트가 필요합니다.

  ```
  codecatalyst-ecs-project
  ```

  **처음부터 시작** 옵션을 사용하여 이 프로젝트를 생성합니다.

  자세한 내용은 [Amazon CodeCatalyst에서 빈 프로젝트 생성](projects-create.md#projects-create-empty) 섹션을 참조하세요.
+ 프로젝트에는 다음과 같은 CodeCatalyst **환경**이 필요합니다.

  ```
  codecatalyst-ecs-environment
  ```

  다음과 같이 이 환경을 구성합니다.
  + **비프로덕션**과 같은 유형을 선택합니다.
  +  AWS 계정에 연결합니다.
  + **기본 IAM 역할**의 경우 아무 역할이나 선택합니다. 나중에 다른 역할을 지정합니다.

  자세한 내용은 [AWS 계정 및 VPCs에 배포](deploy-environments.md) 단원을 참조하십시오.

## 1단계: AWS 사용자 설정 및 AWS CloudShell
<a name="deploy-tut-ecs-user-cloudshell"></a>

이 자습서의 첫 번째 단계는에서 사용자를 생성하고이 사용자로 인스턴스를 AWS IAM Identity Center AWS CloudShell 시작하는 것입니다. 이 자습서 기간 동안 CloudShell은 개발 컴퓨터이며 AWS 리소스와 서비스를 구성하는 곳입니다. 자습서를 완료한 후 이 사용자를 삭제합니다.

**참고**  
이 자습서에는 루트 사용자를 사용하지 마세요. 별도의 사용자를 생성해야 합니다. 그렇지 않으면 나중에 AWS Command Line Interface (CLI)에서 작업을 수행할 때 문제가 발생할 수 있습니다.

IAM Identity Center 사용자 및 CloudShell에 대한 자세한 내용은 *AWS IAM Identity Center 사용 설명서* 및 *AWS CloudShell 사용 설명서*를 참조하세요.

**IAM Identity Center 사용자를 생성하려면**

1. 에 로그인 AWS Management Console 하고 [https://console.aws.amazon.com/singlesignon/](https://console.aws.amazon.com/singlesignon/) AWS IAM Identity Center 콘솔을 엽니다.
**참고**  
CodeCatalyst 스페이스에 AWS 계정 연결된를 사용하여 로그인해야 합니다. 스페이스로 이동하여 **AWS 계정** 탭을 선택하고 연결된 계정을 확인할 수 있습니다. 자세한 내용은 [스페이스 생성](spaces-create.md) 섹션을 참조하세요.

1. 탐색 창에서 **Users**와 **Add user**를 차례대로 선택합니다.

1. **사용자 이름**에 다음을 입력합니다.

   ```
   CodeCatalystECSUser
   ```

1. **암호**에서 **이 사용자와 공유할 수 있는 일회용 암호 생성**을 선택합니다.

1. **이메일 주소** 및 **이메일 주소 확인**에 IAM Identity Center에 아직 없는 이메일 주소를 입력합니다.

1. **이름** 및 **성**에 다음을 입력합니다.

   ```
   CodeCatalystECSUser
   ```

1. **표시 이름**에 자동으로 생성된 이름을 유지합니다.

   ```
   CodeCatalystECSUser CodeCatalystECSUser
   ```

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

1. **그룹에 사용자 추가** 페이지에서 **다음**을 선택합니다.

1. **검토 및 사용자 추가** 페이지에서 정보를 검토하고 **사용자 추가**를 선택합니다.

   **일회용 암호** 대화 상자가 나타납니다.

1. **복사**를 선택한 다음 AWS 액세스 포털 URL 및 일회용 암호를 포함하여 로그인 정보를 붙여넣습니다.

1. **닫기**를 선택하세요.

**권한 집합을 생성하려면**

이 권한 세트를 나중에 `CodeCatalystECSUser`에 할당합니다.

1. 탐색 창에서 **권한 세트**를 선택한 다음 **권한 세트 생성**을 선택합니다.

1. **사전 정의된 권한 세트**를 선택하고 **AdministratorAccess**를 선택합니다. 이 정책은 모든 AWS 서비스에 대한 전체 권한을 제공합니다.

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

1. **권한 세트 이름**에 다음을 입력합니다.

   ```
   CodeCatalystECSPermissionSet
   ```

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

1. **검토 및 생성** 페이지에서 정보를 검토하고 **생성**을 선택합니다.

**이 권한 세트를 CodeCatalystECSUser에게 할당하려면**

1. 탐색 창에서 **AWS 계정**를 선택한 다음 현재 로그인 AWS 계정 한 옆의 확인란을 선택합니다.

1. **사용자 또는 그룹 할당**을 선택합니다.

1. **사용자** 탭을 선택합니다.

1. `CodeCatalystECSUser` 옆의 확인란을 선택합니다.

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

1. `CodeCatalystECSPermissionSet` 옆의 확인란을 선택합니다.

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

1. 정보를 검토하고 **제출**을 선택합니다.

   이제 `CodeCatalystECSUser` 및를 `CodeCatalystECSPermissionSet`에 할당하여 함께 AWS 계정바인딩했습니다.

**로그아웃했다가 CodeCatalystECSUser로 다시 로그인하려면**

1. 로그아웃하기 전에에 대한 AWS 액세스 포털 URL과 사용자 이름 및 일회용 암호가 있는지 확인합니다`CodeCatalystECSUser`. 이전에 이 정보를 텍스트 편집기에 복사했어야 합니다.
**참고**  
이 정보가 없는 경우 IAM Identity Center의 `CodeCatalystECSUser` 세부 정보 페이지로 이동하여 **암호 재설정**, **일회용 암호 생성 [...]**을 선택한 후 **암호 재설정**을 다시 선택하면 화면에 해당 정보가 표시됩니다.

1. 로그아웃합니다 AWS.

1.  AWS 액세스 포털 URL을 브라우저의 주소 표시줄에 붙여 넣습니다.

1. `CodeCatalystECSUser`의 사용자 이름과 일회용 암호로 로그인합니다.

1. **새 암호**에서 암호를 입력하고 **새 암호 설정**을 선택합니다.

   화면에 **AWS 계정** 상자가 나타납니다.

1. **AWS 계정**를 선택한 다음 `CodeCatalystECSUser` 사용자 및 권한 세트를 할당 AWS 계정 한의 이름을 선택합니다.

1. `CodeCatalystECSPermissionSet` 옆에 있는 **Management Console**을 선택합니다.

   가 AWS Management Console 나타납니다. 이제 적절한 권한으로 `CodeCatalystECSUser`에 로그인되었습니다.

**AWS CloudShell 인스턴스를 시작하려면**

1. 의 상단 탐색 모음`CodeCatalystECSUser`에서 AWS 아이콘(![\[AWS icon\]](http://docs.aws.amazon.com/ko_kr/codecatalyst/latest/userguide/images/deploy/aws-logo.png))을 선택합니다.

   의 기본 페이지가 AWS Management Console 나타납니다.

1. 상단 탐색 모음에서 AWS CloudShell 아이콘(![\[CloudShell icon\]](http://docs.aws.amazon.com/ko_kr/codecatalyst/latest/userguide/images/deploy/CloudShell.png))을 선택합니다.

   CloudShell이 열립니다. CloudShell 환경이 생성되는 동안 기다립니다.
**참고**  
CloudShell 아이콘이 보이지 않는 경우 [CloudShell에서 지원하는 리전](https://docs.aws.amazon.com/cloudshell/latest/userguide/faq-list.html#regions-available)에 있는지 확인하세요. 이 자습서에서는 사용자가 미국 서부(오리건) 리전에 있다고 가정합니다.

**AWS CLI 가 설치되었는지 확인하려면**

1. CloudShell 터미널에서 다음을 입력합니다.

   ```
   aws --version
   ```

1. 버전이 나타나는지 확인합니다.

    AWS CLI 는 현재 사용자에 대해 이미 구성되어 `CodeCatalystECSUser`있으므로 일반적으로처럼 AWS CLI 키와 자격 증명을 구성할 필요가 없습니다.

## 2단계: Amazon ECS에 자리 표시자 애플리케이션 배포
<a name="deploy-tut-ecs-placeholder"></a>

이 섹션에서는 자리 표시자 애플리케이션을 Amazon ECS에 수동으로 배포합니다. 이 자리 표시자 애플리케이션은 워크플로에 의해 배포된 Hello World 애플리케이션으로 대체됩니다. 자리 표시자 애플리케이션은 Apache Web Server입니다.

Amazon ECS에 대해 자세히 알아보려면 *Amazon Elastic Container Service 개발자 안내서*를 참조하세요.

자리 표시자 애플리케이션을 배포하려면 다음 일련의 절차를 완료합니다.<a name="deploy-tut-ecs-create-task-execution-role"></a>

**태스크 실행 역할을 생성하는 방법**

이 역할은 Amazon ECS에 사용자를 대신하여 API를 호출할 수 있는 AWS Fargate 권한을 부여합니다.

1. 신뢰 정책 생성:

   1. 에 다음 명령을 AWS CloudShell입력합니다.

      ```
      cat > codecatalyst-ecs-trust-policy.json
      ```

      CloudShell 터미널에 깜박이는 프롬프트가 나타납니다.

   1. 프롬프트에서 다음 코드를 입력합니다.

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

****  

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
          {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
              "Service": "ecs-tasks.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
          }
        ]
      }
      ```

------

   1. 커서를 마지막 중괄호(`}`) 뒤에 놓습니다.

   1. **Enter**를 누른 다음 **Ctrl\$1d**를 눌러 파일을 저장하고 cat을 종료합니다.

1. 태스크 실행 역할을 생성합니다.

   ```
   aws iam create-role \
         --role-name codecatalyst-ecs-task-execution-role \
         --assume-role-policy-document file://codecatalyst-ecs-trust-policy.json
   ```

1.  AWS 관리형 `AmazonECSTaskExecutionRolePolicy` 정책을 역할에 연결합니다.

   ```
   aws iam attach-role-policy \
         --role-name codecatalyst-ecs-task-execution-role \
         --policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy
   ```

1. 역할의 세부 정보를 표시합니다.

   ```
   aws iam get-role \
         --role-name codecatalyst-ecs-task-execution-role
   ```

1. 역할의 `"Arn":` 값을 기록해 둡니다. 예시: `arn:aws:iam::111122223333:role/codecatalyst-ecs-task-execution-role`. 나중에 이 Amazon 리소스 이름(ARN)이 필요합니다.

**Amazon ECS 클러스터를 생성하려면**

이 클러스터에는 Apache 자리 표시자 애플리케이션과 이후 Hello World 애플리케이션이 포함됩니다.

1. 에서 빈 클러스터를 `CodeCatalystECSUser` AWS CloudShell생성합니다.

   ```
   aws ecs create-cluster --cluster-name codecatalyst-ecs-cluster
   ```

1. (선택 사항) 클러스터가 성공적으로 생성되었는지 확인합니다.

   ```
   aws ecs list-clusters
   ```

   `codecatalyst-ecs-cluster` 클러스터의 ARN이 목록에 나타나 성공적으로 생성되었음을 나타냅니다.

**태스크 정의 파일을 생성하는 방법**

태스크 정의 파일은 DockerHub에서 가져온 [Apache 2.4 웹 서버](https://hub.docker.com/_/httpd) Docker 이미지(`httpd:2.4`)를 실행함을 나타냅니다.

1. 의 `CodeCatalystECSUser`에서 작업 정의 파일을 AWS CloudShell생성합니다.

   ```
   cat > taskdef.json
   ```

1. 프롬프트에서 다음 코드를 붙여넣습니다.

   ```
   {
       "executionRoleArn": "arn:aws:iam::111122223333:role/codecatalyst-ecs-task-execution-role",
       "containerDefinitions": [
           {
               "name": "codecatalyst-ecs-container",
               "image": "httpd:2.4",
               "essential": true,
               "portMappings": [
                   {
                       "hostPort": 80,
                       "protocol": "tcp",
                       "containerPort": 80
                   }
               ]
           }
       ],
       "requiresCompatibilities": [
           "FARGATE"
       ],
       "cpu": "256",
       "family": "codecatalyst-ecs-task-def",
       "memory": "512",
       "networkMode": "awsvpc"
   }
   ```

   앞의 코드에서 *arn:aws:iam::111122223333:role/codecatalyst-ecs-task-execution-role*을

   [태스크 실행 역할을 생성하는 방법](#deploy-tut-ecs-create-task-execution-role)에서 기록한 태스크 실행 역할의 ARN으로 바꿉니다.

1. 커서를 마지막 중괄호(`}`) 뒤에 놓습니다.

1. **Enter**를 누른 다음 **Ctrl\$1d**를 눌러 파일을 저장하고 cat을 종료합니다.

**Amazon ECS로 태스크 정의 파일을 등록하려면**

1. 의 `CodeCatalystECSUser`에서 작업 정의를 AWS CloudShell등록합니다.

   ```
   aws ecs register-task-definition \
       --cli-input-json file://taskdef.json
   ```

1. (선택 사항) 태스크 정의가 등록되었는지 확인합니다.

   ```
   aws ecs list-task-definitions
   ```

   `codecatalyst-ecs-task-def` 태스크 정의가 목록에 나타나야 합니다.

**Amazon ECS 서비스를 생성하는 방법**

Amazon ECS 서비스는 Apache 자리 표시자 애플리케이션과 이후 Hello World 애플리케이션의 태스크(및 관련 Docker 컨테이너)를 실행합니다.

1. `CodeCatalystECSUser`로서 아직 하지 않았다면 Amazon Elastic Container Service 콘솔로 전환합니다.

1. 앞서 생성한 `codecatalyst-ecs-cluster` 클러스터를 선택합니다.

1. **서비스** 탭에서 **생성**을 선택합니다.

1. **생성** 페이지에서 다음을 수행합니다.

   1. 다음에 나열된 설정을 제외한 모든 기본 설정을 유지합니다.

   1. **시작 유형**에서 **FARGATE**를 선택합니다.

   1. **태스크 정의**의 **패밀리** 드롭다운 목록에서 다음을 선택합니다.

      `codecatalyst-ecs-task-def`

   1. **서비스 이름**에 다음을 입력합니다.

      ```
      codecatalyst-ecs-service
      ```

   1. **원하는 태스크**에 다음을 입력합니다.

      ```
      3
      ```

      이 자습서에서는 각 작업이 단일 Docker 컨테이너를 시작합니다.

   1. **네트워킹** 섹션을 확장합니다.

   1. **VPC**에서 VPC를 선택합니다.

   1. **서브넷**에서 서브넷을 선택합니다.
**참고**  
서브넷을 하나만 지정합니다. 이 자습서에 필요한 것은 이것뿐입니다.
**참고**  
VPC와 서브넷이 없는 경우 생성합니다. *Amazon VPC 사용 설명서*의 [VPC에 서브넷 생성](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-vpcs.html#AddaSubnet)을 참조하여 [VPC를 생성](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-vpcs.html#Create-VPC)합니다.

   1. **보안 그룹**에서 **새 보안 그룹 생성**을 선택하고 다음을 수행합니다.

      1. **보안 그룹 이름**에 다음을 입력합니다.

         ```
         codecatalyst-ecs-security-group
         ```

      1. **보안 그룹 설명**에 다음을 입력합니다.

         ```
         CodeCatalyst ECS security group
         ```

      1. **규칙 추가**를 선택합니다. **유형**에서 **HTTP**를 선택하고 **소스**에서 **Anywhere**를 선택합니다.

   1. 하단에서 **생성**을 선택합니다.

   1. 서비스가 생성되는 동안 기다립니다. 몇 분 정도 소요될 수 있습니다.

1. **태스크** 탭을 선택한 후 새로 고침 버튼을 선택합니다. 세 태스크 모두에서 **마지막 상태** 열이 **실행 중**으로 설정되어 있는지 확인합니다.

**(선택 사항) Apache 자리 표시자 애플리케이션이 실행 중인지 확인하려면**

1. **태스크** 탭에서 세 가지 작업 중 하나를 선택합니다.

1. **퍼블릭 IP** 필드에서 **개방형 주소**를 선택합니다.

   `It Works!` 페이지가 나타납니다. 이는 Amazon ECS 서비스가 Apache 이미지로 Docker 컨테이너를 시작한 태스크를 성공적으로 시작했음을 나타냅니다.

   자습서의 이 시점에서 Amazon ECS 클러스터, 서비스 및 태스크 정의와 Apache 자리 표시자 애플리케이션을 수동으로 배포했습니다. 이러한 모든 항목이 준비되면 이제 Apache 자리 표시자 애플리케이션을 자습서의 Hello World 애플리케이션으로 대체하는 워크플로를 생성할 준비가 된 것입니다.

## 3단계: Amazon ECR 이미지 리포지토리 생성
<a name="deploy-tut-ecs-ecr"></a>

이 섹션에서는 Amazon Elastic Container Registry(Amazon ECR)에서 프라이빗 이미지 리포지토리를 생성합니다. 이 리포지토리에는 이전에 배포한 Apache 자리 표시자 이미지를 대체하는 자습서의 Docker 이미지가 저장됩니다.

Amazon ECR에 대한 자세한 내용은 *Amazon Elastic Container Registry 사용 설명서*를 참조합니다.

**Amazon ECR에서 이미지 리포지토리를 생성하려면**

1. 에서 Amazon ECR에 빈 리포지토리를 `CodeCatalystECSUser` AWS CloudShell생성합니다.

   ```
   aws ecr create-repository --repository-name codecatalyst-ecs-image-repo
   ```

1. Amazon ECR 리포지토리의 세부 정보를 표시합니다.

   ```
   aws ecr describe-repositories \
         --repository-names codecatalyst-ecs-image-repo
   ```

1. `“repositoryUri”:` 값을 기록해 둡니다. 예시: `111122223333.dkr.ecr.us-west-2.amazonaws.com/codecatalyst-ecs-image-repo`.

   나중에 워크플로에 리포지토리를 추가할 때 필요합니다.

## 4단계: AWS 역할 생성
<a name="deploy-tut-ecs-build-deploy-roles"></a>

이 섹션에서는 CodeCatalyst 워크플로가 작동하는 데 필요한 AWS IAM 역할을 생성합니다. 이러한 역할은 다음과 같습니다.
+ **빌드 역할** - CodeCatalyst 빌드 작업(워크플로 내)에 AWS 계정에 액세스하고 Amazon ECR 및 Amazon EC2에 쓸 수 있는 권한을 부여합니다.
+ **역할 배포** - CodeCatalyst **ECS에 배포** 작업(워크플로 내)에 AWS 계정, Amazon ECS 및 기타 몇 가지 AWS 서비스에 액세스할 수 있는 권한을 부여합니다.

IAM 역할에 대한 자세한 내용은 *AWS Identity and Access Management 사용 설명서*의 [IAM 역할](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html) 섹션을 참조하세요.

**참고**  
시간을 절약하기 위해 이전에 나열한 두 역할 대신 `CodeCatalystWorkflowDevelopmentRole-spaceName` 역할이라는 단일 역할을 생성할 수 있습니다. 자세한 내용은 [계정 및 스페이스의 **CodeCatalystWorkflowDevelopmentRole-*spaceName*** 역할 생성](ipa-iam-roles.md#ipa-iam-roles-service-create) 섹션을 참조하세요. `CodeCatalystWorkflowDevelopmentRole-spaceName` 역할에는 보안 위험을 초래할 수 있는 매우 광범위한 권한이 있음을 이해합니다. 보안에 대한 우려가 적은 자습서 및 시나리오에서만 이 역할을 사용하는 것이 좋습니다. 이 자습서에서는 이전에 나열된 두 역할을 생성하고 있다고 가정합니다.

빌드 및 배포 역할을 생성하려면 AWS Management Console 또는를 사용할 수 있습니다 AWS CLI.

------
#### [ AWS Management Console ]

빌드 및 배포 역할을 생성하려면 다음 절차 시리즈를 완료합니다.

**빌드 역할을 생성하려면**

1. 역할에 대한 정책을 다음과 같이 생성합니다.

   1. 에 로그인합니다 AWS.

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

   1. 탐색 창에서 **Policies**를 선택합니다.

   1. **정책 생성**을 선택합니다.

   1. **JSON** 탭을 선택합니다.

   1. 기존 코드를 삭제합니다.

   1. 다음 코드를 붙여넣습니다.

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

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "ecr:*",
                      "ec2:*"
                  ],
                  "Resource": "*"
              }
          ]
      }
      ```

------
**참고**  
역할을 처음 사용하여 워크플로 작업을 실행할 때 리소스 정책 문에서 와일드카드를 사용한 다음, 사용 가능한 리소스 이름으로 정책 범위를 좁힙니다.  

      ```
      "Resource": "*"
      ```

   1. **다음: 태그**를 선택합니다.

   1. **다음: 검토**를 선택합니다.

   1. **이름**에 다음과 같이 입력합니다.

      ```
      codecatalyst-ecs-build-policy
      ```

   1. **정책 생성**을 선택합니다.

      이제 권한 정책을 생성했습니다.

1. 다음과 같이 빌드 역할을 생성합니다.

   1. 탐색 창에서 **역할**을 선택한 후 **역할 생성**을 선택합니다.

   1. **사용자 지정 신뢰 정책**을 선택합니다.

   1. 기존 사용자 지정 신뢰 정책을 삭제합니다.

   1. 다음 사용자 지정 신뢰 정책을 추가합니다.

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

   1. **권한 정책**에서 `codecatalyst-ecs-build-policy`를 검색하고 해당 확인란을 선택합니다.

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

   1. **역할 이름**에 다음과 같이 입력합니다.

      ```
      codecatalyst-ecs-build-role
      ```

   1. **역할 설명**에 다음과 같이 입력합니다.

      ```
      CodeCatalyst ECS build role
      ```

   1. **역할 생성**을 선택합니다.

   이제 신뢰 정책 및 권한 정책으로 빌드 역할을 생성했습니다.

1. 다음과 같이 빌드 역할 ARN을 가져옵니다.

   1. 탐색 창에서 **역할**을 선택합니다.

   1. 검색 상자에 방금 생성한 역할의 이름을 입력합니다(`codecatalyst-ecs-build-role`).

   1. 목록에서 역할을 선택합니다.

      역할의 **요약** 페이지가 나타납니다.

   1. 상단에서 **ARN** 값을 복사합니다. 나중에 필요합니다.

**배포 역할을 생성하려면**

1. 역할에 대한 정책을 다음과 같이 생성합니다.

   1. 에 로그인합니다 AWS.

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

   1. 탐색 창에서 **Policies**를 선택합니다.

   1. **정책 생성**을 선택하세요.

   1. **JSON** 탭을 선택합니다.

   1. 기존 코드를 삭제합니다.

   1. 다음 코드를 붙여넣습니다.

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

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [{
          "Action":[
            "ecs:DescribeServices",
            "ecs:CreateTaskSet",
            "ecs:DeleteTaskSet",
            "ecs:ListClusters",
            "ecs:RegisterTaskDefinition",
            "ecs:UpdateServicePrimaryTaskSet",
            "ecs:UpdateService",
            "elasticloadbalancing:DescribeTargetGroups",
            "elasticloadbalancing:DescribeListeners",
            "elasticloadbalancing:ModifyListener",
            "elasticloadbalancing:DescribeRules",
            "elasticloadbalancing:ModifyRule",
            "lambda:InvokeFunction",
            "lambda:ListFunctions",
            "cloudwatch:DescribeAlarms",
            "sns:Publish",
            "sns:ListTopics", 
            "s3:GetObject",
            "s3:GetObjectVersion",
            "codedeploy:CreateApplication", 
            "codedeploy:CreateDeployment", 
            "codedeploy:CreateDeploymentGroup", 
            "codedeploy:GetApplication", 
            "codedeploy:GetDeployment", 
            "codedeploy:GetDeploymentGroup", 
            "codedeploy:ListApplications", 
            "codedeploy:ListDeploymentGroups", 
            "codedeploy:ListDeployments", 
            "codedeploy:StopDeployment", 
            "codedeploy:GetDeploymentTarget", 
            "codedeploy:ListDeploymentTargets", 
            "codedeploy:GetDeploymentConfig", 
            "codedeploy:GetApplicationRevision", 
            "codedeploy:RegisterApplicationRevision", 
            "codedeploy:BatchGetApplicationRevisions", 
            "codedeploy:BatchGetDeploymentGroups", 
            "codedeploy:BatchGetDeployments", 
            "codedeploy:BatchGetApplications", 
            "codedeploy:ListApplicationRevisions", 
            "codedeploy:ListDeploymentConfigs", 
            "codedeploy:ContinueDeployment"           
         ],
         "Resource":"*",
         "Effect":"Allow"
      },{"Action":[
            "iam:PassRole"
         ],
         "Effect":"Allow",
         "Resource":"*",
         "Condition":{"StringLike":{"iam:PassedToService":[
                  "ecs-tasks.amazonaws.com",
                  "codedeploy.amazonaws.com"
               ]
            }
         }
      }]
      }
      ```

------
**참고**  
역할을 처음 사용하여 워크플로 작업을 실행할 때 리소스 정책 문의 와일드카드를 사용합니다. 그런 다음 사용 가능한 리소스 이름을 사용하여 정책의 범위를 좁힐 수 있습니다.  

      ```
      "Resource": "*"
      ```

   1. **다음: 태그**를 선택합니다.

   1. **다음: 검토**를 선택합니다.

   1. **이름**에 다음과 같이 입력합니다.

      ```
      codecatalyst-ecs-deploy-policy
      ```

   1. **정책 생성**을 선택합니다.

      이제 권한 정책을 생성했습니다.

1. 다음과 같이 배포 역할을 생성합니다.

   1. 탐색 창에서 **역할**을 선택한 후 **역할 생성**을 선택합니다.

   1. **사용자 지정 신뢰 정책**을 선택합니다.

   1. 기존 사용자 지정 신뢰 정책을 삭제합니다.

   1. 다음 사용자 지정 신뢰 정책을 추가합니다.

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

   1. **권한 정책**에서 `codecatalyst-ecs-deploy-policy`를 검색하고 해당 확인란을 선택합니다.

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

   1. **역할 이름**에 다음과 같이 입력합니다.

      ```
      codecatalyst-ecs-deploy-role
      ```

   1. **역할 설명**에 다음과 같이 입력합니다.

      ```
      CodeCatalyst ECS deploy role
      ```

   1. **역할 생성**을 선택합니다.

   이제 신뢰 정책으로 배포 역할을 생성했습니다.

1. 다음과 같이 배포 역할 ARN을 가져옵니다.

   1. 탐색 창에서 **역할**을 선택합니다.

   1. 검색 상자에 방금 생성한 역할의 이름을 입력합니다(`codecatalyst-ecs-deploy-role`).

   1. 목록에서 역할을 선택합니다.

      역할의 **요약** 페이지가 나타납니다.

   1. 상단에서 **ARN** 값을 복사합니다. 나중에 필요합니다.

------
#### [ AWS CLI ]

빌드 및 배포 역할을 생성하려면 다음 절차 시리즈를 완료합니다.

**두 역할에 대한 신뢰 정책을 생성하려면**

의 `CodeCatalystECSUser`에서 신뢰 정책 파일을 AWS CloudShell생성합니다.

1. 다음 파일을 생성합니다.

   ```
   cat > codecatalyst-ecs-trust-policy.json
   ```

1. 터미널 프롬프트에서 다음 코드를 붙여넣습니다.

1. 커서를 마지막 중괄호(`}`) 뒤에 놓습니다.

1. **Enter**를 누른 다음 **Ctrl\$1d**를 눌러 파일을 저장하고 cat을 종료합니다.

**빌드 정책 및 빌드 역할을 생성하려면**

1. 다음 빌드 정책을 생성합니다.

   1. `CodeCatalystECSUser`에서 로 빌드 정책 파일을 AWS CloudShell생성합니다.

      ```
      cat > codecatalyst-ecs-build-policy.json
      ```

   1. 프롬프트에서 다음 코드를 입력합니다.

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

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "ecr:*",
                      "ec2:*"
                  ],
                  "Resource": "*"
              }
          ]
      }
      ```

------

   1. 커서를 마지막 중괄호(`}`) 뒤에 놓습니다.

   1. **Enter**를 누른 다음 **Ctrl\$1d**를 눌러 파일을 저장하고 cat을 종료합니다.

1. 빌드 정책을 AWS다음에 추가합니다.

   ```
   aws iam create-policy \
       --policy-name codecatalyst-ecs-build-policy \
       --policy-document file://codecatalyst-ecs-build-policy.json
   ```

1. 명령 출력에서 와 같은 `"arn":` 값을 기록해 둡니다(예: `arn:aws:iam::111122223333:policy/codecatalyst-ecs-build-policy`). 나중에 이 ARN이 필요합니다.

1. 빌드 역할을 생성하여 신뢰 정책에 연결합니다.

   ```
   aws iam create-role \
         --role-name codecatalyst-ecs-build-role \
         --assume-role-policy-document file://codecatalyst-ecs-trust-policy.json
   ```

1. 빌드 정책을 빌드 역할에 연결합니다.

   ```
   aws iam attach-role-policy \
         --role-name codecatalyst-ecs-build-role \
         --policy-arn arn:aws:iam::111122223333:policy/codecatalyst-ecs-build-policy
   ```

   *arn:aws:iam::111122223333:policy/codecatalyst-ecs-build-policy*가 앞서 언급한 빌드 정책의 ARN으로 대체되는 경우.

1. 빌드 역할의 세부 정보를 표시합니다.

   ```
   aws iam get-role \
         --role-name codecatalyst-ecs-build-role
   ```

1. 역할의 `"Arn":` 값을 기록해 둡니다. 예시: `arn:aws:iam::111122223333:role/codecatalyst-ecs-build-role`. 나중에 이 ARN이 필요합니다.

**배포 정책을 생성하고 역할을 배포하려면**

1. 배포 정책 생성:

   1. 에서 배포 정책 파일을 AWS CloudShell생성합니다.

      ```
      cat > codecatalyst-ecs-deploy-policy.json
      ```

   1. 프롬프트에서 다음 코드를 입력합니다.

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

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [{
          "Action":[
            "ecs:DescribeServices",
            "ecs:CreateTaskSet",
            "ecs:DeleteTaskSet",
            "ecs:ListClusters",
            "ecs:RegisterTaskDefinition",
            "ecs:UpdateServicePrimaryTaskSet",
            "ecs:UpdateService",
            "elasticloadbalancing:DescribeTargetGroups",
            "elasticloadbalancing:DescribeListeners",
            "elasticloadbalancing:ModifyListener",
            "elasticloadbalancing:DescribeRules",
            "elasticloadbalancing:ModifyRule",
            "lambda:InvokeFunction",
            "lambda:ListFunctions",
            "cloudwatch:DescribeAlarms",
            "sns:Publish",
            "sns:ListTopics", 
            "s3:GetObject",
            "s3:GetObjectVersion",
            "codedeploy:CreateApplication", 
            "codedeploy:CreateDeployment", 
            "codedeploy:CreateDeploymentGroup", 
            "codedeploy:GetApplication", 
            "codedeploy:GetDeployment", 
            "codedeploy:GetDeploymentGroup", 
            "codedeploy:ListApplications", 
            "codedeploy:ListDeploymentGroups", 
            "codedeploy:ListDeployments", 
            "codedeploy:StopDeployment", 
            "codedeploy:GetDeploymentTarget", 
            "codedeploy:ListDeploymentTargets", 
            "codedeploy:GetDeploymentConfig", 
            "codedeploy:GetApplicationRevision", 
            "codedeploy:RegisterApplicationRevision", 
            "codedeploy:BatchGetApplicationRevisions", 
            "codedeploy:BatchGetDeploymentGroups", 
            "codedeploy:BatchGetDeployments", 
            "codedeploy:BatchGetApplications", 
            "codedeploy:ListApplicationRevisions", 
            "codedeploy:ListDeploymentConfigs", 
            "codedeploy:ContinueDeployment"           
         ],
         "Resource":"*",
         "Effect":"Allow"
      },{"Action":[
            "iam:PassRole"
         ],
         "Effect":"Allow",
         "Resource":"*",
         "Condition":{"StringLike":{"iam:PassedToService":[
                  "ecs-tasks.amazonaws.com",
                  "codedeploy.amazonaws.com"
               ]
            }
         }
      }]
      }
      ```

------
**참고**  
역할을 처음 사용하여 워크플로 작업을 실행할 때 리소스 정책 문에서 와일드카드를 사용한 다음, 사용 가능한 리소스 이름으로 정책 범위를 좁힙니다.  

      ```
      "Resource": "*"
      ```

   1. 커서를 마지막 중괄호(`}`) 뒤에 놓습니다.

   1. **Enter**를 누른 다음 **Ctrl\$1d**를 눌러 파일을 저장하고 cat을 종료합니다.

1. 배포 정책을 AWS다음에 추가합니다.

   ```
   aws iam create-policy \
       --policy-name codecatalyst-ecs-deploy-policy \
       --policy-document file://codecatalyst-ecs-deploy-policy.json
   ```

1. 명령 출력에서 와 같은 `"arn":` 값을 기록해 둡니다(예: `arn:aws:iam::111122223333:policy/codecatalyst-ecs-deploy-policy`). 나중에 이 ARN이 필요합니다.

1. 빌드 역할을 생성하여 신뢰 정책에 연결합니다.

   ```
   aws iam create-role \
         --role-name codecatalyst-ecs-deploy-role \
         --assume-role-policy-document file://codecatalyst-ecs-trust-policy.json
   ```

1. 배포 정책을 배포 역할에 연결합니다. 여기서 *arn:aws:iam::111122223333:policy/codecatalyst-ecs-deploy-policy*는 앞서 언급한 배포 정책의 ARN으로 대체됩니다.

   ```
   aws iam attach-role-policy \
         --role-name codecatalyst-ecs-deploy-role \
         --policy-arn arn:aws:iam::111122223333:policy/codecatalyst-ecs-deploy-policy
   ```

1. 배포 역할의 세부 정보를 표시합니다.

   ```
   aws iam get-role \
         --role-name codecatalyst-ecs-deploy-role
   ```

1. 역할의 `"Arn":` 값을 기록해 둡니다. 예시: `arn:aws:iam::111122223333:role/codecatalyst-ecs-deploy-role`. 나중에 이 ARN이 필요합니다.

------

## 5단계: CodeCatalyst에 AWS 역할 추가
<a name="deploy-tut-ecs-import-roles"></a>

이 단계에서는 빌드 역할(`codecatalyst-ecs-build-role`)을 추가하고 스페이스의 CodeCatalyst 계정 연결에 역할(`codecatalyst-ecs-deploy-role`)을 배포합니다.

**계정 연결에 빌드 및 배포 역할을 추가하려면**

1. CodeCatalyst에서 스페이스로 이동합니다.

1. **AWS 계정**을 선택합니다. 계정 연결 목록이 나타납니다.

1. 빌드 및 배포 역할을 생성한 계정을 나타내는 AWS 계정 연결을 선택합니다.

1. **관리 콘솔에서 역할 AWS 관리를** 선택합니다.

   **Amazon CodeCatalyst 스페이스에 IAM 역할 추가** 페이지가 나타납니다. 페이지에 액세스하려면 로그인해야 할 수 있습니다.

1. **IAM에서 생성한 기존 역할 추가**를 선택합니다.

   드롭다운 목록이 나타납니다. 목록에는 `codecatalyst-runner.amazonaws.com` 및 `codecatalyst.amazonaws.com` 서비스 위탁자가 포함된 신뢰 정책이 있는 모든 IAM 역할이 표시됩니다.

1. 드롭다운 목록에서 `codecatalyst-ecs-build-role`을 선택하고 **역할 추가**를 선택합니다.
**참고**  
`The security token included in the request is invalid`가 표시되면 적절한 권한이 없기 때문일 수 있습니다. 이 문제를 해결하려면 CodeCatalyst 스페이스를 생성할 때 사용한 AWS 계정으로 다시 로그인 AWS 하면에서 로그아웃합니다.

1. **IAM 역할 추가**를 선택하고 **IAM에서 생성한 기존 역할 추가**를 선택한 다음 드롭다운 목록에서 `codecatalyst-ecs-deploy-role`을 선택합니다. [**Add role**]을 선택합니다.

   이제 스페이스에 빌드 및 배포 역할을 추가했습니다.

1. **Amazon CodeCatalyst 표시 이름**의 값을 복사합니다. 워크플로를 생성할 때 나중에 이 값이 필요합니다.

## 6단계: 소스 리포지토리 생성
<a name="deploy-tut-ecs-source-repo"></a>

이 단계에서는 CodeCatalyst에 소스 리포지토리를 생성합니다. 이 리포지토리는 작업 정의 파일과 같은 자습서의 소스 파일을 저장합니다.

소스 리포지토리에 대한 자세한 정보는 [소스 리포지토리 생성](source-repositories-create.md) 섹션을 참조하세요.

**소스 리포지토리를 생성하려면**

1. [https://codecatalyst.aws/](https://codecatalyst.aws/)에서 CodeCatalyst 콘솔을 엽니다.

1. `codecatalyst-ecs-project` 프로젝트로 이동합니다.

1. 탐색 창에서 **코드**를 선택한 다음 **소스 리포지토리**를 선택합니다.

1. **리포지토리 추가**를 선택하고 **리포지토리 생성**을 선택합니다.

1. **리포지토리 이름**에 다음과 같이 입력합니다.

   ```
   codecatalyst-ecs-source-repository
   ```

1. **생성(Create)**을 선택합니다.

## 7단계: 소스 파일 추가
<a name="deploy-tut-ecs-source-files"></a>

이 섹션에서는 Hello World 소스 파일을 CodeCatalyst 리포지토리 `codecatalyst-ecs-source-repository`에 추가합니다. 다음과 같이 구성됩니다.
+ `index.html` 파일 - 브라우저에 Hello World 메시지를 표시합니다.
+ Dockerfile - Docker 이미지에 사용할 기본 이미지와 Docker 명령으로 적용할 기본 이미지를 설명합니다.
+ `taskdef.json` 파일 - 클러스터에서 작업을 시작할 때 사용할 Docker 이미지를 정의합니다.

폴더의 구조는 다음과 같습니다.

```
.
|— public-html
|  |— index.html
|— Dockerfile
|— taskdef.json
```

**참고**  
다음 지침은 CodeCatalyst 콘솔을 사용하여 파일을 추가하는 방법을 보여주지만 원하는 경우 Git을 사용할 수 있습니다. 자세한 내용은 [소스 리포지토리 복제](source-repositories-clone.md)을 참조하세요.

**Topics**
+ [index.html](#deploy-tut-ecs-source-files-index)
+ [Dockerfile](#deploy-tut-ecs-source-files-dockerfile)
+ [taskdef.json](#deploy-tut-ecs-source-files-taskdef)

### index.html
<a name="deploy-tut-ecs-source-files-index"></a>

`index.html` 파일에 브라우저에 Hello World 메시지가 표시됩니다.

**index.html 파일을 추가하려면**

1. CodeCatalyst 콘솔에서 `codecatalyst-ecs-source-repository` 소스 리포지토리로 이동합니다.

1. **파일**에서 **파일 생성**을 선택합니다.

1. **파일 이름**에 다음과 같이 입력합니다.

   ```
   public-html/index.html
   ```
**중요**  
동일한 이름의 폴더를 만들려면 `public-html/` 접두사를 포함해야 합니다. `index.html`이 폴더에 있을 것으로 예상됩니다.

1. 다음 코드를 텍스트 상자에 입력합니다.

   ```
   <html>
     <head>
       <title>Hello World</title>
       <style>
         body {
         background-color: black;
         text-align: center;
         color: white;
         font-family: Arial, Helvetica, sans-serif;
         }  
       </style>
     </head>
     <body>
       <h1>Hello World</h1>
     </body>
   </html>
   ```

1. **커밋**을 선택한 다음 **커밋**을 다시 선택합니다.

   `index.html`은 `public-html` 폴더의 리포지토리에 추가됩니다.

### Dockerfile
<a name="deploy-tut-ecs-source-files-dockerfile"></a>

Dockerfile은 사용할 기본 Docker 이미지와 적용할 Docker 명령을 설명합니다. Dockerfile에 대한 자세한 내용은 [Dockerfile 참조](https://docs.docker.com/engine/reference/builder/)를 참조하세요.

여기에 지정된 Dockerfile은 Apache 2.4 기본 이미지(`httpd`)를 사용함을 나타냅니다. 또한 `index.html` 소스 파일을 웹 페이지를 제공하는 Apache 서버의 폴더에 복사하는 방법도 포함되어 있습니다. Dockerfile의 `EXPOSE` 지침은 컨테이너가 포트 80에서 수신 중임을 Docker에게 알립니다.

**Dockerfile을 추가하려면**

1. 소스 리포지토리에서 **파일 생성**을 선택합니다.

1. **파일 이름**에 다음과 같이 입력합니다.

   ```
   Dockerfile
   ```

   파일 확장자는 제외합니다.
**중요**  
Dockerfile은 리포지토리의 루트 폴더에 있어야 합니다. 워크플로의 `Docker build` 명령은 해당 파일이 있을 것으로 예상합니다.

1. 다음 코드를 텍스트 상자에 입력합니다.

   ```
   FROM httpd:2.4
   COPY ./public-html/index.html /usr/local/apache2/htdocs/index.html
   EXPOSE 80
   ```

1. **커밋**을 선택한 다음 **커밋**을 다시 선택합니다.

   Dockerfile이 리포지토리에 추가됩니다.

### taskdef.json
<a name="deploy-tut-ecs-source-files-taskdef"></a>

이 단계에서 추가하는 `taskdef.json` 파일은 [2단계: Amazon ECS에 자리 표시자 애플리케이션 배포](#deploy-tut-ecs-placeholder)에서 이미 지정한 파일과 동일하며 다음과 같은 차이점이 있습니다.

`image:` 필드(`httpd:2.4`)에 하드코딩된 Docker 이미지 이름을 지정하는 대신, 여기서 태스크 정의는 몇 가지 변수를 사용하여 이미지(`$REPOSITORY_URI` 및 `$IMAGE_TAG`)를 나타냅니다. 이러한 변수는 이후 단계에서 워크플로를 실행할 때 워크플로의 빌드 작업에서 생성된 실제 값으로 대체됩니다.

태스크 정의 파라미터에 대한 자세한 정보는 *Amazon Elastic Container Service 개발자 안내서*의 [태스크 정의 파라미터](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html)를 참조하세요.

**taskdef.json 파일을 추가하려면**

1. 소스 리포지토리에서 **파일 생성**을 선택합니다.

1. **파일 이름**에 다음과 같이 입력합니다.

   ```
   taskdef.json
   ```

1. 다음 코드를 텍스트 상자에 입력합니다.

   ```
   {
       "executionRoleArn": "arn:aws:iam::account_ID:role/codecatalyst-ecs-task-execution-role",
       "containerDefinitions": [
           {
               "name": "codecatalyst-ecs-container",
               # The $REPOSITORY_URI and $IMAGE_TAG variables will be replaced 
               # by the workflow at build time (see the build action in the 
               # workflow)
               "image": $REPOSITORY_URI:$IMAGE_TAG,
               "essential": true,
               "portMappings": [
                   {
                       "hostPort": 80,
                       "protocol": "tcp",
                       "containerPort": 80
                   }
               ]
           }
       ],
       "requiresCompatibilities": [
           "FARGATE"
       ],
       "networkMode": "awsvpc",
       "cpu": "256",
       "memory": "512",
       "family": "codecatalyst-ecs-task-def"
   }
   ```

   앞의 코드에서

   *arn:aws:iam::account\$1ID:role/codecatalyst-ecs-task-execution-role*

   [태스크 실행 역할을 생성하는 방법](#deploy-tut-ecs-create-task-execution-role)에서 기록한 태스크 실행 역할의 ARN으로 바꿉니다.

1. **커밋**을 선택한 다음 **커밋**을 다시 선택합니다.

   `taskdef.json` 파일이 리포지토리에 추가됩니다.

## 8단계: 워크플로 생성 및 실행
<a name="deploy-tut-ecs-workflow"></a>

이 단계에서는 소스 파일을 가져와 Docker 이미지로 빌드한 다음 Amazon ECS 클러스터에 이미지를 배포하는 워크플로를 생성합니다. 이 배포는 기존 Apache 자리 표시자 애플리케이션을 대체합니다.

워크플로는 순차적으로 실행되는 다음 구성 요소로 구성됩니다.
+ 트리거 - 이 트리거는 소스 리포지토리에 변경 사항을 푸시할 때 워크플로 실행을 자동으로 시작합니다. 트리거에 대한 자세한 내용은 [트리거를 사용하여 워크플로 실행 자동 시작](workflows-add-trigger.md) 주제를 참조하세요.
+ 빌드 작업(`BuildBackend`) - 트리거 시 작업은 Dockerfile을 사용하여 Docker 이미지를 빌드하고 Amazon ECR에 이미지를 푸시합니다. 빌드 작업은 또한 `taskdef.json`를 올바른 `image` 필드 값으로 업데이트한 다음 이 파일의 출력 아티팩트를 생성합니다. 이 아티팩트는 다음 배포 작업의 입력으로 사용됩니다.

  빌드 작업에 대한 자세한 내용은 [워크플로로 빌드하기](build-workflow-actions.md) 섹션을 참조하세요.
+ 배포 작업(`DeployToECS`) - 빌드 작업이 완료되면 배포 작업은 빌드 작업(`TaskDefArtifact`)에서 생성된 출력 아티팩트를 찾고, 그 안에서 `taskdef.json`을 찾아 Amazon ECS 서비스에 등록합니다. 그런 다음 Amazon ECS 서비스는 `taskdef.json` 파일의 지침에 따라 Amazon ECS 클러스터 내에서 Amazon ECS 작업 및 연결된 Docker 컨테이너를 실행합니다.

**워크플로 생성**

1. CodeCatalyst 콘솔의 탐색 창에서 **CI/CD**를 선택한 다음 **워크플로**를 선택합니다.

1. **워크플로 생성**을 선택합니다.

1. **소스 리포지토리**에서 `codecatalyst-ecs-source-repository`을 선택합니다.

1. **브랜치**에서 `main`을 선택합니다.

1. **생성(Create)**을 선택합니다.

1. YAML 샘플 코드를 삭제합니다.

1. 다음 YAML 코드를 추가합니다.
**참고**  
다음 YAML 코드에서 원하는 경우 `Connections:` 섹션을 생략할 수 있습니다. 이 섹션을 생략하는 경우 환경의 **기본 IAM 역할** 필드에 지정된 역할에 [5단계: CodeCatalyst에 AWS 역할 추가](#deploy-tut-ecs-import-roles)에 설명된 두 역할의 권한 및 신뢰 정책이 포함되어 있는지 확인해야 합니다. 기본 IAM 역할이 있는 환경 설정에 대한 자세한 내용은 [환경 생성](deploy-environments-creating-environment.md) 섹션을 참조하세요.

   ```
   Name: codecatalyst-ecs-workflow
   SchemaVersion: 1.0
   
   Triggers:
     - Type: PUSH
       Branches:
         - main
   Actions:
     BuildBackend:
       Identifier: aws/build@v1
       Environment:
         Name: codecatalyst-ecs-environment
         Connections:
           - Name: codecatalyst-account-connection
             Role: codecatalyst-ecs-build-role
       Inputs:
         Sources:
           - WorkflowSource
         Variables:
           - Name: REPOSITORY_URI
             Value: 111122223333.dkr.ecr.us-west-2.amazonaws.com/codecatalyst-ecs-image-repo
           - Name: IMAGE_TAG
             Value: ${WorkflowSource.CommitId}
       Configuration:
         Steps:
           #pre_build:
           - Run: echo Logging in to Amazon ECR...
           - Run: aws --version
           - Run: aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-west-2.amazonaws.com
           #build:
           - Run: echo Build started on `date`
           - Run: echo Building the Docker image...
           - Run: docker build -t $REPOSITORY_URI:latest .
           - Run: docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG
           #post_build:
           - Run: echo Build completed on `date`
           - Run: echo Pushing the Docker images...
           - Run: docker push $REPOSITORY_URI:latest
           - Run: docker push $REPOSITORY_URI:$IMAGE_TAG
           # Replace the variables in taskdef.json
           - Run: find taskdef.json -type f | xargs sed -i "s|\$REPOSITORY_URI|$REPOSITORY_URI|g"
           - Run: find taskdef.json -type f | xargs sed -i "s|\$IMAGE_TAG|$IMAGE_TAG|g"
           - Run: cat taskdef.json
           # The output artifact will be a zip file that contains a task definition file.
       Outputs:
         Artifacts:
           - Name: TaskDefArtifact
             Files: 
               - taskdef.json
     DeployToECS:
       DependsOn: 
         - BuildBackend
       Identifier: aws/ecs-deploy@v1
       Environment:
         Name: codecatalyst-ecs-environment
         Connections:
           - Name: codecatalyst-account-connection
             Role: codecatalyst-ecs-deploy-role
       Inputs:
         Sources: []
         Artifacts:
           - TaskDefArtifact
       Configuration:
         region: us-west-2
         cluster: codecatalyst-ecs-cluster
         service: codecatalyst-ecs-service
         task-definition: taskdef.json
   ```

   앞의 코드에서
   + *codecatalyst-ecs-environment* 인스턴스 두 개를 모두 [사전 조건](#deploy-tut-ecs-prereqs)에서 생성한 환경 이름으로 바꿉니다.
   + *codecatalyst-account-connection* 인스턴스 두 개를 모두 계정 연결의 표시 이름으로 바꿉니다. 표시 이름은 숫자일 수 있습니다. 자세한 내용은 [5단계: CodeCatalyst에 AWS 역할 추가](#deploy-tut-ecs-import-roles) 섹션을 참조하세요.
   + *codecatalyst-ecs-build-role*을 [4단계: AWS 역할 생성](#deploy-tut-ecs-build-deploy-roles)에서 생성한 빌드 역할 이름으로 바꿉니다.
   + *111122223333.dkr.ecr.us-west-2.amazonaws.com/codecatalyst-ecs-image-repo*(`Value:` 속성 내)를 [3단계: Amazon ECR 이미지 리포지토리 생성](#deploy-tut-ecs-ecr)에서 생성한 Amazon ECR 리포지토리의 URI로 바꿉니다.
   + *111122223333.dkr.ecr.us-west-2.amazonaws.com*(`Run: aws ecr` 명령 내)을 이미지 접미사(`/codecatalyst-ecs-image-repo`) 제외 Amazon ECR 리포지토리의 URI로 바꿉니다.
   + *codecatalyst-ecs-deploy-role*을 [4단계: AWS 역할 생성](#deploy-tut-ecs-build-deploy-roles)에서 생성한 배포 역할의 이름으로 바꿉니다.
   +  AWS 리전 코드가 있는 *us-west-2*의 두 인스턴스. 리전 코드 목록은 *AWS 일반 참조*의 [리전 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/rande.html#regional-endpoints)를 참조하세요.
**참고**  
빌드 및 배포 역할을 생성하지 않기로 결정한 경우 *codecatalyst-ecs-build-role* 및 *codecatalyst-ecs-deploy-role*을 `CodeCatalystWorkflowDevelopmentRole-spaceName` 역할 이름으로 바꿉니다. 이에 대한 자세한 내용은 [4단계: AWS 역할 생성](#deploy-tut-ecs-build-deploy-roles) 섹션을 참조하세요.
**작은 정보**  
이전 워크플로 코드에 표시된 `find` 및 `sed` 명령을 사용하여 리포지토리 및 이미지 이름을 업데이트하는 대신 이 용도로 **Amazon ECS 작업 정의 렌더링** 작업을 사용할 수 있습니다. 자세한 내용은 [Amazon ECS 작업 정의 수정](render-ecs-action.md) 섹션을 참조하세요.

1. (선택 사항) 커밋하기 전에 YAML 코드가 유효한지 확인하려면 **검증**을 선택합니다.

1. **커밋**을 선택합니다.

1. **워크플로 커밋** 대화 상자에서 다음을 입력합니다.

   1. **커밋 메시지**에서 텍스트를 제거하고 다음을 입력합니다.

      ```
      Add first workflow
      ```

   1. **리포지토리**에서 `codecatalyst-ecs-source-repository`를 선택합니다.

   1. **브랜치 이름**에서 기본을 선택합니다.

   1. **커밋**을 선택합니다.

   이제 워크플로를 생성했습니다. 워크플로 상단에 정의된 트리거로 인해 워크플로 실행이 자동으로 시작됩니다. 특히 `workflow.yaml` 파일을 소스 리포지토리에 커밋(및 푸시)할 때 트리거가 워크플로 실행을 시작했습니다.

**진행 중인 워크플로 실행을 보려면**

1. CodeCatalyst 콘솔의 탐색 창에서 **CI/CD**를 선택한 다음 **워크플로**를 선택합니다.

1. 방금 생성한 `codecatalyst-ecs-workflow` 워크플로를 선택합니다.

1. **BuildBackend**를 선택하여 빌드 진행 상황을 확인합니다.

1. **DeployToECS**를 선택하여 배포 진행 상황을 확인합니다.

   실행 세부 정보 보기에 대한 자세한 내용은 [워크플로 실행 상태 및 세부 정보 보기](workflows-view-run.md)를 참조하세요.

**배포를 확인하려면**

1. [https://console.aws.amazon.com/ecs/](https://console.aws.amazon.com/ecs/)에서 Amazon ECS 클래식 콘솔을 엽니다.

1. `codecatalyst-ecs-cluster` 클러스터를 선택합니다.

1. **작업** 탭을 선택합니다.

1. 세 가지 태스크 중 하나를 선택합니다.

1. **퍼블릭 IP** 필드에서 **개방형 주소**를 선택합니다.

   브라우저에 "Hello World" 페이지가 나타나 Amazon ECS 서비스가 애플리케이션을 성공적으로 배포했음을 나타냅니다.

## 9단계: 소스 파일 변경
<a name="deploy-tut-ecs-change"></a>

이 섹션에서는 소스 리포지토리의 `index.html` 파일을 변경합니다. 이 변경으로 인해 워크플로는 새 Docker 이미지를 빌드하고 커밋 ID로 태그를 지정하고 Amazon ECR에 푸시한 다음 Amazon ECS에 배포합니다.

**index.html을 변경하려면**

1. CodeCatalyst 콘솔의 탐색 창에서 **코드**를 선택한 다음 **소스 리포지토리**를 선택하고 `codecatalyst-ecs-source-repository` 리포지토리를 선택합니다.

1. [`public-html`]를 선택한 다음 [`index.html`]를 선택합니다.

   `index.html`의 내용이 나타납니다.

1. **편집**을 선택합니다.

1. 14행에서 `Hello World` 텍스트를 `Tutorial complete!`로 변경합니다.

1. **커밋**을 선택한 다음 **커밋**을 다시 선택합니다.

   커밋으로 인해 새 워크플로 실행이 시작됩니다.

1. (선택 사항) 소스 리포지토리의 메인 페이지로 이동하여 **커밋 보기**를 선택한 다음 `index.html` 변경 사항에 대한 커밋 ID를 기록해 둡니다.

1. 배포 진행 상황 보기:

   1. 탐색 창에서 **CI/CD**를 선택한 다음 **워크플로**를 선택합니다.

   1. 최신 실행을 보려면 `codecatalyst-ecs-workflow`를 선택합니다.

   1. **BuildBackend** 및 **DeployToECS**를 선택하여 워크플로 실행 진행 상황을 확인합니다.

1. 다음과 같이 애플리케이션이 업데이트되었는지 확인합니다.

   1. [https://console.aws.amazon.com/ecs/](https://console.aws.amazon.com/ecs/)에서 Amazon ECS 클래식 콘솔을 엽니다.

   1. `codecatalyst-ecs-cluster` 클러스터를 선택합니다.

   1. **작업** 탭을 선택합니다.

   1. 세 가지 태스크 중 하나를 선택합니다.

   1. **퍼블릭 IP** 필드에서 **개방형 주소**를 선택합니다.

      `Tutorial complete!` 페이지가 나타납니다.

1. (선택 사항)에서 Amazon ECR 콘솔로 AWS전환하고 새 Docker 이미지에 6단계의 커밋 ID로 태그가 지정되었는지 확인합니다.

## 정리
<a name="deploy-tut-ecs-cleanup"></a>

요금이 부과되지 않도록 이 자습서에서 사용하는 파일과 서비스를 정리합니다.

에서 다음 순서로 AWS Management Console정리합니다.

1. Amazon ECS에서 다음을 수행합니다.

   1. `codecatalyst-ecs-service`을 삭제합니다.

   1. `codecatalyst-ecs-cluster`을 삭제합니다.

   1. `codecatalyst-ecs-task-definition` 등록을 취소합니다.

1. Amazon ECR에서 `codecatalyst-ecs-image-repo`를 삭제합니다.

1. Amazon EC2에서 `codecatalyst-ecs-security-group`를 삭제합니다.

1. IAM Identity Center에서 다음을 삭제합니다.

   1. `CodeCatalystECSUser`

   1. `CodeCatalystECSPermissionSet`

CodeCatalyst 콘솔에서 다음과 같이 정리합니다.

1. `codecatalyst-ecs-workflow`를 삭제합니다.

1. `codecatalyst-ecs-environment`를 삭제합니다.

1. `codecatalyst-ecs-source-repository`를 삭제합니다.

1. `codecatalyst-ecs-project`를 삭제합니다.

이 자습서에서는 CodeCatalyst 워크플로와 Amazon ECS에 배포 작업을 사용하여 **Amazon ECS 서비스에 애플리케이션을 배포**하는 방법을 배웠습니다.