ECS execでFargateのコンテナにアクセスする方法

AWS IT

こんにちは。れいです。

最近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/