

# AWS CLI를 사용하여 Fargate에 대한 Amazon ECS Linux 태스크 생성
<a name="ECS_AWSCLI_Fargate"></a>

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

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

**Topics**
+ [사전 조건](#ECS_AWSCLI_Fargate_prereq)
+ [1단계: 클러스터 생성](#ECS_AWSCLI_Fargate_create_cluster)
+ [2단계: Linux 태스크 정의 등록](#ECS_AWSCLI_Fargate_register_task_definition)
+ [3단계: 작업 정의 나열](#ECS_AWSCLI_Fargate_list_task_definitions)
+ [4단계: 서비스 생성](#ECS_AWSCLI_Fargate_create_service)
+ [5단계: 서비스 나열](#ECS_AWSCLI_Fargate_list_services)
+ [6단계: 실행 서비스 설명](#ECS_AWSCLI_Fargate_describe_service)
+ [7단계: 테스트](#ECS_AWSCLI_Fargate_test)
+ [8단계: 정리](#ECS_AWSCLI_Fargate_clean_up)

## 사전 조건
<a name="ECS_AWSCLI_Fargate_prereq"></a>

이 자습서에서는 다음 사전 조건이 충족되었다고 가정합니다.
+ 최신 버전의 AWS CLI가 설치 및 구성됩니다. AWS CLI 설치 또는 업그레이드에 대한 자세한 내용은 [AWS CLI 최신 버전 설치 또는 업데이트](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)를 참고하세요.
+ [Amazon ECS 사용 설정](get-set-up-for-amazon-ecs.md)의 단계가 완료되었습니다.
+ IAM 사용자는 [AmazonECS\_FullAccess](security-iam-awsmanpol.md#security-iam-awsmanpol-AmazonECS_FullAccess) IAM 정책 예제에 지정된 필수 권한을 가집니다.
+ 사용할 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)를 참조하세요.
+  프라이빗 서브넷을 사용하여 이 자습서를 따르면 Amazon ECS Exec을 사용하여 컨테이너와 직접 상호 작용하고 배포를 테스트할 수 있습니다. ECS Exec을 사용하려면 작업 IAM 역할을 생성해야 합니다. 태스크 IAM 역할 및 기타 사전 조건에 대한 자세한 내용은 [Amazon ECS Exec을 사용하여 Amazon ECS 컨테이너 모니터링](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-exec.html)을 참조하세요.
+ (선택 사항) AWS CloudShell은 고객에게 자체 EC2 인스턴스를 생성할 필요 없이 명령줄을 제공하는 도구입니다. 자세한 내용은 *AWS CloudShell 사용 설명서*의 [AWS CloudShell이란?](https://docs.aws.amazon.com/cloudshell/latest/userguide/welcome.html)을 참조하세요.

## 1단계: 클러스터 생성
<a name="ECS_AWSCLI_Fargate_create_cluster"></a>

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

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

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

```
aws ecs create-cluster --cluster-name {{fargate-cluster}}
```

출력:

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

## 2단계: Linux 태스크 정의 등록
<a name="ECS_AWSCLI_Fargate_register_task_definition"></a>

ECS 클러스터에서 작업을 실행하려면 먼저 작업 정의를 등록해야 합니다. 태스크 정의는 그룹화된 컨테이너의 목록입니다. 다음 예제는 Docker Hub에서 호스팅되는 httpd 컨테이너 이미지를 사용하여 PHP 웹 앱을 생성하는 간단한 작업 정의입니다. 사용 가능한 태스크 정의 파라미터에 대한 자세한 정보는 [Amazon ECS 작업 정의](task_definitions.md) 섹션을 참조하세요. 이 자습서에서 `taskRoleArn`는 프라이빗 서브넷에 작업을 배포하고 배포를 테스트하려는 경우에만 필요합니다. `taskRoleArn`을 [사전 조건](#ECS_AWSCLI_Fargate_prereq)에 설명한 대로 ECS Exec을 사용하기 위해 생성한 IAM 작업 역할로 바꿉니다.

```
 {
        "family": "sample-fargate",
        "networkMode": "awsvpc",
        {{"taskRoleArn": "arn:aws:iam::aws_account_id:role/execCommandRole", }}
        "containerDefinitions": [
            {
                "name": "fargate-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.</p> </div></body></html>' >  /usr/local/apache2/htdocs/index.html && httpd-foreground\""
                ]
            }
        ],
        "requiresCompatibilities": [
            "FARGATE"
        ],
        "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/fargate-task.json}}
```

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

## 3단계: 작업 정의 나열
<a name="ECS_AWSCLI_Fargate_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-fargate:1"
    ]
}
```

## 4단계: 서비스 생성
<a name="ECS_AWSCLI_Fargate_create_service"></a>

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

프라이빗 서브넷을 사용하는 예. Amazon ECS Exec을 사용하려면 이 ` enable-execute-command ` 옵션이 필요합니다.

```
aws ecs create-service --cluster {{fargate-cluster}} --service-name {{fargate-service}} --task-definition {{sample-fargate:1}} --desired-count {{1}} --launch-type "FARGATE" --network-configuration "awsvpcConfiguration={subnets=[{{subnet-abcd1234}}],securityGroups=[{{sg-abcd1234}}]}" --enable-execute-command
```

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

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

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

## 5단계: 서비스 나열
<a name="ECS_AWSCLI_Fargate_list_services"></a>

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

```
aws ecs list-services --cluster {{fargate-cluster}}
```

출력:

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

## 6단계: 실행 서비스 설명
<a name="ECS_AWSCLI_Fargate_describe_service"></a>

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

```
aws ecs describe-services --cluster {{fargate-cluster}} --services {{fargate-service}}
```

성공하면 서비스 실패 및 서비스에 대한 설명이 반환됩니다. 예를 들어 ` services ` 섹션에서 실행 중이거나 보류 중인 작업 상태와 같이 배포에 대한 정보를 찾을 수 있습니다. 작업 정의, 네트워크 구성 및 타임스탬프가 지정된 이벤트에 대한 정보도 찾을 수 있습니다. 실패 섹션에서는 호출과 관련된 실패(있는 경우)에 대한 정보를 찾을 수 있습니다. 문제 해결에 대한 자세한 정보는 [서비스 이벤트 메시지](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-event-messages.html)를 참조하세요. 서비스 설명에 대한 자세한 정보는 [서비스 설명](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DescribeServices)을 참조하세요.

```
{
    "services": [
        {
            "networkConfiguration": {
                "awsvpcConfiguration": {
                    "subnets": [
                        "{{subnet-abcd1234}}"
                    ], 
                    "securityGroups": [
                        "{{sg-abcd1234}}"
                    ], 
                    "assignPublicIp": "ENABLED"
                }
            }, 
            "launchType": "FARGATE", 
            "enableECSManagedTags": false, 
            "loadBalancers": [], 
            "deploymentController": {
                "type": "ECS"
            }, 
            "desiredCount": 1, 
            "clusterArn": "arn:aws:ecs:{{region}}:{{aws_account_id}}:cluster/fargate-cluster", 
            "serviceArn": "arn:aws:ecs:{{region}}:{{aws_account_id}}:service/fargate-service", 
            "deploymentConfiguration": {
                "maximumPercent": 200, 
                "minimumHealthyPercent": 100
            }, 
            "createdAt": 1692283199.771, 
            "schedulingStrategy": "REPLICA", 
            "placementConstraints": [], 
            "deployments": [
                {
                    "status": "PRIMARY", 
                    "networkConfiguration": {
                        "awsvpcConfiguration": {
                            "subnets": [
                                "{{subnet-abcd1234}}"
                            ], 
                            "securityGroups": [
                                "{{sg-abcd1234}}"
                            ], 
                            "assignPublicIp": "ENABLED"
                        }
                    }, 
                    "pendingCount": 0, 
                    "launchType": "FARGATE", 
                    "createdAt": 1692283199.771, 
                    "desiredCount": 1, 
                    "taskDefinition": "arn:aws:ecs:{{region}}:{{aws_account_id}}:task-definition/sample-fargate:1", 
                    "updatedAt": 1692283199.771, 
                    "platformVersion": "1.4.0", 
                    "id": "ecs-svc/9223370526043414679", 
                    "runningCount": 0
                }
            ], 
            "serviceName": "fargate-service", 
            "events": [
                {
                    "message": "(service fargate-service) has started 2 tasks: (task 53c0de40-ea3b-489f-a352-623bf1235f08) (task d0aec985-901b-488f-9fb4-61b991b332a3).", 
                    "id": "92b8443e-67fb-4886-880c-07e73383ea83", 
                    "createdAt": 1510811841.408
                }, 
                {
                    "message": "(service fargate-service) has started 2 tasks: (task b4911bee-7203-4113-99d4-e89ba457c626) (task cc5853e3-6e2d-4678-8312-74f8a7d76474).", 
                    "id": "d85c6ec6-a693-43b3-904a-a997e1fc844d", 
                    "createdAt": 1510811601.938
                }, 
                {
                    "message": "(service fargate-service) has started 2 tasks: (task cba86182-52bf-42d7-9df8-b744699e6cfc) (task f4c1ad74-a5c6-4620-90cf-2aff118df5fc).", 
                    "id": "095703e1-0ca3-4379-a7c8-c0f1b8b95ace", 
                    "createdAt": 1510811364.691
                }
            ], 
            "runningCount": 0, 
            "status": "ACTIVE", 
            "serviceRegistries": [], 
            "pendingCount": 0, 
            "createdBy": "arn:aws:iam::{{aws_account_id}}:user/{{user_name}}", 
            "platformVersion": "LATEST", 
            "placementStrategy": [], 
            "propagateTags": "NONE", 
            "roleArn": "arn:aws:iam::{{aws_account_id}}:role/aws-service-role/ecs.amazonaws.com/AWSServiceRoleForECS", 
            "taskDefinition": "arn:aws:ecs:{{region}}:{{aws_account_id}}:task-definition/sample-fargate:1"
        }
    ], 
    "failures": []
}
```

## 7단계: 테스트
<a name="ECS_AWSCLI_Fargate_test"></a>

### 퍼블릭 서브넷을 사용하여 배포된 작업 테스트
<a name="ECS_AWSCLI_Fargate_test_public"></a>

태스크에 대한 탄력적 네트워크 인터페이스(ENI)를 가져올 수 있도록 서비스의 태스크를 설명합니다.

먼저 태스크 ARN을 가져오세요.

```
aws ecs list-tasks --cluster {{fargate-cluster}} --service {{fargate-service}}
```

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

```
{
    "taskArns": [
        "arn:aws:ecs:us-east-1:123456789012:task/fargate-service/EXAMPLE
    ]
}
```

태스크를 설명하고 ENI ID를 찾습니다. `tasks` 파라미터에 태스크 ARN을 사용합니다.

```
aws ecs describe-tasks --cluster {{fargate-cluster}} --tasks {{arn:aws:ecs:us-east-1:123456789012:task/service/EXAMPLE}}
```

연결 정보가 출력에 나열됩니다.

```
{
    "tasks": [
        {
            "attachments": [
                {
                    "id": "d9e7735a-16aa-4128-bc7a-b2d5115029e9",
                    "type": "ElasticNetworkInterface",
                    "status": "ATTACHED",
                    "details": [
                        {
                            "name": "subnetId",
                            "value": "subnetabcd1234"
                        },
                        {
                            "name": "networkInterfaceId",
                            "value": "eni-0fa40520aeEXAMPLE"
                        },
                    ]
                }
…
}
```

퍼블릭 IP 주소를 가져오기 위해 ENI를 설명합니다.

```
aws ec2 describe-network-interfaces --network-interface-id  {{eni-0fa40520aeEXAMPLE}}
```

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

```
{
    "NetworkInterfaces": [
        {
            "Association": {
                "IpOwnerId": "amazon",
                "PublicDnsName": "ec2-34-229-42-222.compute-1.amazonaws.com",
                "PublicIp": "198.51.100.2"
            },
…
}
```

웹 브라우저에 퍼블릭 IP 주소를 입력하면 **Amazon ECS **샘플 애플리케이션이 표시되는 웹 페이지가 보여야 합니다.

### 프라이빗 서브넷을 사용하여 배포된 작업 테스트
<a name="ECS_AWSCLI_Fargate_test_private.title"></a>

 작업을 설명하고 `ExecuteCommandAgent`가 실행 중인지 확인하기 위해 `managedAgents`를 찾습니다. 나중에 사용할 수 있도록 `privateIPv4Address`를 기록해 둡니다.

```
aws ecs describe-tasks --cluster {{fargate-cluster}} --tasks {{arn:aws:ecs:us-east-1:123456789012:task/fargate-service/EXAMPLE}}
```

 관리형 에이전트 정보가 출력에 나열됩니다.

```
{
     "tasks": [
        {
            "attachments": [
                {
                    "id": "d9e7735a-16aa-4128-bc7a-b2d5115029e9",
                    "type": "ElasticNetworkInterface",
                    "status": "ATTACHED",
                    "details": [
                        {
                            "name": "subnetId",
                            "value": "subnetabcd1234"
                        },
                        {
                            "name": "networkInterfaceId",
                            "value": "eni-0fa40520aeEXAMPLE"
                        },
                        {
                            "name": "privateIPv4Address",
                            "value": "{{10.0.143.156}}"
                        }
                    ]
                }
            ],
     ...  
     "containers": [
         {
         ...
        "managedAgents": [
                        {
                            "lastStartedAt": "2023-08-01T16:10:13.002000+00:00",
                            "name": "ExecuteCommandAgent",
                            "lastStatus": "RUNNING"
                        } 
                ],
        ...
    }
```

 ` ExecuteCommandAgent`가 실행 중인지 확인한 후 다음 명령을 실행하여 작업의 컨테이너에서 대화형 셸을 실행할 수 있습니다.

```
  aws ecs execute-command --cluster {{fargate-cluster}} \
      --task {{ arn:aws:ecs:us-east-1:123456789012:task/fargate-service/EXAMPLE }} \
      --container {{ fargate-app}} \
      --interactive \
      --command "/bin/sh"
```

 대화형 셸을 실행한 후 다음 명령을 실행하여 cURL을 설치합니다.

```
apt update 
```

```
apt install curl 
```

 cURL을 설치한 후 이전에 얻은 프라이빗 IP 주소를 사용하여 다음 명령을 실행합니다.

```
 curl {{10.0.143.156}} 
```

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

```
<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.</p> 
      </div>
      </body>
</html>
```

## 8단계: 정리
<a name="ECS_AWSCLI_Fargate_clean_up"></a>

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

서비스를 삭제합니다.

```
aws ecs delete-service --cluster {{fargate-cluster}} --service {{fargate-service}} --force
```

클러스터를 삭제합니다.

```
aws ecs delete-cluster --cluster {{fargate-cluster}}
```