2
Help us understand the problem. What are the problem?

posted at

updated at

ECS Fargateのコンテナ内にECS Execでアクセスする方法 (ローカルpcから)

はじめに

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 ロールが必要です。

構築図

今回は、ローカルPCから、Systems Manager の Session Manager 経由で、execute-commandを用いて、コンテナにアクセスします。
ローカルPCには、Systems Manager の Session Managerを使用するため、Session Manager plugin のインストールが必要です。

スクリーンショット 2022-03-30 0.04.00.png

ローカルPCではなく、踏み台サーバーを使いコンテナにアクセスする場合、こちらの記事を参考にしてください

https://qiita.com/drafts/0725a476f587e1d64253/

流れ

  1. IAMポリシーとロール作成
  2. ローカルPCにSession Manager pluginをインストール
  3. ECSのタスクロールにIAM権限を付与
  4. ECSのサービスにECS Execの機能を有効にする
  5. Fargateのコンテナにアクセス

前提条件

  • ECS作成済み
    WordPressFargateの作成方法はこちら
    Fargate+WordPress構築

  • Fargate プラットフォームバージョン 1.4.0

  • コマンドは全て、踏み台サーバーで実行します。

IAMポリシーとロール,ユーザーを作成

以下のようにロールを作成します。

IAMロール名 ポリシー 付与先サービス 目的
ECS-Exec-Fargate-role ECS-Exec-Fargate ECS コンテナにアクセスするためには execute-command を用いて、SSM サービス間の通信が必要なため
IAMユーザー名 ポリシー 目的
ECS-Exec-User ECS-Exec-from-pc ECS execを利用しECSにアクセスするため

ECS-Exec-Fargateという名前のIAMポリシーを作成します。

ECS-Exec-Fargate
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "ssmmessages:CreateDataChannel",
        "ssmmessages:OpenDataChannel",
        "ssmmessages:OpenControlChannel",
        "ssmmessages:CreateControlChannel"
      ],
      "Resource": "*"
    }
  ]
}

また、ECS-Exec-from-pcという名前のIAMポリシーを作成します。

ECS-Exec-Fargate
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "ecs:UpdateService",
        "ecs:ExecuteCommand",
        "ecs:DescribeTasks",
        "ecs:DescribeServices",
        "ecs:UpdateServicePrimaryTaskSet"
      ],
      "Resource": "*"
    }
  ]
}

ECS-Exec-Fargate-roleのロールを作成します。

  • ユースケースの選択ECSElastic Container Service Task
    先程作成したECS-Exec-Fargateポリシーをアタッチします。

スクリーンショット 2021-10-23 23.41.45.png

スクリーンショット 2021-10-24 11.55.00.png

次に、アクセスキーとシークレットキーを発行したIAMユーザーECS-Exec-Userを作成し、ECS-Exec-from-pcポリシーを付与します。

ローカルに、ecs-fargate-execという名前付きプロファイルを作成し、設定します。

ちなみに、pcはMacを使っています。

$ aws configure --profile ecs-fargate-exec
AWS Access Key ID [None]: xxxxx
AWS Secret Access Key [None]: xxxxx
Default region name [None]: ap-northeast-1
Default output format [None]: 

// credentials配下に保存されたか確認
$ cat ~/.aws/credentials 

[ecs-fargate-exec]
aws_access_key_id = AKIxxx
aws_secret_access_key = xxxxxxx

// 下記のコマンドに設定することで、すべてのコマンドでプロファイルを指定せずにすみます。
$ export AWS_PROFILE=ecs-fargate-exec

ローカルにSession Manager pluginをインストール

ECS Exec コマンドを実行するための AWS CLI がインストールされていること必須なため、CLIが以下の条件に当てはまるか確認します。

AWS CLI v1 バージョン 1.19.28以上
             or
AWS CLI v2 バージョン 2.1.31以上

ローカルPCに、以下のコマンドで確認します。

$ 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/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 プラグインをインストールしましょう!

$ cd /tmp
$ curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac/sessionmanager-bundle.zip" -o "sessionmanager-bundle.zip"
$ unzip sessionmanager-bundle.zip
$ sudo ./sessionmanager-bundle/install -i /usr/local/sessionmanagerplugin -b /usr/local/bin/session-manager-plugin


$ session-manager-plugin

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

インストールできました。

windosの場合

下記の記事通りに行ってください

ECSのタスクロールにIAM権限を付与

コンテナがSystems Managerと連携するため、FargateのタスクロールにIAM権限を付与します。

タスク定義のタスクロールにECS-Exec-Fargate-roleを選択し、サービスを更新します。
スクリーンショット 2021-10-24 11.56.43.png

サービスを最新バージョンに更新して、タスクを立ち上げましょう。

タスクロールとタスク実行ロールの違いについて

タスク実行ロールは、ECSコンテナエージェントがECRからのコンテナイメージプルや、コンテナログをCloudWatchに送信するためIAMポリシーが必要となります。

対して、タスクロールは、コンテナが他のAWSサービスと連携する際にのみ、必要なIAMポリシーを設定します。

今回であれば、コンテナがSystems Managerと連携するため、タスクロールに権限を付与したということになります。
スクリーンショット 2021-10-24 12.14.17.png

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もしくはローカルPCのIAMポリシーが不適切な可能性があります。

$ 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.

参考

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
2
Help us understand the problem. What are the problem?