背景
ECSでデバッグしたいです。
Dockerではexecコマンドでコンテナにアタッチできます。じゃあ、ECSはどうなのと調べたら、ECS Execがありました。
この記事はExecできるようにした記録です。
Execの有効かどうかの確認
以下のコマンドでExecが有効であるかを確認できます。
aws ecs describe-services \
--cluster yamada-ecs-cluster \
--services yamada-ecs-service \
--query 'services[0].enableExecuteCommand'
falseだと無効、trueだと有効です。
service
以下のようにenable_execute_command = true
を定義します。
resource "aws_ecs_service" "main" {
~省略〜
cluster = aws_ecs_cluster.main.id
task_definition = aws_ecs_task_definition.main.arn
launch_type = "FARGATE"
enable_execute_command = true #ECS EXECの有効
~省略〜
}
IAMポリシーの定義
IAMポリシーの定義は以下のようにssmmessages
を入れます。
ECSはexecロールとtaskロールがあります。こちらはtaskロールに入れます。
resource "aws_iam_policy" "ecs_task" {
~省略〜
policy = jsonencode({
"Version" : "2012-10-17",
"Statement" : [
{
"Action" : [
"ssmmessages:CreateControlChannel",
"ssmmessages:CreateDataChannel",
"ssmmessages:OpenControlChannel",
"ssmmessages:OpenDataChannel"
],
"Effect" : "Allow",
"Resource" : [
"*"
]
}
]
})
~省略〜
タスクのデプロイ
上記の設定を反映した後はタスクのデプロイが必要です。
私はこれをやらずに、いつまでたっても反映されないので、焦ってました。
コンテナに入るために、タスクIDを調べる
タスクのIDを調べます。
aws ecs list-tasks \
--cluster yamada-ecs-cluster \
--service yamada-ecs-service
以下のように出力されます。
最後尾の/
の後がタスクIDです。
{
"taskArns": [
"arn:aws:ecs:ap-northeast-1:123456789012:task/zoo200-cluster/ac089xxxxx"
]
}
タスクがExecに対応しているかを確認します。
aws ecs describe-tasks \
--cluster yamada-ecs-cluster \
--tasks ac089xxxxx \
--query 'tasks[0].enableExecuteCommand'
false
だと無効、true
だと有効です。
いよいよコンテナにアタッチ
やっとコンテナにアタッチできます。クラスタ、タスク、コンテナを指定します。コンテナは定義している名前をそのまま使用します。
aws ecs execute-command \
--cluster yamada-ecs-cluster \
--task ac089xxxxx \
--container golang-helloworld \
--interactive \
--command /bin/sh