はじめに
ECS Execの機能を使って、Fargateのコンテナにアクセスする方法を記載します。
ECS Execによるコンテナへのアクセスは、以下の4つを行うことで実行できます。
-
クライアントサーバーには、ECS Exec コマンドを実行するための AWS CLI がインストールされていること
-
クライアントサーバーには、AWS CLI 用の
Session Manager plugin
がインストール -
enable-execute-command
を使い、Fargateのタスク定義のenableExecuteCommand
を有効にすることで、ECS Exec の機能が有効になります。 -
コンテナがSystems Managerと連携するため、FargateのタスクロールにIAM権限を付与します。
下記に記事に、詳細な理由が記載されています。
ECS Exec 機能には、マネージド型 SSM エージェント (execute-command エージェント) と SSM サービス間の通信に必要なアクセス許可をコンテナに付与するためのタスク IAM ロールが必要です。
構築図
今回は、EC2を踏み台サーバーとして使い、Systems Manager の Session Manager 経由で、execute-command
を用いて、コンテナにアクセスします。
EC2には、Systems Manager の Session Managerを使用するため、Session Manager plugin
のインストールが必要です。
踏み台サーバーではなく、ローカルPCから直接コンテナにアクセスする場合、こちらの記事を参考にしてください
流れ
- IAMポリシーとロール作成
- EC2にSession Manager pluginをインストール
- ECSのタスクロールにIAM権限を付与
- ECSのサービスにECS Execの機能を有効にする
- Fargateのコンテナにアクセス
前提条件
-
ECS作成済み
WordPressFargateの作成方法はこちら
Fargate+WordPress構築 -
Fargate プラットフォームバージョン 1.4.0
-
コマンドは全て、踏み台サーバーで実行します。
IAMポリシーとロール作成
以下のようにロールを作成します。
IAMロール名 | ポリシー | 付与先サービス | 目的 |
---|---|---|---|
ECS-Exec-Fargate-role | ECS-Exec-Fargate | ECS | コンテナにアクセスするためには execute-command を用いて、SSM サービス間の通信が必要なため |
ECS-Exec-EC2-role | Amazon ECS_FullAccess | EC2 | ECS execを利用しECSにアクセスするため |
ECS-Exec-Fargate
という名前のIAMポリシーを作成します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"ssmmessages:CreateDataChannel",
"ssmmessages:OpenDataChannel",
"ssmmessages:OpenControlChannel",
"ssmmessages:CreateControlChannel"
],
"Resource": "*"
}
]
}
ECS-Exec-Fargate-role
のロールを作成します。
-
ユースケースの選択
:ECS
のElastic Container Service Task
先程作成したECS-Exec-Fargate
ポリシーをアタッチします。
次に、Amazon ECS_FullAccess
管理ポリシーを付与したECS-Exec-EC2-role
を作成し、EC2にIAMロールを付与します。
EC2にSession Manager plugin
をインストール
ECS Exec コマンドを実行するための AWS CLI がインストールされていること必須なため、CLIが以下の条件に当てはまるか確認します。
AWS CLI v1 バージョン 1.19.28以上
or
AWS CLI v2 バージョン 2.1.31以上
踏み台サーバーのEC2にSSH接続し、以下のコマンドで確認します。
$ aws --version
aws-cli/1.18.147 Python/2.7.18 Linux/4.14.246-187.474.amzn2.x86_64 botocore/1.18.6
バージョンが当てはまらないので、CLIの最新版をインストールしましょう。
$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ sudo ./aws/install
$ aws --version
aws-cli/1.18.147 Python/2.7.18 Linux/4.14.246-187.474.amzn2.x86_64 botocore/1.18.6
バージョンが変わっていないため、再起動後SSH接続し、バージョンを確認します
$ sudo reboot
$ aws --version
aws-cli/2.3.0 Python/3.8.8 Linux/4.14.248-189.473.amzn2.x86_64 exe/x86_64.amzn.2 prompt/off
バージョンが最新になりました。
Session Manager プラグインをインストールしましょう!
$ curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/linux_64bit/session-manager-plugin.rpm" -o "session-manager-plugin.rpm"
$ sudo yum install -y session-manager-plugin.rpm
$ session-manager-plugin
The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.
インストールできました。
ECSのタスクロールにIAM権限を付与
コンテナがSystems Managerと連携するため、FargateのタスクロールにIAM権限を付与します。
タスク定義のタスクロールにECS-Exec-Fargate-role
を選択し、サービスを更新します。
サービスを最新バージョンに更新して、タスクを立ち上げましょう。
タスクロールとタスク実行ロールの違いについて
タスク実行ロール
は、ECSコンテナエージェントがECRからのコンテナイメージプルや、コンテナログをCloudWatchに送信するためIAMポリシーが必要となります。
対して、タスクロール
は、コンテナが他のAWSサービスと連携する際にのみ、必要なIAMポリシーを設定します。
今回であれば、コンテナがSystems Manager
と連携するため、タスクロール
に権限を付与したということになります。
ECSのサービスにECS Execの機能を有効にする
enable-execute-command
を用いて、enableExecuteCommand
を有効にすることで、ECS Exec の機能を有効にすることができます。
タスクが立ち上がっていることを確認し、以下のコマンドを実施しましょう。
成功すると、長文の結果が返ってきますので、エンターを押し続けてください。
$ aws ecs update-service \
--cluster クラスター名 \
--service サービス名 \
--enable-execute-command
#省略(結果は長いです。エンターを押し続けましょう)
"enableExecuteCommand": true
}
}
もしくは以下のコマンドでも、Exec の機能が有効どうか確認できます。
true
と返ってきたら、有効ということです。
$ aws ecs describe-services --cluster クラスター名 --services サービス名 | jp.py 'services[].enableExecuteCommand'
[
true
]
エラー集
以下のようなエラーが出た場合、サービスの実行ロールにECS-Exec-Fargate-role
を付与し、そのサービスを更新していない可能性があります。
または、FargateのIAMポリシーが不適切、もしくはEC2にECS-Exec-EC2-role
を付与していないことも考えられます。
$ aws ecs update-service \
--cluster クラスター名 \
--service サービス名\
--enable-execute-command
An error occurred (InvalidParameterException) when calling the UpdateService operation: The service couldn't be updated because a valid taskRoleArn is not being used. Specify a valid task role in your task definition and try again.
Fargateのコンテナにアクセス
まず、起動しているタスクを全て停止し、再度タスクを起動します。
そして、execute-command
を使い、コンテナにアクセスします。
タスクID
は、稼働中(Running)のものに限ります。
$ aws ecs execute-command \
--cluster クラスター名 \
--task タスクID \
--container コンテナ名 \
--interactive \
--command "/bin/sh"
The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.
Starting session with SessionId:
コンテナにアクセスできました!!
エラー集
ECS Execの機能を有効にしていない場合に、execute-command
を使用すると以下のエラーが起きます。
有効にし、サービスを更新し、タスクを再起動しましょう。
$ aws ecs execute-command \
--cluster クラスター名 \
--task タスクID \
--container コンテナ名 \
--interactive \
--command "/bin/sh"
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.
参考