

# AWS CLI에서 Amazon ECS 관리형 인스턴스에 대한 태스크를 생성하는 방법에 대해 알아봅니다.
<a name="getting-started-managed-instances-cli"></a>

 다음 단계는 AWS CLI를 사용하여 Amazon ECS 관리형 인스턴스를 통해 Amazon ECS에서 클러스터를 설정하고, 용량 공급자를 생성하며, 태스크 정의를 등록하고, Linux 태스크를 실행하며, 기타 일반적인 시나리오를 수행하는 데 도움이 됩니다. AWS CLI의 최신 버전을 사용합니다. 최신 버전으로 업그레이드하는 방법에 대한 자세한 내용은 [AWS CLI 최신 버전의 설치 또는 업데이트](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)를 참조하세요.

**참고**  
 듀얼 스택 서비스 엔드포인트를 사용하면 AWS AWS CLI, SDK 및 Amazon ECS API에서 IPv4 및 IPv6 모두를 통해 Amazon ECS와 상호 작용할 수 있습니다. 자세한 내용은 [Amazon ECS 듀얼 스택 엔드포인트 사용](dual-stack-endpoint.md) 섹션을 참조하세요.

**주제**
+ [사전 조건](#managed-instances-cli-prereq)
+ [1단계: 클러스터 생성](#managed-instances-cli-create-cluster)
+ [2단계: Amazon ECS 관리형 인스턴스 용량 공급자 생성](#managed-instances-cli-create-capacity-provider)
+ [3단계: 클러스터의 기본 용량 공급자 전략 구성](#managed-instances-cli-configure-cluster)
+ [4단계: Linux 태스크 정의 등록](#managed-instances-cli-register-task-definition)
+ [5단계: 태스크 정의 나열](#managed-instances-cli-list-task-definitions)
+ [6단계: 서비스 생성](#managed-instances-cli-create-service)
+ [7단계: 서비스 나열](#managed-instances-cli-list-services)
+ [8단계: 실행 서비스 설명](#managed-instances-cli-describe-service)
+ [9단계: 테스트](#managed-instances-cli-test)
+ [10단계: 정리](#managed-instances-cli-clean-up)

## 사전 조건
<a name="managed-instances-cli-prereq"></a>

 자습서를 시작하기 전에 다음을 완료합니다.
+ [Amazon ECS 설정](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/get-set-up-for-amazon-ecs.html)에 나와 있는 단계를 완료했습니다.
+ 최신 버전의 AWS CLI가 설치 및 구성됩니다. AWS CLI 설치 또는 업그레이드에 대한 자세한 내용은 *AWS Command Line Interface 사용 설명서*의 [최신 버전의 AWS CLI 설치 또는 업데이트](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)를 참조하세요.
+ [Amazon ECS 사용 설정](get-set-up-for-amazon-ecs.md)의 단계가 완료되었습니다.
+ Amazon ECS 관리형 인스턴스에 필요한 IAM 역할이 있습니다. 여기에는 다음이 포함됩니다.
  + 인프라 역할 - Amazon ECS가 사용자를 대신해 AWS 서비스를 직접 호출하여 Amazon ECS 관리형 인스턴스 인프라를 관리하도록 허용합니다.

    자세한 내용은 [Amazon ECS 인프라 IAM 역할](infrastructure_IAM_role.md) 섹션을 참조하세요.
  + 인스턴스 프로파일 - 관리형 인스턴스에서 실행되는 Amazon ECS 컨테이너 에이전트 및 Docker 대몬에 대한 권한을 제공합니다.

    인스턴스 역할 이름에는 인프라 역할의 `iam:PassRole` 작업과 일치하도록 접두사로 `ecsInstanceRole`이 포함되어야 합니다.

    자세한 내용은 [Amazon ECS 관리형 인스턴스의 인스턴스 프로파일](managed-instances-instance-profile.md) 섹션을 참조하세요.
+ 사용할 VPC 및 보안 그룹이 생성되었습니다. 이 자습서에서는 Amazon ECR Public에서 호스팅되는 컨테이너 이미지를 사용하므로 인스턴스에서 인터넷에 액세스할 수 있어야 합니다. 인스턴스에 인터넷 경로를 제공하려면 다음 옵션 중 하나를 사용합니다.
  + 탄력적 IP 주소가 있는 NAT 게이트웨이와 함께 프라이빗 서브넷을 사용합니다.
  + 퍼블릭 서브넷을 사용하고 퍼블릭 IP 주소를 인스턴스에 할당합니다.

  자세한 내용은 [Virtual Private Cloud 생성](get-set-up-for-amazon-ecs.md#create-a-vpc) 섹션을 참조하세요.

  보안 그룹 및 규칙에 대한 자세한 내용은 *Amazon Virtual Private Cloud 사용 설명서*의 [VPC에 대한 기본 보안 그룹](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#DefaultSecurityGroup)과 [규칙 예](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_SecurityGroups.html#security-group-rule-examples)를 참조하세요.
+ (선택 사항) AWS CloudShell은 고객에게 자체 EC2 인스턴스를 생성할 필요 없이 명령줄을 제공하는 도구입니다. 자세한 내용은 *AWS CloudShell 사용 설명서*의 [What is AWS CloudShell?](https://docs.aws.amazon.com/cloudshell/latest/userguide/welcome.html)을 참조하세요.

## 1단계: 클러스터 생성
<a name="managed-instances-cli-create-cluster"></a>

 계정에는 기본적으로 `default` 클러스터가 할당됩니다.

**참고**  
 제공된 `default` 클러스터를 사용하는 이점은 후속 명령에서 `--cluster cluster_name` 옵션을 지정할 필요가 없다는 것입니다. 기본 클러스터가 아닌 자체 클러스터를 생성하는 경우, 해당 클러스터에 사용할 각 명령에 `--cluster cluster_name`을 지정해야 합니다.

 다음 명령을 사용하여 고유한 이름의 자체 클러스터를 생성합니다.

```
aws ecs create-cluster --cluster-name managed-instances-cluster
```

출력:

```
{
    "cluster": {
        "status": "ACTIVE", 
        "defaultCapacityProviderStrategy": [], 
        "statistics": [], 
        "capacityProviders": [], 
        "tags": [], 
        "clusterName": "managed-instances-cluster", 
        "settings": [
            {
                "name": "containerInsights", 
                "value": "disabled"
            }
        ], 
        "registeredContainerInstancesCount": 0, 
        "pendingTasksCount": 0, 
        "runningTasksCount": 0, 
        "activeServicesCount": 0, 
        "clusterArn": "arn:aws:ecs:region:aws_account_id:cluster/managed-instances-cluster"
    }
}
```

## 2단계: Amazon ECS 관리형 인스턴스 용량 공급자 생성
<a name="managed-instances-cli-create-capacity-provider"></a>

 Amazon ECS 관리형 인스턴스를 사용하여 태스크를 실행하려면 먼저 인프라 구성을 정의하는 용량 공급자를 생성해야 합니다. 용량 공급자에서는 관리형 인스턴스에 대한 IAM 역할, 네트워크 구성 및 기타 설정을 지정합니다.

 용량 공급자 구성으로 JSON 파일을 생성합니다. 자리 표시자 값을 실제 리소스 식별자로 바꿉니다.

```
{
    "name": "managed-instances-cp",
    "cluster": "managed-instances-cluster",
    "managedInstancesProvider": {
        "infrastructureRoleArn": "arn:aws:iam::aws_account_id:role/ecsInfrastructureRole",
        "instanceLaunchTemplate": {
            "ec2InstanceProfileArn": "arn:aws:iam::aws_account_id:instance-profile/ecsInstanceRole",
            "networkConfiguration": {
                "subnets": [
                    "subnet-abcdef01234567890",
                    "subnet-1234567890abcdef0"
                ],
                "securityGroups": [
                    "sg-0123456789abcdef0"
                ]
            },
            "storageConfiguration": {
                "storageSizeGiB": 100
            },
            "monitoring": "basic"
        }
    }
}
```

 이 구성을 `managed-instances-cp.json`으로 저장하고 용량 공급자를 생성합니다.

```
aws ecs create-capacity-provider --cli-input-json file://managed-instances-cp.json
```

 명령은 생성이 완료된 후 용량 공급자에 대한 설명을 반환합니다.

## 3단계: 클러스터의 기본 용량 공급자 전략 구성
<a name="managed-instances-cli-configure-cluster"></a>

 Amazon ECS 관리형 인스턴스 용량 공급자를 기본 용량 공급자 전략으로 사용하도록 클러스터를 업데이트합니다. 그러면 태스크 및 서비스에서 용량 공급자를 명시적으로 지정하지 않고 Amazon ECS 관리형 인스턴스를 자동으로 사용할 수 있습니다.

 클러스터 용량 공급자 구성으로 JSON 파일을 생성합니다.

```
{
    "cluster": "managed-instances-cluster",
    "capacityProviders": [
        "managed-instances-cp"
    ],
    "defaultCapacityProviderStrategy": [
        {
            "capacityProvider": "managed-instances-cp",
            "weight": 1
        }
    ]
}
```

 이 구성 파일을 `cluster-cp-strategy.json`로 저장하고 클러스터를 업데이트합니다.

```
aws ecs put-cluster-capacity-providers --cli-input-json file://cluster-cp-strategy.json
```

## 4단계: Linux 태스크 정의 등록
<a name="managed-instances-cli-register-task-definition"></a>

 클러스터에서 태스크를 실행하려면 먼저 태스크 정의를 등록해야 합니다. 태스크 정의는 그룹화된 컨테이너의 목록입니다. 다음 예제는 Docker Hub에서 호스팅되는 httpd 컨테이너 이미지를 사용하여 PHP 웹 앱을 생성하는 간단한 작업 정의입니다. 사용 가능한 태스크 정의 파라미터에 대한 자세한 정보는 [Fargate에 대한 Amazon ECS 태스크 정의 파라미터](task_definition_parameters.md) 섹션을 참조하세요.

```
{
    "family": "sample-managed-instances",
    "networkMode": "awsvpc",
    "containerDefinitions": [
        {
            "name": "managed-instances-app",
            "image": "public.ecr.aws/docker/library/httpd:latest",
            "portMappings": [
                {
                    "containerPort": 80,
                    "hostPort": 80,
                    "protocol": "tcp"
                }
            ],
            "essential": true,
            "entryPoint": [
                "sh",
                "-c"
            ],
            "command": [
                "/bin/sh -c \"echo '<html><head><title>Amazon ECS Sample App</title><style>body {margin-top: 40px; background-color: #333;} </style></head><body><div style=color:white;text-align:center><h1>Amazon ECS Sample App</h1><h2>Congratulations!</h2><p>Your application is now running on a container in Amazon ECS using Amazon ECS Managed Instances.</p></div></body></html>' >  /usr/local/apache2/htdocs/index.html && httpd-foreground\""
            ]
        }
    ],
    "requiresCompatibilities": [
        "MANAGED_INSTANCES"
    ],
    "cpu": "256",
    "memory": "512"
}
```

 작업 정의 JSON을 파일로 저장하고 `--cli-input-json file://path_to_file.json` 옵션을 사용하여 전달합니다.

 컨테이너 정의에 JSON 파일을 사용하려면 

```
aws ecs register-task-definition --cli-input-json file://$HOME/tasks/managed-instances-task.json
```

 **register-task-definition** 명령은 등록을 완료한 후 작업 정의의 설명을 반환합니다.

## 5단계: 태스크 정의 나열
<a name="managed-instances-cli-list-task-definitions"></a>

 언제라도 **list-task-definitions** 명령을 사용하여 계정의 작업 정의를 나열할 수 있습니다. 이 명령은 **run-task** 또는 **start-task**를 호출할 때 함께 사용할 수 있는 `family` 및 `revision` 값을 출력합니다.

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

출력:

```
{
    "taskDefinitionArns": [
        "arn:aws:ecs:region:aws_account_id:task-definition/sample-managed-instances:1"
    ]
}
```

## 6단계: 서비스 생성
<a name="managed-instances-cli-create-service"></a>

 계정에 대한 작업을 등록한 후 클러스터에서 등록된 작업에 대해 서비스를 생성할 수 있습니다. 이 예제에서는 클러스터에서 실행 중인 `sample-managed-instances:1` 작업 정의 인스턴스 하나를 사용하여 서비스를 생성합니다. 이 작업에는 인터넷 경로가 필요하므로 이 작업을 수행할 수 있는 두 가지 방법이 있습니다. 한 가지 방법은 퍼블릭 서브넷에서 탄력적 IP 주소가 있는 NAT 게이트웨이로 구성된 프라이빗 서브넷을 사용하는 것입니다. 또 다른 방법은 퍼블릭 서브넷을 사용하고 작업에 퍼블릭 IP 주소를 할당하는 것입니다. 아래 두 가지 예를 모두 제공합니다.

 프라이빗 서브넷을 사용하는 예제.

```
aws ecs create-service --cluster managed-instances-cluster --service-name managed-instances-service --task-definition sample-managed-instances:1 --desired-count 1 --network-configuration "awsvpcConfiguration={subnets=[subnet-abcd1234],securityGroups=[sg-abcd1234]}"
```

 퍼블릭 서브넷을 사용하는 예제.

```
aws ecs create-service --cluster managed-instances-cluster --service-name managed-instances-service --task-definition sample-managed-instances:1 --desired-count 1 --network-configuration "awsvpcConfiguration={subnets=[subnet-abcd1234],securityGroups=[sg-abcd1234],assignPublicIp=ENABLED}"
```

 **create-service** 명령은 생성을 완료한 후 서비스의 설명을 반환합니다.

## 7단계: 서비스 나열
<a name="managed-instances-cli-list-services"></a>

 클러스터의 서비스를 나열합니다. 이전 섹션에서 생성한 서비스가 보일 것입니다. 이 명령에서 반환된 서비스 이름 또는 전체 ARN을 기록해 두었다가 나중에 서비스를 설명하는 데 사용할 수 있습니다.

```
aws ecs list-services --cluster managed-instances-cluster
```

출력:

```
{
    "serviceArns": [
        "arn:aws:ecs:region:aws_account_id:service/managed-instances-cluster/managed-instances-service"
    ]
}
```

## 8단계: 실행 서비스 설명
<a name="managed-instances-cli-describe-service"></a>

 앞서 검색한 서비스 이름으로 서비스를 설명하여 작업에 관한 정보를 더 많이 가져옵니다.

```
aws ecs describe-services --cluster managed-instances-cluster --services managed-instances-service
```

 성공하면 서비스 실패 및 서비스에 대한 설명이 반환됩니다. 예를 들어 `services` 섹션에서 실행 중이거나 보류 중인 작업 상태와 같이 배포에 대한 정보를 찾을 수 있습니다. 작업 정의, 네트워크 구성 및 타임스탬프가 지정된 이벤트에 대한 정보도 찾을 수 있습니다. 실패 섹션에서는 호출과 관련된 실패(있는 경우)에 대한 정보를 찾을 수 있습니다.

 출력에서는 서비스가 Amazon ECS 관리형 인스턴스 용량 공급자를 사용하고 있음을 보여줍니다.

```
{
    "services": [
        {
            "capacityProviderStrategy": [
                {
                    "capacityProvider": "managed-instances-cp",
                    "weight": 1,
                    "base": 0
                }
            ],
            "networkConfiguration": {
                "awsvpcConfiguration": {
                    "subnets": [
                        "subnet-abcd1234"
                    ], 
                    "securityGroups": [
                        "sg-abcd1234"
                    ], 
                    "assignPublicIp": "ENABLED"
                }
            }, 
            "enableECSManagedTags": false, 
            "loadBalancers": [], 
            "deploymentController": {
                "type": "ECS"
            }, 
            "desiredCount": 1, 
            "clusterArn": "arn:aws:ecs:region:aws_account_id:cluster/managed-instances-cluster", 
            "serviceArn": "arn:aws:ecs:region:aws_account_id:service/managed-instances-service", 
            "serviceName": "managed-instances-service",
            "taskDefinition": "arn:aws:ecs:region:aws_account_id:task-definition/sample-managed-instances:1"
        }
    ], 
    "failures": []
}
```

## 9단계: 테스트
<a name="managed-instances-cli-test"></a>

 배포를 테스트하려면 태스크를 실행하는 관리형 인스턴스의 퍼블릭 IP 주소를 찾아야 합니다.

### 퍼블릭 서브넷을 사용하여 배포된 작업 테스트
<a name="managed-instances-cli-test-public-subnet"></a>

 먼저 서비스에서 태스크 ARN을 가져옵니다.

```
aws ecs list-tasks --cluster managed-instances-cluster --service managed-instances-service
```

 출력에는 태스크 ARN이 포함됩니다.

```
{
    "taskArns": [
        "arn:aws:ecs:region:aws_account_id:task/managed-instances-cluster/EXAMPLE"
    ]
}
```

 컨테이너 인스턴스 ARN을 가져오기 위해 태스크를 설명합니다. `tasks` 파라미터에 대해 태스크 ARN을 사용합니다.

```
aws ecs describe-tasks --cluster managed-instances-cluster --tasks arn:aws:ecs:region:aws_account_id:task/managed-instances-cluster/EXAMPLE
```

 출력은 태스크가 Amazon ECS 관리형 인스턴스에서 실행되고 있음을 보여주며 컨테이너 인스턴스 ARN을 포함합니다.

```
{
    "tasks": [
        {
            "launchType": "MANAGED_INSTANCES",
            "capacityProviderName": "managed-instances-cp",
            "containerInstanceArn": "arn:aws:ecs:region:aws_account_id:container-instance/managed-instances-cluster/CONTAINER_INSTANCE_ID",
            "taskArn": "arn:aws:ecs:region:aws_account_id:task/managed-instances-cluster/EXAMPLE",
            "taskDefinitionArn": "arn:aws:ecs:region:aws_account_id:task-definition/sample-managed-instances:1"
        }
    ]
}
```

 EC2 인스턴스 ID를 가져오기 위해 컨테이너 인스턴스를 설명합니다.

```
aws ecs describe-container-instances --cluster managed-instances-cluster --container-instances CONTAINER_INSTANCE_ID
```

 출력에는 EC2 인스턴스 ID가 포함됩니다.

```
{
    "containerInstances": [
        {
            "ec2InstanceId": "i-1234567890abcdef0",
            "capacityProviderName": "managed-instances-cp",
            "containerInstanceArn": "arn:aws:ecs:region:aws_account_id:container-instance/managed-instances-cluster/CONTAINER_INSTANCE_ID"
        }
    ]
}
```

 퍼블릭 IP 주소를 가져오기 위해 EC2 인스턴스를 설명합니다.

```
aws ec2 describe-instances --instance-ids i-1234567890abcdef0
```

 퍼블릭 IP 주소가 출력에 있습니다.

```
{
    "Reservations": [
        {
            "Instances": [
                {
                    "PublicIpAddress": "198.51.100.2",
                    "InstanceId": "i-1234567890abcdef0"
                }
            ]
        }
    ]
}
```

 웹 브라우저에 퍼블릭 IP 주소를 입력하면 Amazon ECS 관리형 인스턴스에서 실행 중인 **Amazon ECS** 샘플 애플리케이션을 표시하는 웹 페이지가 보여야 합니다.

### 프라이빗 서브넷을 사용하여 배포된 작업 테스트
<a name="managed-instances-cli-test-private-subnet"></a>

 프라이빗 서브넷에 배포된 태스크의 경우 Amazon ECS Exec을 사용하여 컨테이너에 연결하고 해당 인스턴스 내에서 배포를 테스트할 수 있습니다. 위와 동일한 단계에 따라 태스크 ARN을 가져온 다음 ECS Exec를 사용합니다.

```
aws ecs execute-command --cluster managed-instances-cluster \
    --task arn:aws:ecs:region:aws_account_id:task/managed-instances-cluster/EXAMPLE \
    --container managed-instances-app \
    --interactive \
    --command "/bin/sh"
```

 대화형 쉘이 실행된 후 웹 서버를 테스트할 수 있습니다.

```
curl localhost
```

 **Amazon ECS ** 샘플 애플리케이션 웹 페이지에 해당하는 HTML이 표시됩니다.

## 10단계: 정리
<a name="managed-instances-cli-clean-up"></a>

 이 자습서로 완료를 한 후에 사용하지 않는 리소스에 대해 요금이 발생하는 것을 방지하기 위해 연결된 리소스를 정리해야 합니다.

 서비스를 삭제합니다.

```
aws ecs delete-service --cluster managed-instances-cluster --service managed-instances-service --force
```

 서비스가 삭제되고 모든 태스크가 중지될 때까지 기다린 다음 용량 공급자를 삭제합니다.

```
aws ecs delete-capacity-provider --capacity-provider managed-instances-cp
```

 클러스터를 삭제합니다.

```
aws ecs delete-cluster --cluster managed-instances-cluster
```

**참고**  
 용량 공급자가 삭제되면 관리형 인스턴스가 자동으로 종료됩니다. EC2 인스턴스를 수동으로 종료하지 않아도 됩니다.