こんにちは。島村です。
今更ではありますが、Amazon ECS Execを使う機会があったので
使用するまでの流れや概要など備忘録として記載したいと思います。
ECS Execの概要
ざっくりいうと、ECS Execはコンテナにログインできる機能です。
ECS Exec以前は、Fargateの起動タイプを選択している場合、コンテナにログインすることができませんでした。
ECS Execが登場したことで、ログインできるようになりました。
コンテナへログインできることで、トラブルシューティングに必要な情報がより得られることができます。
ECS Execの仕組み
ECS ExecはSystems Manager Session Managerの機能を利用して実現しています。
そのため、IAMによるコンテナへのログインアクセスを制御することも可能です。
なお、タスクにアタッチしているセキュリティグループのインバウンドルールにSSHポートを解放する必要もありません。
ECS Execは追加費用なしで利用が可能です。
前提条件
ECS Execを利用する上で必要な条件を見ていきます。
なお、今回の検証環境では、Fargateを利用します。
AWS CLIのインストールとセットアップ
導入がまだの場合は以下のドキュメントを参考にインストールしてみてください。
https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html
クレデンシャルの設定なども合わせて実施する必要があります。
Session Manager plugin for the AWS CLIのインストール
AWS CLIを利用し、Session Manager経由でSSM マネージドインスタンスに接続する場合は
接続元の端末にPluginをインストールする必要があります。
https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html
プラットフォームバージョンの確認
接続対象のコンテナをホストしているプラットフォームバージョンに指定があります。
EC2の場合
2021/1/20にリリースされたAmazon ECS 最適化 AMI を、エージェントバージョン 1.50.2 以上で使用しますFargateの場合
プラットフォームバージョン 1.4.0 以上 (Linux) または 1.0.0 (Windows) を使用します
VPC Endpointの作成
プライベートな環境の場合、ssmmessagesのVPC Endpointが必要になります。
インターネットへアクセスできる場合は、特に必要ありません。
ECS Exec利用に必要な権限があるか確認
ECSのタスクロールに以下の権限が必要です。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssmmessages:CreateControlChannel",
"ssmmessages:CreateDataChannel",
"ssmmessages:OpenControlChannel",
"ssmmessages:OpenDataChannel"
],
"Resource": "*"
}
]
}
AWS CLIで使用するクレデンシャルに紐づく権限は最低でも以下の許可が必要になります。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecs:ExecuteCommand",
"ssm:StartSession",
"ecs:DescribeTasks"
],
"Resource": "*"
}
]
}
タスクとサービスに対する ECS Execの有効化
実際に利用する方法を確認していきます。
まずは、タスク(スタンドアロンタスク)もしくはサービスレベルでECS Execを有効化します。
今回はサービスレベルで有効化を行います。
新規サービスを作成します。
マネージドコンソールからも作成できますが、以下AWS CLIコマンドでも作成が可能です。
自身の環境に置き換えて実行ください。
aws ecs create-service \
--cluster cluster-name \
--task-definition task-definition-name \
--enable-execute-command \
--service-name service-name \
--desired-count 1
既存の環境で実施する場合は、サービスの設定でECS Execが有効になっているか確認していきます。
aws ecs describe-services \ --cluster クラスター名 \ --services サービス名 | grep enableExecuteCommand
コマンド結果がtrueになっていれば有効化状態なので、問題ありません。
"enableExecuteCommand": true
もし、有効となっていない場合は有効にします。
aws ecs update-service \
--cluster クラスター名\
--service サービス名 \
--enable-execute-command | grep enableExecuteCommand
すでにタスクが存在している際にサービス設定を変更した場合、
既存のタスクには反映されませんのでタスクを新しく起動しましょう。
接続を試してみる
さて、準備ができたら接続をAWS CLIで行います。
コマンドは以下の通りです
aws ecs execute-command --cluster ecs-exec-test \
--task タスクARN \
--container コンテナ名 \
--interactive \
--command "/bin/sh" \
コンテナ名やタスクARNはマネージドコンソールか、以下のコマンドで確認できます。
タスク一覧取得
aws ecs list-tasks --cluster ecs-exec-test --query "taskArns[]" --output text
コンテナ名取得
aws ecs describe-tasks --cluster ecs-exec-test --tasks [タスクARN] --query "tasks[].containers[].name" --output text
ECS Execコマンドで接続を試し、プロンプトが変われば接続できたことになります。
❯ aws ecs execute-command --cluster ecs-exec-test \
--task xxxxx \
--container xxxx \
--interactive \
--command "/bin/sh" \
--profile
The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.
Starting session with SessionId: ecs-execute-command-04a978a2ab36a1b6a
#
# hostname
ip-xxx-xx-xx-111.ap-northeast-1.compute.internal
最後に
いかがでしたでしょうか。
ECS Execは便利な機能と感じましたので、運用面で利用していきたいですね。
ECS Execで実行されるコマンドはrootとして実行されます。
接続におけるアクセス制御はポリシーに沿って確実に行いたいですね。
Tips
ECS Execがなかなか接続できない場合
ECS Execチェッカーと呼ばれるツールが用意されています。
接続できない場合は、以下のツールを使用してみましょう。
推奨となるタスク定義のパラメータ
ExcuteCommandで実行したコマンドがゾンビプロセスなった場合に、
initProcessEnabledをtrueにすることでSSM Agentのプロセスが削除されます。
公式ドキュメントのサンプルタスク定義を記載しておきます。
{
"taskRoleArn": "ecsTaskRole",
"networkMode": "awsvpc",
"requiresCompatibilities": [
"EC2",
"FARGATE"
],
"executionRoleArn": "ecsTaskExecutionRole",
"memory": ".5 gb",
"cpu": ".25 vcpu",
"containerDefinitions": [
{
"name": "amazon-linux",
"image": "amazonlinux:latest",
"essential": true,
"command": ["sleep","3600"],
"linuxParameters": {
"initProcessEnabled": true
}
}
],
"family": "ecs-exec-task"
参考
島村 輝 (Shimamura Hikaru) 記事一覧はコチラ