

# AWS CLI を使用した Amazon ECS マネージドインスタンスのタスクの作成方法について説明します。
<a name="getting-started-managed-instances-cli"></a>

 次のステップは、Amazon ECS (Amazon ECS マネージドインスタンスあり) における AWS CLI を使ったクラスターのセットアップ、キャパシティプロバイダーの作成、タスク定義の登録、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 パブリックにホストされているコンテナイメージを使用するため、インスタンスではインターネットアクセスが必要になります。インスタンスでインターネットへのルートを設定するには、以下のいずれかのオプションを使用します。
  + 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)」を参照してください。
+ (オプション) AWS CloudShell は、お客様が独自の EC2 インスタンスを作成することなくコマンドラインを提供するツールです。詳細については、「*AWS CloudShell ユーザーガイド*」の「[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>

 クラスターでタスクを実行する前に、タスク定義を登録する必要があります。タスク定義とは、1 つにグループ化されたコンテナのリストです。以下の例は、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` タスク定義の 1 つのインスタンスを使用して、クラスターで実行されるサービスを作成します。このタスクにはインターネットへのルートが必要であり、そのために 2 つの方法のいずれかを使用します。1 つの方法は、パブリックサブネットに Elastic IP アドレスを持つ NAT ゲートウェイで構成されたプライベートサブネットを使用することです。もう 1 つの方法は、パブリックサブネットを使用してパブリック 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 インスタンスを手動で終了する必要はありません。