AWS CLI を使用して、Fargate 起動タイプ用の Amazon ECS Linux タスクを作成する
次のステップでは、AWS CLI を使って Amazon ECS でクラスターのセットアップ、タスク定義の登録、Linux タスクの実行、その他の一般的なシナリオを実行するために役立ちます。AWS CLI の最新バージョンを使用する。最新のバージョンにアップグレードする方法については、「AWS CLI の最新バージョンをインストールまたは更新」を参照してください。
トピック
前提条件
このチュートリアルでは、以下の前提条件をすでに満たしているものとします。
-
AWS CLI の最新バージョンがインストールされ、設定されていること。AWS CLI のインストールまたはアップグレードについては、「AWS CLI の最新バージョンをインストールまたは更新」を参照してください。
-
「Amazon ECS を使用するようにセットアップする」のステップを完了していること。
-
AWS ユーザーに AmazonECS_FullAccess IAMポリシー例で指定されている必要なアクセス権限があること。
-
VPC およびセキュリティグループが使用できるように作成されていること。このチュートリアルは、Amazon ECR パブリックにホストされているコンテナ画像を使用するため、タスクではインターネットアクセスが必要になります。タスクでインターネットへのルートを設定するには、以下のいずれかのオプションを使用します。
-
Elastic IP アドレスが割り当てられた NAT ゲートウェイでプライベートサブネットを使用する。
-
パブリックサブネットを使用してタスクにパブリック IP アドレスを割り当てる。
詳細については、「仮想プライベートクラウドを作成する」を参照してください。
セキュリティグループとルールの詳細については、「Amazon Virtual Private Cloud ユーザーガイド」の「VPC のデフォルト セキュリティ グループ」および「ルールの例」を参照してください。
-
-
プライベートサブネットを使用してこのチュートリアルを実行すると、Amazon ECS Exec を使用してコンテナを直接操作し、デプロイをテストできます。ECS Exec を使用するには、タスク IAM ロールを作成する必要があります。タスク IAM ロールおよびその他の前提条件の詳細については、「ECS Exec を使用して Amazon ECS コンテナをモニタリングする」を参照してください。
-
(任意) AWS CloudShell は、お客様が独自の EC2 インスタンスを作成する必要なく、コマンドラインを提供するツールです。詳細については、『AWS CloudShell ユーザーガイド』の「What is AWS CloudShell? ( とは?)」 を参照してください。
ステップ 1: クラスターを作成する
デフォルトでは、アカウントは 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 タスク定義を登録
ECS クラスターでタスクを実行する前に、タスク定義を登録する必要があります。タスク定義とは、1 つにグループ化されたコンテナのリストです。以下の例は、Docker Hub でホストされている httpd コンテナイメージを使用して PHP ウェブアプリケーションを作成するシンプルなタスク定義です。使用できるタスク定義パラメータの詳細については、「Amazon ECSの タスク定義」を参照してください。このチュートリアルでは、プライベート サブネットにタスクをデプロイし、そのデプロイメントをテストする場合にのみ taskRoleArn
が必要になります。taskRoleArn
を、前提条件 で説明した 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: タスク定義をリスト表示する
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: サービスを作成する
アカウントのタスクを登録したら、クラスターに登録されたタスク用のサービスを作成することができます。この例では、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-namefargate-service
--task-definitionsample-fargate:1
--desired-count1
--launch-type "FARGATE" --network-configuration "awsvpcConfiguration={subnets=[subnet-abcd1234
],securityGroups=[sg-abcd1234
]}" --enable-execute-command
パブリックサブネットを使用した例。
aws ecs create-service --cluster
fargate-cluster
--service-namefargate-service
--task-definitionsample-fargate:1
--desired-count1
--launch-type "FARGATE" --network-configuration "awsvpcConfiguration={subnets=[subnet-abcd1234
],securityGroups=[sg-abcd1234
],assignPublicIp=ENABLED
}"
create-service コマンドによって、タスク定義の登録が完了した後、その定義の説明が返されます。
ステップ 5: サービスをリスト表示する
クラスターのサービスをリスト表示します。前のセクションで作成したサービスが表示されます。このコマンドでサービス名または完全 ARN を取得できます。これを後で説明するサービスに使用します。
aws ecs list-services --cluster
fargate-cluster
出力:
{
"serviceArns": [
"arn:aws:ecs:region
:aws_account_id
:service/fargate-cluster/fargate-service"
]
}
ステップ 6: 実行中のサービスを記述する
先に取得したサービス名を使用してタスクを記述し、サービスに関する詳細情報を取得します。
aws ecs describe-services --cluster
fargate-cluster
--servicesfargate-service
このコマンドが正常に実行されると、サービスの障害とサービスの説明が返されます。例えば、 services
セクションでは、タスクの実行中または保留中のステータスなど、デプロイに関する情報が見つかります。また、タスク定義、ネットワーク設定、タイムスタンプ付きのイベントに関する情報も見つかります。障害セクションでは、呼び出しに関連する障害がある場合にその情報が見つかります。トラブルシューティングについては、「サービスイベントメッセージ」を参照してください。サービスの説明取得の詳細については、「サービスの説明取得」を参照してください。
{ "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: テスト
パブリックサブネットを使用してデプロイされたタスクのテスト
タスクの Elastic Network Interface (ENI) を取得できるようにサービス内のタスクを記述します。
まず、タスク ARN を取得します。
aws ecs list-tasks --cluster
fargate-cluster
--servicefargate-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
--tasksarn: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 のサンプルアプリケーションを表示するウェブページが確認できます。
プライベートサブネットを使用してデプロイされたタスクのテスト
タスクを説明し、managedAgents
を見つけて、ExecuteCommandAgent
が実行されていることを確認します。後で使用するために privateIPv4Address
をメモしておきます。
aws ecs describe-tasks --cluster
fargate-cluster
--tasksarn: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
\ --taskarn:aws:ecs:us-east-1:123456789012:task/fargate-service/EXAMPLE
\ --containerfargate-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: クリーンアップ
このチュートリアルが終了したら、未使用のリソースに対する料金が発生しないように、それに関連付けられたリソースをクリーンアップする必要があります。
サービスを削除します。
aws ecs delete-service --cluster
fargate-cluster
--servicefargate-service
--force
クラスターを削除します。
aws ecs delete-cluster --cluster
fargate-cluster