ECSタスクにSSMを使用して接続するようにした
概要
今更かもしれませんが、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