

# 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)」を参照してください。

**注記**  
デュアルスタックサービスエンドポイントを使用することで、IPv4 と IPv6 の両方を介して AWS CLI、SDK、および Amazon ECS API から 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\$1FullAccess](security-iam-awsmanpol.md#security-iam-awsmanpol-AmazonECS_FullAccess) IAM ポリシー例で指定されている必要なアクセス権限があること。
+ VPC およびセキュリティグループが使用できるように作成されていること。このチュートリアルは、Amazon ECR パブリックにホストされているコンテナ画像を使用するため、タスクではインターネットアクセスが必要になります。タスクでインターネットへのルートを設定するには、以下のいずれかのオプションを使用します。
  + Elastic IP アドレスが割り当てられた NAT ゲートウェイでプライベートサブネットを使用する。
  + パブリックサブネットを使用してタスクにパブリック IP アドレスを割り当てる。

  詳細については、「[仮想プライベートクラウドを作成する](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 ロールおよびその他の前提条件の詳細については、「[ECS Exec を使用して Amazon ECS コンテナをモニタリングする](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-exec.html)」を参照してください。
+ (任意) AWS CloudShell は、お客様が独自の EC2 インスタンスを作成する必要なく、コマンドラインを提供するツールです。詳細については、「*AWS CloudShell ユーザーガイド*」の「[What is 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 クラスターでタスクを実行する前に、タスク定義を登録する必要があります。タスク定義とは、1 つにグループ化されたコンテナのリストです。以下の例は、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` タスク定義の 1 つのインスタンスを使用して、クラスターで実行されるサービスを作成します。このタスクにはインターネットへのルートが必要であり、そのために 2 つの方法のいずれかを使用します。1 つの方法は、パブリックサブネットに Elastic IP アドレスを持つ NAT ゲートウェイで構成されたプライベートサブネットを使用することです。もう 1 つの方法は、パブリックサブネットを使用してパブリック 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>

タスクの Elastic Network Interface (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>

 タスクを説明し、`managedAgents` を見つけて、`ExecuteCommandAgent` が実行されていることを確認します。後で使用するために `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** サンプルアプリケーションの Web ページと同等の 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
```