« ^ »

AWS ECS Execを使用してFargate上のコンテナとのセッションを開始する

2023/2/24 更新
約 4分 で読める

TL;DR

AWS ECS Execがを使用してFargate上のコンテナとのセッションを開始する。同様ことができる従来のSSMセッションマネージャーとの比較を行う。


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 12334567890abcdef1234567890abcde

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)

実行までの流れ

コンテナに入るまでにはいくつかの情報を取得する必要がある。全てAWS Console上で確認できる。ここではAWS CLIを使用し、それらを探しだす方法を示す。必要な情報は、クラスタ名、タスク名、コンテナ名だ。これらを取得するためには、それぞれにコマンドを実行する必要がある。またその場合、それらのコマンドを実行できる権限を持っていることが前提となる。

必要な情報取得するコマンド
クラスタ名aws ecs list-clusters
タスク名aws ecs list-tasks
コンテナ名aws ecs describe-tasks
必要な情報と情報を取得するコマンド

まずはクラスタ名を取得する。ここではクラスタの一覧を取得し、目的のクラスタを探す。

aws ecs list-clusters
クラスターを探す

クラスタを見つけたら、クラスタ内で実行中のタスクの一覧を取得する。どのタスクを対象にするかは、必要に応じて決める。

aws ecs list-tasks --cluster sample
タスクを探す

タスクを見つけたら、そのタスク内で実行中のコンテナを探す。タスクの情報を取得することで、コンテナの情報も探すことができる。

aws ecs describe-tasks --cluster sample --task 12334567890abcdef1234567890abcde
コンテナを探す。

クラスタ名、コンテナ名はあらかじめ決っているため、探す必要がないかもしれない。一方タスク名は動的に決められるため、都度確認する必要がある。

必要な情報がそろったら aws ecs execute-command でコンテナに入ることができる。

aws ecs execute-command --cluster sample --task 12334567890abcdef1234567890abcde --container mycontaineer --interactive --command "/bin/bash"

©TakesxiSximada
しむどん三度無視 により 2021/4/1 に投稿、2023/2/24 に最終更新
« ^ »