Amazon ECS Execを使ってみる

記事タイトルとURLをコピーする

こんにちは。島村です。

今更ではありますが、Amazon ECS Execを使う機会があったので
使用するまでの流れや概要など備忘録として記載したいと思います。

ECS Execの概要

ざっくりいうと、ECS Execはコンテナにログインできる機能です。
ECS Exec以前は、Fargateの起動タイプを選択している場合、コンテナにログインすることができませんでした。

ECS Execが登場したことで、ログインできるようになりました。
コンテナへログインできることで、トラブルシューティングに必要な情報がより得られることができます。

ECS Execの仕組み

ECS ExecはSystems Manager Session Managerの機能を利用して実現しています。
そのため、IAMによるコンテナへのログインアクセスを制御することも可能です。
なお、タスクにアタッチしているセキュリティグループのインバウンドルールにSSHポートを解放する必要もありません。

ECS Execは追加費用なしで利用が可能です。

前提条件

ECS Execを利用する上で必要な条件を見ていきます。
なお、今回の検証環境では、Fargateを利用します。

AWS CLIのインストールとセットアップ

導入がまだの場合は以下のドキュメントを参考にインストールしてみてください。
https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html

クレデンシャルの設定なども合わせて実施する必要があります。

Session Manager plugin for the AWS CLIのインストール

AWS CLIを利用し、Session Manager経由でSSM マネージドインスタンスに接続する場合は
接続元の端末にPluginをインストールする必要があります。
https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html

プラットフォームバージョンの確認

接続対象のコンテナをホストしているプラットフォームバージョンに指定があります。

  • EC2の場合
    2021/1/20にリリースされたAmazon ECS 最適化 AMI を、エージェントバージョン 1.50.2 以上で使用します

  • Fargateの場合
    プラットフォームバージョン 1.4.0 以上 (Linux) または 1.0.0 (Windows) を使用します

VPC Endpointの作成

プライベートな環境の場合、ssmmessagesのVPC Endpointが必要になります。
インターネットへアクセスできる場合は、特に必要ありません。

ECS Exec利用に必要な権限があるか確認

ECSのタスクロールに以下の権限が必要です。

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

AWS CLIで使用するクレデンシャルに紐づく権限は最低でも以下の許可が必要になります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecs:ExecuteCommand",
                "ssm:StartSession",
                "ecs:DescribeTasks"
            ],
            "Resource": "*"
        }
    ]
}

タスクとサービスに対する ECS Execの有効化

実際に利用する方法を確認していきます。
まずは、タスク(スタンドアロンタスク)もしくはサービスレベルでECS Execを有効化します。

今回はサービスレベルで有効化を行います。

新規サービスを作成します。
マネージドコンソールからも作成できますが、以下AWS CLIコマンドでも作成が可能です。
自身の環境に置き換えて実行ください。

aws ecs create-service \
    --cluster cluster-name \
    --task-definition task-definition-name \
    --enable-execute-command \
    --service-name service-name \
    --desired-count 1

既存の環境で実施する場合は、サービスの設定でECS Execが有効になっているか確認していきます。

aws ecs describe-services \
--cluster クラスター名 \
--services サービス名 | grep enableExecuteCommand

コマンド結果がtrueになっていれば有効化状態なので、問題ありません。

"enableExecuteCommand": true

もし、有効となっていない場合は有効にします。

 aws ecs update-service \                                                                                           
    --cluster クラスター名\
    --service サービス名 \
    --enable-execute-command | grep enableExecuteCommand

すでにタスクが存在している際にサービス設定を変更した場合、
既存のタスクには反映されませんのでタスクを新しく起動しましょう。

接続を試してみる

さて、準備ができたら接続をAWS CLIで行います。
コマンドは以下の通りです

 aws ecs execute-command --cluster ecs-exec-test \
    --task タスクARN \
    --container コンテナ名 \
    --interactive \
    --command "/bin/sh" \

コンテナ名やタスクARNはマネージドコンソールか、以下のコマンドで確認できます。

タスク一覧取得

aws ecs list-tasks --cluster ecs-exec-test --query "taskArns[]"  --output text

コンテナ名取得

aws ecs describe-tasks --cluster ecs-exec-test --tasks [タスクARN] --query "tasks[].containers[].name" --output text

ECS Execコマンドで接続を試し、プロンプトが変われば接続できたことになります。

❯ aws ecs execute-command --cluster ecs-exec-test \
    --task xxxxx \
    --container xxxx \
    --interactive \
    --command "/bin/sh" \
    --profile 

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


Starting session with SessionId: ecs-execute-command-04a978a2ab36a1b6a

# 
# hostname
ip-xxx-xx-xx-111.ap-northeast-1.compute.internal

最後に

いかがでしたでしょうか。
ECS Execは便利な機能と感じましたので、運用面で利用していきたいですね。
ECS Execで実行されるコマンドはrootとして実行されます。
接続におけるアクセス制御はポリシーに沿って確実に行いたいですね。

Tips

ECS Execがなかなか接続できない場合

ECS Execチェッカーと呼ばれるツールが用意されています。
接続できない場合は、以下のツールを使用してみましょう。

github.com

推奨となるタスク定義のパラメータ

ExcuteCommandで実行したコマンドがゾンビプロセスなった場合に、
initProcessEnabledをtrueにすることでSSM Agentのプロセスが削除されます。

公式ドキュメントのサンプルタスク定義を記載しておきます。

{
    "taskRoleArn": "ecsTaskRole",
    "networkMode": "awsvpc",
    "requiresCompatibilities": [
        "EC2",
        "FARGATE"
    ],
    "executionRoleArn": "ecsTaskExecutionRole",
    "memory": ".5 gb",
    "cpu": ".25 vcpu",
    "containerDefinitions": [
        {
            "name": "amazon-linux",
            "image": "amazonlinux:latest",
            "essential": true,
            "command": ["sleep","3600"],
            "linuxParameters": {
                "initProcessEnabled": true
            }
        }
    ],
    "family": "ecs-exec-task"

参考

docs.aws.amazon.com

島村 輝 (Shimamura Hikaru) 記事一覧はコチラ

最近ECS周りをキャッチアップ中。趣味は車・バイク全般。
一応、AWS12冠です。