Fargateコンテナにシェルでアクセスしてみた -Amazon ECS Exec-


この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

お久しぶりです。株式会社協栄情報システム3部所属の寺尾です。

Fargateコンテナ上で原因不明のエラーが起きた際、結構困りますよね。
コンテナの中に入って原因を突き止めたくなります。
というわけで、今回はFargateコンテナにシェルでアクセスしましたのでそちらの方法の紹介をしようと思います。

それではよろしくお願いします。

目次

Amazon ECS Execを利用してFargateコンテナにアクセスします。
Amazon ECS ExecによるFargateコンテナへのアクセスは、タスクロールとコンテナ起動時のオプションを追加するだけで簡単にアクセスできるようになります。

今回は以下の手順で進めていきます。

  1. IAMroleの作成
  2. AWS CLI バージョン 2 のインストール
  3. Session Manager プラグインをインストール
  4. タスク定義とクラスターの作成
  5. コンテナの起動とアクセス

ECS Execについて
Amazon ECS で、Amazon EC2 または AWS Fargate で実行されているコンテナでのコマンドの実行が可能に

1. IAMroleの作成

今回利用するIAMロールは以下になります。
AWS Configureを利用し、EC2インスタンスに認証情報を書き込む場合はIRL-ECSaccessは不要です。(セキュリティ面から非推奨の方法です)

IAMロール名 付与先サービス 目的
IRL-Fagateaccess Elastic Container Service Task execute-command エージェントと
SSM サービス間の通信に必要なアクセス許可を
コンテナに付与するため
IRL-ECSaccess EC2 ECSの操作権限をEC2に与えるため

また、IAMロールに付与するIAMポリシーは以下になります。

IAMロール IAMポリシー
IRL-Fargateaccess IPL-Fagateaccess
IRL-ECSaccess AmazonECS_FullAccess
  • IPL-Fargateaccess
    {
    "Version": "2012-10-17",
    "Statement": [
       {
       "Effect": "Allow",
       "Action": [
            "ssmmessages:CreateControlChannel",
            "ssmmessages:CreateDataChannel",
            "ssmmessages:OpenControlChannel",
            "ssmmessages:OpenDataChannel"
       ],
      "Resource": "*"
      }
    ]
    }

1.サービス→IAM→ポリシー→ポリシーを作成から前述の設定に従ってポリシーを作成しましょう。

2.ロール→ロールを作成から前述の設定に従ってロールを作成しましょう。

file

2. AWS CLI バージョン 2 のインストール

今回はIRL-ECSaccessをアタッチしたAmazonLinux2を用意し、そちらからアクセスしていきます。
用意したAmazonLinux2にアクセスして必要なソフトをインストールしましょう。
まずはCLIのバージョンが

  • AWS CLI v1 バージョン 1.19.28以上
  • AWS CLI v2 バージョン 2.1.31以上
    である必要があるので、最新版をインストールします。

1.下記のコマンドでインストーラをダウンロードします。

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"

2.解凍コマンド

unzip awscliv2.zip

3.インストールします。

sudo ./aws/install

4.現在のバージョンを確認します。
もし最新版になっていなければ一度再起動をしてみましょう。

aws --version

3. Session Manager プラグインをインストール

1.下記のコマンドでプラグインをダウンロードします。

curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/linux_64bit/session-manager-plugin.rpm" -o "session-manager-plugin.rpm"

2.成功したら次のコマンドでインストールしましょう。

sudo yum install -y session-manager-plugin.rpm

3.次のコマンドでプラグインがインストールされたか確認できます。

session-manager-plugin

インストールに成功していた場合の結果は以下になります。

The Session Manager plugin is installed successfully. Use the AWS CLI to start a session.

4. タスク定義とクラスターの作成

設定項目 設定値
タスク定義名 任意
起動タイプ Fargate
タスクロール IRL-Fargateaccess
タスクメモリ 任意
タスクCPU 任意
コンテナ名 任意
イメージ 任意

1.サービス→Elastic Container Service→タスク定義→新しいタスク定義の作成から
上記の設定に従ってタスク定義を作成します。
今回は実験用ですのでメモリ、CPUは最小値で作成しました。
タスクロールさえIRL-Fargateaccessであればいいので既存のタスク定義を修正する形でも大丈夫です。


2.コンテナを追加します。
私はwordpress Official Imageを利用しました。

3.サービス→Elastic Container Service→クラスター→クラスターの作成から
ネットワーキングのみのクラスターを作成しました。
file
file
file

5. コンテナの起動とアクセス

1.「–enable-execute-command」オプションを付けてコンテナを起動しましょう。

  • サービスから起動するパターン

    aws ecs create-service \
    --cluster クラスター名 \
    --service-name サービス名 \
    --task-definition タスク定義名:バージョン \
    --desired-count 1 \
    --launch-type "FARGATE" \
    --network-configuration "awsvpcConfiguration={subnets=[サブネットID],securityGroups=[セキュリティグループID],assignPublicIp=ENABLED}" \
    --region リージョン名 \
    --enable-execute-command
  • サービスをアップデートするパターン(タスクは再デプロイが必要です)

    aws ecs update-service \
    --cluster サービス名 \
    --service fargateaccess \
    --enable-execute-command
        "enableExecuteCommand": true
  • タスクだけで起動するパターン

    aws ecs run-task \
    --cluster  クラスター名 \
    --task-definition タスク定義名:バージョン \
    --network-configuration "awsvpcConfiguration={subnets=[サブネットID],securityGroups=[セキュリティグループID],assignPublicIp=ENABLED}" \
    --enable-execute-command \
    --launch-type FARGATE \
    --platform-version '1.4.0' \
    --region リージョン名

2.以下のコマンドでコンテナにアクセスできます。

   aws ecs execute-command \
    --cluster  クラスター名 \
    --task タスクID \
    --container コンテナ名 \
    --interactive \
    --command "/bin/bash" 

3.以下の表示がされればアクセス成功です。

The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.

Starting session with SessionId: ecs-execute-command-07e2184e59094a847
root@ip-00-00-00-00:/var/www/html#

おわりに

ここまで読んでいただきありがとうございました。
間違いなどあればぜひご指摘ください。
この記事が誰かの助けとなれば幸いです。

参考

デバッグに Amazon ECS Exec を使用する

Last modified: 2024-02-06

Author