🔑

ECSタスクにSSMを使用して接続するようにした

2024/02/15に公開

概要

今更かもしれませんが、ECSコンテナへの接続をEC2経由のssh接続から、SSMを使用した接続への乗り換え作業をさせてもらいました。
いつかまた他環境で使うかもしれないので、その時の作業手順をまとめておきます。

対象読者

踏み台サーバーを使った接続にモヤっとしている方

接続手順

下記に進む前に、aws cliを使用して接続しますので、未インストールの場合は先にこちらからインストールしておきます。

1、SSMプラグインをインストールする

SSM(Session Manager)とは、AWSクラウドリソースの管理、運用、自動化を支援するためのサービスとのことです。
これを使用することで、キーペアを使用したSSH接続から解放され、直接ECSに接続することができます。

# ダウンロード
curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac/sessionmanager-bundle.zip" -o "sessionmanager-bundle.zip"

# 解凍
unzip sessionmanager-bundle.zip

# インストール
sudo ./sessionmanager-bundle/install -i /usr/local/sessionmanagerplugin -b /usr/local/bin/session-manager-plugin

2、ECSタスクにロールを当てる

接続したいタスクに必要なロールを当てておきます。
必要なのは以下の4つの項目なので、新しくポリシーを作るか、以下が含まれた別ロールを当ててください。

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

私の環境では上記を含んだecsExecuteRoleを当てました。

3、ECS Execを有効化する

aws ecs execute-commandコマンドを使用して、ECSタスクに対する接続を行うため、
接続するタスクのサービスに対して、execute-commandが実行できるよう有効化しておく必要があります。
以下をターミナルで実行します。
aws ecs update-service --region xxx --cluster yyy --service zzz --enable-execute-command
(環境ごとのprofileがある場合は以降のawsコマンドにも同様に指定してください)
接続するリージョン、クラスター名、サービス名をオプションで指定してください。

有効化後に起動したタスクから反映されるので、サービスを更新しておきます。
aws ecs update-service --force-new-deployment --cluster yyy --service zzz

コンテナに接続

タスク定義で指定したコンテナ名を使って、コンテナに接続します。
aws ecs execute-command --region xxx --cluster yyy --task aaa --container bbb --interactive --command "/bin/sh"
taskオプションには、接続するタスクのIDを指定します。
タスクIDは下記で取得できるので、接続するタスクIDをこちらから参照します。
aws ecs list-tasks --cluster yyy --service-name zzz

備考

サービス内の特定のタスクに接続したいということがなければ、下記スクリプトで接続できるようになります。

#!/bin/sh
# サービスのタスクのうち適当なタスクIDを取得
TASK_ID=`aws ecs list-tasks  --cluster yyy --service-name zzz | jq -r '.taskArns[0]'`
# タスクに接続
aws ecs execute-command --region xxx --cluster yyy --task $TASK_ID --container bbb --interactive --command "/bin/sh"

最後に

以外と少ない手順で、ECSコンテナに簡単に接続できるようになりました。
不要なリソースを削除すればコンテナ管理が少しシンプルになリそうです。
ecs:ExecuteCommandに対するIAMポリシーを作成して、ユーザーにアタッチすれば、アクセス権限管理も可能なので、ベストな運用も検討したいところです。

Discussion