AWS CLI を使用して、EC2 起動タイプ用の Amazon ECS タスクを作成する - Amazon Elastic Container Service

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 デュアルスタックエンドポイントの使用」を参照してください。

前提条件

このチュートリアルでは、以下の前提条件が完了済みであることを前提としています。

クラスターを作成する

デフォルトでは、初めてコンテナインスタンスを起動すると、アカウントが 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 でコンテナインスタンスを起動するには
  1. 次のコマンドを使用して、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
  2. コンテナインスタンスを管理するための SSH アクセスとウェブサーバーの HTTP アクセスを許可するセキュリティグループを作成します。

    aws ec2 create-security-group --group-name ecs-tutorial-sg --description "ECS tutorial security group"

    出力:

    { "GroupId": "sg-abcd1234" }
  3. 次のコマンドを実行して、セキュリティグループにインバウンドルールを追加します。

    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 アクセスの制限を検討する必要があります。

  4. コンテナインスタンスへの 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 アクセスに適切なアクセス許可を持つローカルマシンに保存されます。

  5. ECS 最適化 AMI を使用して EC2 インスタンスを起動し、クラスターに参加するように設定します。

    aws ec2 run-instances --image-id ami-abcd1234 --instance-type t3.micro --key-name ecs-tutorial-key --security-group-ids sg-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-instances container_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 をファイルとして保存し、--cli-input-json file://path_to_file.json オプションで渡すことができます。または、JSON の引用符をエスケープして 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-name nginx-service --task-definition nginx-task:1 --desired-count 1

出力:

{ "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 --services nginx-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-name nginx-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" } ] }

ウェブサーバーをテストする。

ウェブサーバーをテストするには
  1. 次のコマンドを実行して、コンテナインスタンスのパブリック IP アドレスを取得します。

    aws ec2 describe-instances --instance-ids i-abcd1234 --query 'Reservations[0].Instances[0].PublicIpAddress' --output text

    出力:

    203.0.113.25
  2. 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 ウェルカムページは、サービスが正常に実行され、インターネットからアクセス可能であることを示します。

リソースをクリーンアップする

料金の発生を回避するには、このチュートリアルで作成したリソースをクリーンアップします。

リソースをクリーンアップするには
  1. 必要なタスクがゼロになるようにサービスを更新し、サービスを削除します。

    aws ecs update-service --cluster MyCluster --service nginx-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" } }
  2. 実行中のタスクが停止するのを待ってから、サービスを削除します。

    aws ecs delete-service --cluster MyCluster --service nginx-service { "service": { "serviceArn": "arn:aws:ecs:us-east-1:123456789012:service/MyCluster/nginx-service", "serviceName": "nginx-service", "status": "DRAINING" } }
  3. 作成したコンテナインスタンスを終了します。

    aws ec2 terminate-instances --instance-ids i-abcd1234 { "TerminatingInstances": [ { "InstanceId": "i-abcd1234", "CurrentState": { "Code": 32, "Name": "shutting-down" }, "PreviousState": { "Code": 16, "Name": "running" } } ] }
  4. 作成したセキュリティグループとキーペアをクリーンアップします。

    aws ec2 delete-security-group --group-id sg-abcd1234 aws ec2 delete-key-pair --key-name ecs-tutorial-key rm ecs-tutorial-key.pem
  5. Amazon ECS クラスターを削除します。

    aws ecs delete-cluster --cluster MyCluster { "cluster": { "clusterArn": "arn:aws:ecs:us-east-1:123456789012:cluster/MyCluster", "clusterName": "MyCluster", "status": "INACTIVE" } }