Closed7

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

noknok

はじめに

ECS on EC2でデプロイしたコンテナ内を確認したく、コンテナにシェルアクセスしたい。
必要な機能や手順について確認進める。

調査環境

  • ECSの構成: ECS on EC2
  • EC2のインスタンス:Amazon Linux2[1]
  • EC2のインスタンスタイプ: t2.xlarge
  • システム構成: PuclicSubnetに対して、PublicIPを有効にしたEC2インスタンスを配置
脚注
  1. ECSクラスター作成時に「Amazon Linux2」を選択。AMIは右記が作成された:amzn2-ami-ecs-hvm-2.0.20250113-x86_64-ebs(ami-0a24dd0a1f711c291) ↩︎

noknok

予備知識

  • コンテナにアクセスするには「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]

公式ドキュメント

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs-exec.html
https://aws.amazon.com/jp/blogs/news/new-using-amazon-ecs-exec-access-your-containers-fargate-ec2/

脚注
  1. 公式ドキュメントには「ECS optimized AMI を利用する場合は既に含まれているため追加対応不要」の様な記載あったが、実際に起動されたインスタンスではコマンドインストールされていなかった ↩︎

noknok

インスタンスロールに対して、SSM接続許可を追加(※公式外の作業)

IAMポリシーの追加

  • 1、インスタンスロール(IAMロール)を表示
  • 2、[許可を追加] > [ポリシーをアタッチ] 選択
  • 3、「AmazonSSMManagedInstanceCore」をチェック > [許可を追加] 選択

EC2インスタンスへのSSM接続確認

  • 1、ECSクラスターで作成されたインスタンス選択
  • 2、[接続] > [セッションマネージャー]タブ > [接続] 選択
  • 3、SSMでシェル画面が表示されたら完了
noknok

事前準備: タスクロールに対して、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、「ポリシー作成」で作成したポリシーを追加

公式ドキュメント

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task-iam-roles.html#ecs-exec-required-iam-permissions

noknok

事前準備: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

公式ドキュメント

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/getting-started-install.html

noknok

事前準備: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

公式ドキュメント

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/install-plugin-verify.html

noknok

コンテナに、シェルアクセスする

  • コマンド実行
    ※各設定値はマネジメントコンソール上から確認した
    (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

公式ドキュメント

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ecs-exec.html#ecs-exec-best-practices-limit-access-execute-command

その他参考

https://qiita.com/kooohei/items/190802d07655809bd1bd
https://qiita.com/ritya/items/15f4a35d77566acff063

このスクラップは2025/01/19にクローズされました