kurosame’s diary

フロントエンド中心です

ECS Fargate に exec する

はじめに

トラブルシューティングなどで、ECS Fargate のコンテナーに入ってコマンドを実行する手順です
コンテナーの実行環境が EC2 であれば、普通に SSH でログインして、docker execすればよいのですが、Fargate の場合はこれが使えません

ECS Exec + AWS Systems Manager(SSM)を使うと、Fargate 内のコンテナーでも exec できるようになります

事前準備

  • AWS CLI v2.1.31 以上
  • Fargate プラットフォームのバージョンが 1.3.0 以上

macOS で作業しています

ECS タスクロールの作成

ロールを作成したら、ロールの信頼関係を以下に設定

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "ecs-tasks.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

ロールに以下のポリシーをアタッチ

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ssmmessages:CreateControlChannel",
        "ssmmessages:CreateDataChannel",
        "ssmmessages:OpenControlChannel",
        "ssmmessages:OpenDataChannel"
      ],
      "Resource": "*"
    }
  ]
}

ECS のサービスを更新

AWS CLI を使って行う

aws ecs update-service --service <value> --cluster <value> --enable-execute-command

もし、サービスを新規作成する場合は、aws ecs create-serviceコマンドに--enable-execute-commandオプションを付与して実行する

実行中の ECS タスクを停止し、新しいタスクを起動させる(enableExecuteCommand が有効になる)

以下のコマンドで enableExecuteCommand オプションが有効になっているか確認できる

aws ecs describe-tasks --cluster <value> --task <value> | grep enableExecuteCommand

Session Manager plugin をインストール

brew install --cask session-manager-plugin

コンテナーに exec する

aws ecs execute-command --cluster <value> --task <value> --container <value> --interactive --command "/bin/sh"

さいごに

作業が終わったら、ECS Exec は無効にしておきましょう

aws ecs update-service --service <value> --cluster <value> --disable-execute-command