AWS CLIでaws ecs execute-commandを使えるようにする

AWS ECS Exec は現時点では AWS CLI を使って設定や利用を行う。サービ スの設定時にも必要だが、セッションの開始にも必要になる。

AWS CLIをインストールする

v1系は1.19.28以降、v2系は2.1.31以降が必要となる。

brew install awscli

バージョンを確認する。

aws --version
aws-cli/2.1.32 Python/3.9.2 Darwin/20.3.0 source/x86_64 prompt/off

Session Manager pluginをインストールする

IAMの設定

AWS ECS Execの実行にSessionManagerの権限が必要になる。

ポリシー

SessionManagerの必要な権限を付与したIAMポリシーを作成する。

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

ロール

ECSのタスクロールに先程作成したポリシーをアタッチする。ECSを実行したこ とがある場合ecsTaskExecutionRoleというロールが既に存在する。今回はその ロールにアタッチした。

ECSの設定

タスク定義

前述で作成したロールをタスクロールとして設定する。

クラスタ

サービス

サービスに対してAWS ECS Execの機能を有効化する必要がある。ただしAWS Console上からそれを設定することはできない。そのためAWS CLIで --enable-execute-command オプションを使って設定の変更を行う。

aws ecs update-service --cluster sample --service sample1 --enable-execute-command

再起動

設定がもろもろ済んだらタスクの再起動を行う。サービスの更新メニューから 強制的にデプロイする のチェックをいれて更新すれば良い。

実行中のタスクのAWS ECS Exec機能が有効になっているかを確認する。

aws ecs describe-tasks コマンドで機能が有効になっているかを確認でき る。実行中のタスク情報の enableExecuteCommandtrue になっていれ ば有効になっている。

aws ecs describe-tasks --cluster sample --tasks 8b75c45a4aeb4ae49efa9e2a3561d123

false になっている場合はなんらかの設定が足りていない。サービスの設定 などをAWS CLIを用いて確認してみると良い。

接続方法

aws ecs execute-command でセッションを開始できる。

aws ecs execute-command --cluster sample --task 2d4a10c81ddf473d851e5daf3566f1c4 --container test --interactive --command "/bin/bash"

主に指定するオプション引数を以下に示す。

オプション引数の有無引数の例説明
–clusterありsampleECSクラスター名を指定する。
–taskあり2d4a10c81ddf473d851e5daf3566f1c4セッションを開始するタスク名を指定する。
–containerありtestセッションを開始するタスク内のコンテナを指定する。
–interactiveなしインタラクティブな操作がひつような場合に指定する。
–commandあり"/bin/bash"実行するコマンドを指定する。

SessionManagerを使ってセッションを開始する方法との違い

AWS ECS Execは内部でSessionManagerを使っているらしい。 本質的に違いがあるわけではなさそうだが、利用者からみての際をまとめた。

項目ECS ExecSessnManager
AWS CLI必要。必要ではない。
AWS Consoleからのサービス設定できない。できる。
AWS Consoleからのセッションの開始できない。できる。
SSM AgentDockerイメージの中に梱包し、コンテナ起動時に起動させておく。
Session Manager plugin必要。必要ではない。
アクティベーションID必要なし。事前に生成し、環境変数などで渡す。SSMAgentの起動時に指定する。
アクティベーションコード必要なし。事前に生成し、環境変数などで渡す。SSMAgentの起動時に指定する。
インスタンスティアの切り替え必要なし。スタンダードからアドバンスドに切り替える必要がある。
起動時に必要な情報クラスタ名、タスクID、コンテナ名インスタンスID

環境

以下の環境を前提とする。

macOS

sw_vers
ProductName:	macOS
ProductVersion:	11.2.3
BuildVersion:	20D91

Homebrew

brew -v
Homebrew 3.0.10
Homebrew/homebrew-core (git revision 7b6bcedba2; last commit 2021-04-01)
Homebrew/homebrew-cask (git revision b3cd76ab00; last commit 2021-04-01)