💻

ECS Execを実装する

に公開

背景

ECS上で動作しているコンテナの挙動を確認する必要がありました。

具体的には、環境変数や設定ファイルが正しく読み込まれているかを確認したい状況です。タスク定義でデータベースの認証情報などをパラメータストアから渡すようにしていますが、この確認には実際にコンテナ内に入って確認するのが確実です。

ローカル環境でDockerを使っている場合はdocker execコマンドでコンテナにアタッチできます。しかし、ECS Fargate環境では直接SSHできないため、同様の方法が使えません。

調べたところ、ECS Execという機能があり、これを使えばECS上のコンテナに対してもexecコマンドが実行できることがわかりました。

この記事はECS Execを有効にして、コンテナ内に入れるようにした記録です。

Execが有効かどうかの確認

以下のコマンドでExecが有効であるかを確認できます。

aws ecs describe-services \
--cluster yamada-ecs-cluster \
--services yamada-ecs-service \
--query 'services[0].enableExecuteCommand'

falseだと無効、trueだと有効です。

デフォルトだと無効なので、以下の手順で有効にします。

ECSのサービス部分を変更

以下のように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
GitHubで編集を提案

Discussion