9
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ECS Fargateのコンテナ内にECS Execでアクセスする方法 (踏み台EC2あり)

Last updated at Posted at 2021-10-24

はじめに

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 のインストールが必要です。

スクリーンショット 2021-10-25 23.10.37.png

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

https://qiita.com/holdout0521/items/261d06c3fb0c39b014e0

流れ

  1. IAMポリシーとロール作成
  2. EC2に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 サービス間の通信が必要なため
ECS-Exec-EC2-role Amazon ECS_FullAccess EC2 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-Fargate-roleのロールを作成します。

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

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

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

次に、Amazon ECS_FullAccess管理ポリシーを付与したECS-Exec-EC2-roleを作成し、EC2にIAMロールを付与します。

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

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

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を選択し、サービスを更新します。
スクリーンショット 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の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.

参考

9
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?