Closed7
[AWS] ECS on EC2でデプロイしたコンテナにシェルアクセスする方法調査

はじめに
ECS on EC2でデプロイしたコンテナ内を確認したく、コンテナにシェルアクセスしたい。
必要な機能や手順について確認進める。
調査環境
- ECSの構成: ECS on EC2
- EC2のインスタンス:Amazon Linux2[1]
- EC2のインスタンスタイプ: t2.xlarge
- システム構成: PuclicSubnetに対して、PublicIPを有効にしたEC2インスタンスを配置
-
ECSクラスター作成時に「Amazon Linux2」を選択。AMIは右記が作成された:amzn2-ami-ecs-hvm-2.0.20250113-x86_64-ebs(ami-0a24dd0a1f711c291) ↩︎

予備知識
- コンテナにアクセスするには「ECS Exec」を利用する(以下、公式ドキュメント引用)
Amazon ECS Exec を使用すれば、最初にホストコンテナのオペレーティングシステムとやり取りしたり、インバウンドポートを開いたり、SSH キーを管理したりすることなく、コンテナと直接やり取りできます。
ECS Exec を使用して、Amazon EC2 インスタンスまたは AWS Fargate で実行されているコンテナでコマンドを実行したり、シェルを取得したりできます
事前準備
公式ドキュメントや参考サイトを参考にすると以下が必要になりそう
- インスタンスロール(IAMロール)に対して、SSM接続許可(IAMポリシー)を追加(※公式外の作業)
- タスクロール(IAMロール)に対して、ECS Execのアクセス許可(IAMポリシー)を追加
- AWS CLIのインストール
- AWS CLI 用のSession Manager pluginのインストール[1]
公式ドキュメント
-
公式ドキュメントには「ECS optimized AMI を利用する場合は既に含まれているため追加対応不要」の様な記載あったが、実際に起動されたインスタンスではコマンドインストールされていなかった ↩︎

インスタンスロールに対して、SSM接続許可を追加(※公式外の作業)
IAMポリシーの追加
- 1、インスタンスロール(IAMロール)を表示
- 2、[許可を追加] > [ポリシーをアタッチ] 選択
- 3、「AmazonSSMManagedInstanceCore」をチェック > [許可を追加] 選択
EC2インスタンスへのSSM接続確認
- 1、ECSクラスターで作成されたインスタンス選択
- 2、[接続] > [セッションマネージャー]タブ > [接続] 選択
- 3、SSMでシェル画面が表示されたら完了

事前準備: タスクロールに対して、ECS Execのアクセス許可を追加する手順
ポリシー作成
- 1、IAMポリシーの新規作成画面表示
- 2、[JSON] タブ選択
- 3、以下内容をコピペして作成
※公式ドキュメントに則り、以下内容のポリシーをコピペした
IAMポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssmmessages:CreateControlChannel",
"ssmmessages:CreateDataChannel",
"ssmmessages:OpenControlChannel",
"ssmmessages:OpenDataChannel"
],
"Resource": "*"
}
]
}
ポリシーのアタッチ手順
- 1、対象となるタスクロールのIAMロール表示
- 2、[許可を追加]選択
- 3、「ポリシー作成」で作成したポリシーを追加
公式ドキュメント

事前準備:AWS CLIのインストール手順
EC2インスタンスアクセス
前述の手順参照: https://zenn.dev/link/comments/a422c41ad5aa08
「unzip」インストール
- 1、インストールコマンド実行
bash
sudo yum install -y unzip
- 2、インストール確認
bash
unzip --version
「AWS CLI」インストール
- 1、インストールコマンド実行
bash
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
- 2、インストール確認
bash
aws --version
公式ドキュメント

事前準備:AWS CLI 用のSession Manager pluginのインストール
1、インストールコマンド実行(Amazon Linux2の場合)
ターミナル
sudo yum install -y https://s3.amazonaws.com/session-manager-downloads/plugin/latest/linux_64bit/session-manager-plugin.rpm
2、インストール確認
ターミナル
session-manager-plugin
公式ドキュメント

コンテナに、シェルアクセスする
- コマンド実行
※各設定値はマネジメントコンソール上から確認した
(ECSクラスター、サービス、タスクの各詳細画面から確認)
bash
aws ecs execute-command \
--cluster {クラスター名} \
--task {タスクID} \
--container {コンテナ名} \
--interactive \
--command "/bin/sh"
- 上記コマンド実行後、正常に接続された
※シェルから抜ける時は「exit」と入力して抜ける
bash
The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.
Starting session with SessionId: ecs-execute-command-xxxxxxxxxxxxxx
#
#
# ls
bin boot dev docker-entrypoint.d docker-entrypoint.sh ecs-execute-command-xxxxxx-xxx-xxx-xxx-xxxxxxxxxxxxxx etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
#
シェルアクセス時の補足
私の環境と設定だと、シェルアクセス時にいくつかエラーが出た
「AccessDeniedException」エラー調査
エラー内容
bash
The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.
An error occurred (AccessDeniedException) when calling the ExecuteCommand operation: User: arn:aws:sts::xxxxxxxxxxxxxxx:assumed-role/ECSInstanceRole/i-xxxxxxxxxxxxxxx is not authorized to perform: ecs:ExecuteCommand on resource: arn:aws:ecs:ap-northeast-1:xxxxxxxxxxxxxxx:cluster/{クラスター名} because no identity-based policy allows the ecs:ExecuteCommand action
対応内容
- 一時的な対応として、ECSインスタンスロール(IAMロール)に対して、「AmazonECS_FullAccess」ポリシーを追加した
「InvalidParameterException」エラー調査
エラー内容
An error occurred (InvalidParameterException) when calling the ExecuteCommand operation: The execute command failed because execute command was not enabled when the task was run or the execute command agent isn’t running. Wait and try again or run a new task with execute command enabled and try again.
対応内容
- 「enableExecuteCommand」が有効になっているか確認(Falseだと無効になっている)
aws ecs describe-tasks \
--region {リージョン名} \
--cluster {クラスター名} \
--task {タスクID} \
| grep enableExecuteCommand
- 「enableExecuteCommand」を有効にする
※以下コマンド実行後に、タスクを再起動する
(タスクを一度「0」にした後、再度「1」にすることで新しいタスクを起動する)
aws ecs update-service \
--cluster {cluster名} \
--service {service名} \
--enable-execute-command
公式ドキュメント
その他参考
このスクラップは2025/01/19にクローズされました