AWS CLI を使用して、EC2 起動タイプ用の Amazon ECS タスクを作成する
次のステップでは、AWS CLI を使って Amazon ECS でクラスターのセットアップ、タスク定義の登録、タスクの実行、その他の一般的なシナリオを実行するために役立ちます。AWS CLI の最新バージョンを使用する。最新のバージョンにアップグレードする方法については、「AWS CLI の最新バージョンをインストールまたは更新」を参照してください。
注記
デュアルスタックサービスエンドポイントを使用することで、IPv4 と IPv6 の両方を介して AWS CLI、SDK、および Amazon ECS API から Amazon ECS とやり取りできます。詳細については、「Amazon ECS デュアルスタックエンドポイントの使用」を参照してください。
トピック
前提条件
このチュートリアルでは、以下の前提条件が完了済みであることを前提としています。
-
AWS CLI の最新バージョンがインストールされ、設定されていること。AWS CLI のインストールまたはアップグレードについては、「AWS CLI の最新バージョンをインストールまたは更新」を参照してください。
-
「Amazon ECS を使用するようにセットアップする」のステップを完了していること。
-
IAM ユーザーに AmazonECS_FullAccess IAM ポリシー例で指定されている必要なアクセス権限があること。
-
使用するコンテナインスタンス IAM ロールが作成されています。詳細については、「Amazon ECS コンテナインスタンスの IAM ロール」を参照してください。
-
使用する VPC が作成されています。詳細については、「仮想プライベートクラウドを作成する」を参照してください。
-
(任意) AWS CloudShell は、お客様が独自の EC2 インスタンスを作成する必要なく、コマンドラインを提供するツールです。詳細については、『AWS CloudShell ユーザーガイド』の「What is AWS CloudShell? ( とは?)」 を参照してください。
クラスターを作成する
デフォルトでは、初めてコンテナインスタンスを起動すると、アカウントが default
クラスターを受け取ります。
注記
お客様に提供される default
クラスターを使用する利点は、後続のコマンドで --cluster
オプションを指定する必要がないことです。デフォルト以外の独自のクラスターを作成する場合は、そのクラスターで使用する予定のコマンドごとに cluster_name
--cluster
を指定する必要があります。cluster_name
以下のコマンドを使用して、一意の名前を付けた独自のクラスターを作成します。
aws ecs create-cluster --cluster-name
MyCluster
出力:
{
"cluster": {
"clusterName": "MyCluster",
"status": "ACTIVE",
"clusterArn": "arn:aws:ecs:region
:aws_account_id
:cluster/MyCluster"
}
}
Amazon ECS AMI 向けコンテナインスタンスの起動
コンテナインスタンスは、Amazon ECS コンテナエージェントを実行していて、クラスターに登録されている EC2 インスタンスです。このセクションでは、ECS 最適化 AMI を使用して EC2 インスタンスを起動します。
AWS CLI でコンテナインスタンスを起動するには
-
次のコマンドを使用して、AWS リージョン の最新の ECS 最適化 Amazon Linux 2 AMI ID を取得します。このコマンドは AWS Systems Manager Parameter Store を使用して最新の ECS 最適化 AMI ID を取得します。AMI には、Amazon ECS コンテナエージェントと Docker ランタイムがプリインストールされています。
aws ssm get-parameters --names /aws/service/ecs/optimized-ami/amazon-linux-2/recommended --query 'Parameters[0].Value' --output text | jq -r '.image_id'
出力:
ami-abcd1234
-
コンテナインスタンスを管理するための SSH アクセスとウェブサーバーの HTTP アクセスを許可するセキュリティグループを作成します。
aws ec2 create-security-group --group-name
ecs-tutorial-sg
--description "ECS tutorial security group"出力:
{ "GroupId": "sg-abcd1234" }
-
次のコマンドを実行して、セキュリティグループにインバウンドルールを追加します。
aws ec2 authorize-security-group-ingress --group-id
sg-abcd1234
--protocol tcp --port 80 --cidr 0.0.0.0/0出力:
{ "Return": true, "SecurityGroupRules": [ { "SecurityGroupRuleId": "sgr-efgh5678", "GroupId": "sg-abcd1234", "GroupOwnerId": "123456789012", "IsEgress": false, "IpProtocol": "tcp", "FromPort": 80, "ToPort": 80, "CidrIpv4": "0.0.0.0/0" } ] }
セキュリティグループが、指定された IP 範囲からの SSH アクセスと、任意の場所からの HTTP アクセスを許可するようになりました。本番環境では、特定の IP アドレスへの SSH アクセスを制限し、必要に応じて HTTP アクセスの制限を検討する必要があります。
-
コンテナインスタンスへの SSH アクセス用の EC2 キーペアを作成します。
aws ec2 create-key-pair --key-name
ecs-tutorial-key
--query 'KeyMaterial' --output text > ecs-tutorial-key.pem chmod 400 ecs-tutorial-key.pemプライベートキーは、SSH アクセスに適切なアクセス許可を持つローカルマシンに保存されます。
-
ECS 最適化 AMI を使用して EC2 インスタンスを起動し、クラスターに参加するように設定します。
aws ec2 run-instances --image-id
ami-abcd1234
--instance-typet3.micro
--key-nameecs-tutorial-key
--security-group-idssg-abcd1234
--iam-instance-profile Name=ecsInstanceRole --user-data '#!/bin/bash echo ECS_CLUSTER=MyCluster >> /etc/ecs/ecs.config' { "Instances": [ { "InstanceId": "i-abcd1234", "ImageId": "ami-abcd1234", "State": { "Code": 0, "Name": "pending" }, "PrivateDnsName": "", "PublicDnsName": "", "StateReason": { "Code": "pending", "Message": "pending" }, "InstanceType": "t3.micro", "KeyName": "ecs-tutorial-key", "LaunchTime": "2025-01-13T10:30:00.000Z" } ] }ユーザーデータスクリプトは、インスタンスを
MyCluster
に登録するように Amazon ECS エージェントを設定します。インスタンスは、エージェントに必要なアクセス許可を提供するecsInstanceRole
IAM ロールを使用します。
コンテナインスタンスを一覧表示する
コンテナインスタンスを起動してから数分以内に、Amazon ECS エージェントがインスタンスをデフォルトクラスターで登録します。次のコマンドを実行して、クラスターのコンテナインスタンスをリスト表示できます。
aws ecs list-container-instances --cluster
default
出力:
{
"containerInstanceArns": [
"arn:aws:ecs:us-east-1:aws_account_id
:container-instance/container_instance_ID
"
]
}
コンテナインスタンスを説明する
コンテナインスタンスの ARN または ID を取得した後、describe-container-instances コマンドを使用して、登録済みおよび残りの CPU やメモリリソースなど、インスタンスの変数情報を取得できます。
aws ecs describe-container-instances --cluster
MyCluster
--container-instancescontainer_instance_ID
出力:
{
"failures": [],
"containerInstances": [
{
"status": "ACTIVE",
"registeredResources": [
{
"integerValue": 1024,
"longValue": 0,
"type": "INTEGER",
"name": "CPU",
"doubleValue": 0.0
},
{
"integerValue": 995,
"longValue": 0,
"type": "INTEGER",
"name": "MEMORY",
"doubleValue": 0.0
},
{
"name": "PORTS",
"longValue": 0,
"doubleValue": 0.0,
"stringSetValue": [
"22",
"2376",
"2375",
"51678"
],
"type": "STRINGSET",
"integerValue": 0
},
{
"name": "PORTS_UDP",
"longValue": 0,
"doubleValue": 0.0,
"stringSetValue": [],
"type": "STRINGSET",
"integerValue": 0
}
],
"ec2InstanceId": "instance_id
",
"agentConnected": true,
"containerInstanceArn": "arn:aws:ecs:us-west-2:aws_account_id
:container-instance/container_instance_ID
",
"pendingTasksCount": 0,
"remainingResources": [
{
"integerValue": 1024,
"longValue": 0,
"type": "INTEGER",
"name": "CPU",
"doubleValue": 0.0
},
{
"integerValue": 995,
"longValue": 0,
"type": "INTEGER",
"name": "MEMORY",
"doubleValue": 0.0
},
{
"name": "PORTS",
"longValue": 0,
"doubleValue": 0.0,
"stringSetValue": [
"22",
"2376",
"2375",
"51678"
],
"type": "STRINGSET",
"integerValue": 0
},
{
"name": "PORTS_UDP",
"longValue": 0,
"doubleValue": 0.0,
"stringSetValue": [],
"type": "STRINGSET",
"integerValue": 0
}
],
"runningTasksCount": 0,
"attributes": [
{
"name": "com.amazonaws.ecs.capability.privileged-container"
},
{
"name": "com.amazonaws.ecs.capability.docker-remote-api.1.17"
},
{
"name": "com.amazonaws.ecs.capability.docker-remote-api.1.18"
},
{
"name": "com.amazonaws.ecs.capability.docker-remote-api.1.19"
},
{
"name": "com.amazonaws.ecs.capability.logging-driver.json-file"
},
{
"name": "com.amazonaws.ecs.capability.logging-driver.syslog"
}
],
"versionInfo": {
"agentVersion": "1.5.0",
"agentHash": "b197edd",
"dockerVersion": "DockerVersion: 1.7.1"
}
}
]
}
Amazon EC2 コンソールまたは aws ec2 describe-instances --instance-id
instance_id
コマンドを使用して、インスタンスのモニタリングに使用できる Amazon EC2 インスタンス ID も検索することもできます。
タスク定義を登録する
Amazon ECS クラスターにタスクを実行する前に、タスク定義を登録する必要があります。タスク定義とは、1 つにグループ化されたコンテナのリストです。次の例は、nginx
イメージを使用するシンプルなタスク定義です。使用できるタスク定義パラメータの詳細については、「Amazon ECSの タスク定義」を参照してください。
{ "family": "nginx-task", "containerDefinitions": [ { "name": "nginx", "image": "public.ecr.aws/ecs-sample-image/amazon-ecs-sample:latest", "cpu": 256, "memory": 512, "essential": true, "portMappings": [ { "containerPort": 80, "hostPort": 80, "protocol": "tcp" } ] } ], "requiresCompatibilities": ["EC2"], "networkMode": "bridge" }
上の JSON 例は次の 2 通りの方法で AWS CLI に渡すことができます。1 番目はタスク定義 JSON をファイルとして保存し、
オプションで渡すことができます。または、JSON の引用符をエスケープして JSON コンテナの定義をコマンドラインで渡すことができます。コマンドラインにコンテナ定義を渡す方法を選択した場合、追加で複数のバージョンのタスクを相互に関連付けたままにする --cli-input-json
file://path_to_file.json
--family
パラメータが必要です。
コンテナの定義に JSON ファイルを使用するには。
aws ecs register-task-definition --cli-input-json
file://$HOME/tasks/nginx.json
register-task-definition は登録を完了させた後、タスク定義の記述を返します。
{
"taskDefinition": {
"taskDefinitionArn": "arn:aws:ecs:us-east-1:123456789012:task-definition/nginx-task:1",
"family": "nginx-task",
"revision": 1,
"status": "ACTIVE",
"containerDefinitions": [
{
"name": "nginx",
"image": "public.ecr.aws/docker/library/nginx:latest",
"cpu": 256,
"memory": 512,
"essential": true,
"portMappings": [
{
"containerPort": 80,
"hostPort": 80,
"protocol": "tcp"
}
],
"environment": [],
"mountPoints": [],
"volumesFrom": []
}
],
"volumes": [],
"networkMode": "bridge",
"compatibilities": [
"EC2"
],
"requiresCompatibilities": [
"EC2"
]
}
}
タスク定義をリスト表示する
list-task-definitions コマンドを使用して、いつでもアカウントのタスク定義をリスト表示できます。このコマンドの出力は、 または create-service をコールするときに一緒に使用する、family
値および revision
値を表示します。
aws ecs list-task-definitions
出力:
{
"taskDefinitionArns": [
"arn:aws:ec2:us-east-1:aws_account_id
:task-definition/sleep360:1",
"arn:aws:ec2:us-east-1:aws_account_id
:task-definition/sleep360:2",
"arn:aws:ec2:us-east-1:aws_account_id
:task-definition/nginx-task:1",
"arn:aws:ec2:us-east-1:aws_account_id
:task-definition/wordpress:3",
"arn:aws:ec2:us-east-1:aws_account_id
:task-definition/wordpress:4",
"arn:aws:ec2:us-east-1:aws_account_id
:task-definition/wordpress:5",
"arn:aws:ec2:us-east-1:aws_account_id
:task-definition/wordpress:6"
]
}
サービスを作成する
アカウントのタスクを登録し、クラスターに登録されているコンテナインスタンスを起動した後、登録したタスク定義を使用して、必要な数のタスクを同時に実行および維持する Amazon ECS サービスを作成できます。この例では、デフォルトのクラスターに nginx:1
タスク定義の単独インスタンスを配置します。
aws ecs create-service --cluster
default
--service-namenginx-service
--task-definitionnginx-task:1
--desired-count1
出力:
{
"service": {
"serviceArn": "arn:aws:ecs:us-east-1:aws_account_id
:service/MyCluster/nginx-service",
"serviceName": "nginx-service",
"clusterArn": "arn:aws:ecs:us-east-1:aws_account_id
:cluster/MyCluster",
"taskDefinition": "arn:aws:ecs:us-east-1:aws_account_id
:task-definition/nginx-task:1",
"desiredCount": 1,
"runningCount": 0,
"pendingCount": 0,
"launchType": "EC2",
"status": "ACTIVE",
"createdAt": "2025-01-13T10:45:00.000Z"
}
}
リストサービス
クラスターのサービスをリスト表示します。前のセクションで作成したサービスが表示されます。このコマンドから返されたサービス ID または完全 ARN をメモし、これを後でサービスを記述するために使用できます。
aws ecs list-services --cluster
MyCluster
出力:
{
"taskArns": [
"arn:aws:ecs:us-east-1:aws_account_id
:task/task_ID
"
]
}
サービスを記述する
次のコマンドを使用してサービスを記述し、サービスに関する詳細情報を取得します。
aws ecs describe-services --cluster
MyCluster
--servicesnginx-service
出力:
{
"services": [
{
"serviceArn": "arn:aws:ecs:us-east-1:aws_account_id
:service/MyCluster/nginx-service",
"serviceName": "nginx-service",
"clusterArn": "arn:aws:ecs:us-east-1:aws_account_id
:cluster/MyCluster",
"taskDefinition": "arn:aws:ecs:us-east-1:aws_account_id
:task-definition/nginx-task:1",
"desiredCount": 1,
"runningCount": 1,
"pendingCount": 0,
"launchType": "EC2",
"status": "ACTIVE",
"createdAt": "2025-01-13T10:45:00.000Z",
"events": [
{
"id": "abcd1234-5678-90ab-cdef-1234567890ab",
"createdAt": "2025-01-13T10:45:30.000Z",
"message": "(service nginx-service) has started 1 tasks: (task abcd1234-5678-90ab-cdef-1234567890ab)."
}
]
}
]
}
実行中のタスクを記述する
サービスを記述したら、次のコマンドを実行して、サービスの一部として実行されているタスクに関する詳細情報を取得します。
aws ecs list-tasks --cluster
MyCluster
--service-namenginx-service
出力:
{
"tasks": [
{
"taskArn": "arn:aws:ecs:us-east-1:aws_account_id
:task/MyCluster/abcd1234-5678-90ab-cdef-1234567890ab",
"clusterArn": "arn:aws:ecs:us-east-1:aws_account_id
:cluster/MyCluster",
"taskDefinitionArn": "arn:aws:ecs:us-east-1:aws_account_id
:task-definition/nginx-task:1",
"containerInstanceArn": "arn:aws:ecs:us-east-1:aws_account_id
:container-instance/MyCluster/abcd1234-5678-90ab-cdef-1234567890ab",
"lastStatus": "RUNNING",
"desiredStatus": "RUNNING",
"containers": [
{
"containerArn": "arn:aws:ecs:us-east-1:aws_account_id
:container/MyCluster/abcd1234-5678-90ab-cdef-1234567890ab/abcd1234-5678-90ab-cdef-1234567890ab",
"taskArn": "arn:aws:ecs:us-east-1:aws_account_id
:task/MyCluster/abcd1234-5678-90ab-cdef-1234567890ab",
"name": "nginx",
"lastStatus": "RUNNING",
"networkBindings": [
{
"bindIP": "0.0.0.0",
"containerPort": 80,
"hostPort": 80,
"protocol": "tcp"
}
]
}
],
"createdAt": "2025-01-13T10:45:00.000Z",
"startedAt": "2025-01-13T10:45:30.000Z"
}
]
}
ウェブサーバーをテストする。
ウェブサーバーをテストするには
-
次のコマンドを実行して、コンテナインスタンスのパブリック IP アドレスを取得します。
aws ec2 describe-instances --instance-ids
i-abcd1234
--query 'Reservations[0].Instances[0].PublicIpAddress' --output text出力:
203.0.113.25
-
IP アドレスを取得したら、IP アドレスを使用して次の
curl
コマンドを実行します。curl http://203.0.113.25
出力:
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> ... </head> <body> <h1>Welcome to nginx!</h1> <p>If you can see this page, the nginx web server is successfully installed and working.</p> ... </body> </html>
nginx ウェルカムページは、サービスが正常に実行され、インターネットからアクセス可能であることを示します。
リソースをクリーンアップする
料金の発生を回避するには、このチュートリアルで作成したリソースをクリーンアップします。
リソースをクリーンアップするには
-
必要なタスクがゼロになるようにサービスを更新し、サービスを削除します。
aws ecs update-service --cluster
MyCluster
--servicenginx-service
--desired-count 0 { "service": { "serviceArn": "arn:aws:ecs:us-east-1:123456789012:service/MyCluster/nginx-service", "serviceName": "nginx-service", "desiredCount": 0, "runningCount": 1, "pendingCount": 0, "status": "ACTIVE" } } -
実行中のタスクが停止するのを待ってから、サービスを削除します。
aws ecs delete-service --cluster
MyCluster
--servicenginx-service
{ "service": { "serviceArn": "arn:aws:ecs:us-east-1:123456789012:service/MyCluster/nginx-service", "serviceName": "nginx-service", "status": "DRAINING" } } -
作成したコンテナインスタンスを終了します。
aws ec2 terminate-instances --instance-ids
i-abcd1234
{ "TerminatingInstances": [ { "InstanceId": "i-abcd1234", "CurrentState": { "Code": 32, "Name": "shutting-down" }, "PreviousState": { "Code": 16, "Name": "running" } } ] } -
作成したセキュリティグループとキーペアをクリーンアップします。
aws ec2 delete-security-group --group-id
sg-abcd1234
aws ec2 delete-key-pair --key-nameecs-tutorial-key
rmecs-tutorial-key.pem
-
Amazon ECS クラスターを削除します。
aws ecs delete-cluster --cluster
MyCluster
{ "cluster": { "clusterArn": "arn:aws:ecs:us-east-1:123456789012:cluster/MyCluster", "clusterName": "MyCluster", "status": "INACTIVE" } }