背景

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