TL;DR
- ついに
kubectl exec
的な機能がECS にもきた - https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-exec.html
- 既存のコンテナに新しくなにかをインストールする必要はなく、SSM 経由でつかえる
やる
チュートリアルのとおりにやる。
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-exec.html
タスク用IAMロール作成
SSM 経由でECS へコマンドを実行するため、その権限用のIAM ロールを作成。
名前は ecsTaskRole
にし、Principalは "Service": "ecs-tasks.amazonaws.com"
。
インラインポリシーで以下を定義。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ssmmessages:CreateControlChannel", "ssmmessages:CreateDataChannel", "ssmmessages:OpenControlChannel", "ssmmessages:OpenDataChannel" ], "Resource": "*" } ] }
タスク定義
タスク定義は既存のものをそのまま使用できる。
先程作成した ecsTaskRole
を使用してnginx を起動するタスク定義のJSON を作成。
あと、 initProcessEnabled
を有効化すると、コマンド実行後にプロセスがゾンビ化することを防ぐためにクリーンアップをしてくれる。
{ "containerDefinitions": [ { "image": "nginx", "name": "nginx", "essential": true, "portMappings": [ { "hostPort": 80, "protocol": "tcp", "containerPort": 80 } ], "linuxParameters": { "initProcessEnabled": true } } ], "memory": "512", "taskRoleArn": "arn:aws:iam::<YOUR ACCOUNT ID>:role/ecsTaskRole", "executionRoleArn": "arn:aws:iam::<YOUR ACCOUNT ID>:role/ecsTaskExecutionRole", "family": "tmp", "requiresCompatibilities": [ "FARGATE" ], "networkMode": "awsvpc", "cpu": "256" }
aws コマンドからタスク定義を作成。
$ aws ecs register-task-definition --cli-input-json file://`pwd`/fargate-task.json
ECSサービスの作成
--enable-execute-command
でコマンドが実行可能なタスクを作成できる。
ネットワークの設定はデフォルトVPCを使用。
$ aws ecs create-service \ --cluster tmp \ --service-name tmp \ --task-definition tmp \ --desired-count 1 \ --launch-type "FARGATE" \ --enable-execute-command \ --network-configuration "awsvpcConfiguration={subnets=[subnet-xxxxxx],securityGroups=[sg-xxxxxx],assignPublicIp=ENABLED}"
コマンドの実行
起動したタスクを指定して、 /bin/sh
を実行。
$ aws ecs execute-command \ --cluster tmp \ --task 25e421430b30476aa64a1f73630e6c94 \ --container nginx \ --interactive \ --command "/bin/sh"
おわり