猫でもわかるWebプログラミングと副業

本業エンジニアリングマネージャー。副業Webエンジニア。Web開発のヒントや、副業、日常生活のことを書きます。

AWS ECS + Fargate の ECS Exec で An error occurred (TargetNotConnectedException)

ECS Exec で An error occurred (TargetNotConnectedException)

ECS + Fargate の構成で、 ECS Exec を使ったときに、以下のエラーが出る場合がある。

An error occurred (TargetNotConnectedException) when calling the ExecuteCommand operation: The execute command failed due to an internal error. Try again later.

AWSの設定ミスなどは全部このエラーになるため、何がエラーになっているかわからない。

Try again later. と言われているが、殆どの場合は設定ミスのため、Try again しても勝手に復旧することはない。

Amazon ECS Exec Checker でトラブルシューティング

エラーでぐぐると以下の記事がヒットした。 ECS Exec Checker というものがあるようだ。しかし、結果が分かりづらかったため、ECS Exec Checker の結果の各項目について説明する。

jpdebug.com

コマンドの実行には jq コマンドが必要なのでインストールしておく。

brew install jq

実行例

実行すると、エラー箇所が赤く、Warning が黄色で表示される。

$ ./check-ecs-exec.sh <クラスター名> <タスクID>
-------------------------------------------------------------
Prerequisites for check-ecs-exec.sh v0.7
-------------------------------------------------------------
  jq      | OK (/opt/homebrew/bin/jq)
  AWS CLI | OK (/opt/homebrew/bin/aws)

-------------------------------------------------------------
Prerequisites for the AWS CLI to use ECS Exec
-------------------------------------------------------------
  AWS CLI Version        | OK (aws-cli/2.6.0 Python/3.9.12 Darwin/21.4.0 source/arm64 prompt/off)
  Session Manager Plugin | OK (1.2.295.0)

-------------------------------------------------------------
Checks on ECS task and other resources
-------------------------------------------------------------
Region : ap-northeast-1
Cluster: xxxxxxxx
Task   : a9a7de33ebdb42dd9e8ef840d812f2fc
-------------------------------------------------------------
  Cluster Configuration  | Audit Logging Not Configured
  Can I ExecuteCommand?  | arn:aws:iam::236053997432:user/xxxxxxxx
     ecs:ExecuteCommand: allowed
     ssm:StartSession denied?: allowed
  Task Status            | RUNNING
  Launch Type            | Fargate
  Platform Version       | 1.4.0
  Exec Enabled for Task  | OK
  Container-Level Checks |
    ----------
      Managed Agent Status
    ----------
         1. RUNNING for "php"
         2. RUNNING for "nginx"
    ----------
      Init Process Enabled (xxxxxxxx:47)
    ----------
         1. Disabled - "nginx"
         2. Disabled - "php"
    ----------
      Read-Only Root Filesystem (xxxxxxxx:47)
    ----------
         1. Disabled - "nginx"
         2. Disabled - "php"
  Task Role Permissions  | arn:aws:iam::236053997432:role/XxxxxRole
     ssmmessages:CreateControlChannel: allowed
     ssmmessages:CreateDataChannel: allowed
     ssmmessages:OpenControlChannel: allowed
     ssmmessages:OpenDataChannel: allowed
  VPC Endpoints          |
    Found existing endpoints for vpc-0e1a2c059e33c9a70:
      - com.amazonaws.ap-northeast-1.ecr.api
      - com.amazonaws.ap-northeast-1.ecr.dkr
      - com.amazonaws.ap-northeast-1.ssmmessages
  Environment Variables  | (xxxxxxxx:47)
       1. container "nginx"
       - AWS_ACCESS_KEY: not defined
       - AWS_ACCESS_KEY_ID: not defined
       - AWS_SECRET_ACCESS_KEY: not defined
       2. container "php"
       - AWS_ACCESS_KEY: not defined
       - AWS_ACCESS_KEY_ID: not defined
       - AWS_SECRET_ACCESS_KEY: not defined

各項目の説明

Prerequisites for check-ecs-exec.sh

そもそも check-ecs-exec コマンドを実行するのに必要なライブラリがインストールされているかを確認してくれている

Prerequisites for the AWS CLI to use ECS Exec

ECS Exec を実行するためには、バージョン 2.4.1 以降の AWS CLI と、 Session Manager Plugin が必要なため、バージョンのチェックをしてくれている。

Cluster Configuration

ちゃんと調べてないけど、あんま機にしなくて良い

Can I ExecuteCommand?

AWS CLI を実行しているユーザーに、 ECS Exec の権限が与えられているかどうかをチェックしている。

ecs:ExecuteCommand が allowed になっていない場合は、AWS IAMアカウントに権限が付与されていないでの、付与する必要がある。

ssm:StartSession denied? については、 denied が推奨とのこと。allowed になっていても ECS Exec 自体は問題なく動くが、 Warning になる。

詳細は AWS ドキュメントを見ると良い。

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/userguide/ecs-exec.html

Task Status

そもそも、ECS のタスクが正常に動いているかどうかを確認する

Launch Type, Platform Version

Launch Type は Fargate または EC2 のいずれか

Fargate の場合、 ECS Exec を実行するためには、 Platform Version は 1.4.0 以降でないといけない。

Exec Enabled for Task

タスクの設定で、ECS Exec が有効になっているかどうかを返す。

無効になっている場合は、 enableExecuteCommand を true に設定して上げる必要がある。

Managed Agent Status

ECS Exec を実行するためには、コンテナで Managed Agent が実行されている必要がある。

RUNNING になっていれば問題無い。

Init Process Enabled

ECS Exec している際、操作ミスなどで Docker のメインプロセスを終了しても、コンテナがゾンビ化するのを防ぐための設定。

Allowed が推奨だが、 Disabled になっていても、 ECS Exec を実行することはできる。

Read-Only Root Filesystem

Read-Only Root Filesystem が Enabled になっていると、 ECS Exec が実行できない。

Read-Only Root Filesystem は、 Docker コンテナのファイルの書き込みができなくなるという設定。 Disabled 担っていれば問題ない。

Task Role Permissions

ECS のタスクに、 ECS Exec を実行するのに必要なポリシーがアタッチされているかどうかを確認してくれる。

必要なポリシーについてはこの辺も合わせて読むとよい。

dev.classmethod.jp

VPC Endpoints

ECS Exec を実行するために必要な VPC Endpoint の設定がされているかどうかを確認してくれる。

この辺を参考

qiita.com

Environment Variables

ここに出力されている環境変数が設定されていると、ECS Exec の環境変数と衝突して、ECS Exec が正常に動作しない。

not defined になっていれば問題ない

defined になっていると、黄色(Warning)で表示されるが、たいてい ECS Exec が動かないので、名前を変えたり、環境変数を削除する必要がある。