こんにちは。れいです。
最近Fargateの勉強をしているのですが、ECS Exec機能を使うことでFargateのコンテナにアクセスできるとのことだったので、実際に試してみました。
準備
AWS CLIの導入
設定やFargateへのアクセスを行うため、AWS CLIの導入が必要です。
以下を参考にAWS CLIを導入しましょう。
- https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2.html
Macの場合は以下のコマンドで導入できます。
$ curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
$ sudo installer -pkg AWSCLIV2.pkg -target /
Session Manager Pluginの導入
Fargateへのアクセスを行うため、Session Manager Pluginの導入が必要です。
以下を参考にSession Manager Pluginを導入しましょう。
- https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html
Macの場合は以下のコマンドで導入できます。
インストーラのダウンロード
$ curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac/session-manager-plugin.pkg" -o "session-manager-plugin.pkg"
インストールコマンドの実行
$ sudo installer -pkg session-manager-plugin.pkg -target /
$ ln -s /usr/local/sessionmanagerplugin/bin/session-manager-plugin /usr/local/bin/session-manager-plugin
Session Manager Pluginのインストール確認
$ session-manager-plugin
The Session Manager plugin is installed successfully. Use the AWS CLI to start a session.
設定
SSMセッションマネージャー関連の権限を付与したIAMロール (ECSタスクロール) を用意
以下のポリシーを使用して、タスクIAMロールを作成します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssmmessages:CreateControlChannel",
"ssmmessages:CreateDataChannel",
"ssmmessages:OpenControlChannel",
"ssmmessages:OpenDataChannel"
],
"Resource": "*"
}
]
}
以下の「タスク用の IAM ロールとポリシーの作成」を参考に、上記のポリシーを用いてタスクIAMロールを作成します。
- https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task-iam-roles.html
ECSタスクロールを用いてECSタスク定義を新規作成または更新する
ここでは、マネジメントコンソールでECSタスク定義を更新する方法を紹介します。
ECSの「タスク定義」からタスク定義を選択します。
タスク定義名を選択します。
「新しいリビジョンの作成」を選択します。
「タスクロール」で先ほど作成したロールを選択します。(私の場合はECSExecRoleという名前で作成しています)
「enableExecuteCommand」の設定を有効にする
ECS ECS Execを利用するために「enableExecuteCommand」の設定を有効にします。
まずは以下のコマンドで設定を確認します。
$ aws ecs describe-services \
--cluster [クラスター名] \
--service [サービスー名] \
すると、以下のような結果が返ってきて、"enableExecuteCommand": false
となっていることが確認できます。
{
"services": [
{
・・・(中略)・・・
"enableExecuteCommand": false
}
]
}
これをtrue
に設定するために、以下のコマンドを実行します。
$ aws ecs update-service \
--cluster [クラスター名] \
--service [サービスー名] \
--enable-execute-command
すると、以下のような結果が返ってきて、"enableExecuteCommand": true
となっていることが確認できます。
{
"services": [
{
・・・(中略)・・・
"enableExecuteCommand": true
}
]
}
上記コマンドを入力した際に以下のエラーが出る場合は、「ECSタスクロールを用いてECSタスク定義を新規作成または更新する」でECSタスクロールの割り当てが出来ていない可能性が高いため、確認しましょう。
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.
ECSタスク定義を使って、ECSサービスを作成または更新する
ECSタスク定義を用いて、ECSサービスを作成または更新します。
今回は、マネジメントコンソールを用いてECSサービスを更新してみます。
ECS→クラスター→「クラスター名」を選択→サービス名を選択→「更新」を選択します。
「ステップ1:サービスの設定」で、先ほど作成タスク定義のリビジョンを選択します。
他は特に変更しないで、サービスの更新をすすめます。
以下のように、タスク定義のリビジョンが更新されていることを確認します。
コマンドを実行してみる
ここまでで準備が整ったので、実際にFargateにアクセスしてみます。
ls
コマンドを実行したい場合は、以下のコマンドで入力します。
$ aws ecs execute-command \
--cluster [クラスター名] \
--task XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX \
--container [コンテナ名] \
--interactive \
--command "ls"
上記のtaskとcontainerはそれぞれ以下で確認できます。
task
:
ECSのマネジメントコンソールで「クラスター」からクラスターを選択→「タスク」タブを選択→「タスク」列のid
container
:
以下のコマンドで確認できます。
$ aws ecs describe-tasks \
--cluster [クラスター名] \
--task XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX \
{
"tasks": [
{
・・・(中略)・・・
"containers": [
{
・・・(中略)・・・
"name": "[コンテナ名]",
以下のようにls
コマンドの実行結果が返ってくればOKです。
The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.
Starting session with SessionId: ecs-execute-command-XXXXXXXXXXXXXXXXX
bin docker-entrypoint.d home managed-agents opt run sys var
boot docker-entrypoint.sh lib media proc sbin tmp
dev etc lib64 mnt root srv usr
Exiting session with sessionId: ecs-execute-command-XXXXXXXXXXXXXXXXX.
次に、シェルにログインしています。
$ aws ecs execute-command \
--cluster [クラスター名] \
--task XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX \
--container [コンテナ名] \
--interactive \
--command "bin/bash"
以下のようにシェルにログインできていればOKです。
The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.
Starting session with SessionId: ecs-execute-command-XXXXXXXXXXXXXXXXX
root@ip-xx-xxx-xxx-xxx:/#
参考
- https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/ecs-exec.html
- https://dev.classmethod.jp/articles/ecs-exec/