📚

ECS + Django + Nginx でECS Execがうまくいかなかった

2024/04/20に公開

ECS Exec自体は色々記事がありますが、An error occurred (TargetNotConnectedException) when calling the ExecuteCommand operation: The execute command failed due to an internal error. Try again later. のエラーが出て解決に少し手こずりましたので、まとめてみることにしました。

https://dev.classmethod.jp/articles/amazon-ecs-exec-checker-and-network-connectivity/

上記の記事など、参考にさせていただきました

確認したこと

  • ECSタスクロールにssmの権限がついているかどうか
  • ssm周りのエンドポイントが設定されているか
  • amazon-ecs-exec-checkerで引っかかっていないか
  • Reachability Analyzer で接続エラーが出ていないか

ロールの設定

以下の設定が問題なくされている

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

amazon-ecs-exec-checker

以下のコマンドを実行して確認

./check-ecs-exec.sh test-cluster xxxxxxxxxxxxxxxxxxxxxxxa

https://github.com/aws-containers/amazon-ecs-exec-checker

特に異常はなさそう

-------------------------------------------------------------
Prerequisites for check-ecs-exec.sh v0.7
-------------------------------------------------------------
  jq      | OK (/Users/test/opt/anaconda3/bin/jq)
  AWS CLI | OK (/usr/local/bin/aws)

-------------------------------------------------------------
Prerequisites for the AWS CLI to use ECS Exec
-------------------------------------------------------------
  AWS CLI Version        | OK (aws-cli/2.13.33 Python/3.11.6 Darwin/23.4.0 exe/x86_64 prompt/off)
  Session Manager Plugin | OK (1.2.553.0)

-------------------------------------------------------------
Checks on ECS task and other resources
-------------------------------------------------------------
Region : ap-northeast-1
Cluster: test-cluster
Task   : xxxxxxxxxxxxxxxxxxxxxxxa
-------------------------------------------------------------
  Cluster Configuration  |
     KMS Key       : Not Configured
     Audit Logging : DEFAULT
     S3 Bucket Name: Not Configured
     CW Log Group  : Not Configured
  Can I ExecuteCommand?  | arn:aws:iam::xxxxxxxxxxxxxx:user/test
     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 "test-app"
         2. RUNNING for "test-nginx"
    ----------
      Init Process Enabled (test-task:11)
    ----------
         1. Disabled - "test-nginx"
         2. Disabled - "test-app"
    ----------
      Read-Only Root Filesystem (test-task:11)
    ----------
         1. Disabled - "test-nginx"
         2. Disabled - "test-app"
  Task Role Permissions  | arn:aws:iam::xxxxxxxxxxxxx:role/ecs-task-role
     ssmmessages:CreateControlChannel: allowed
     ssmmessages:CreateDataChannel: allowed
     ssmmessages:OpenControlChannel: allowed
     ssmmessages:OpenDataChannel: allowed
  VPC Endpoints          | 
    Found existing endpoints for vpc-xxxxxxxxxxxxxx:
      - com.amazonaws.ap-northeast-1.ecr.dkr
      - com.amazonaws.ap-northeast-1.ecr.api
      - com.amazonaws.ap-northeast-1.s3
      - com.amazonaws.ap-northeast-1.logs
      - com.amazonaws.ap-northeast-1.ssmmessages
  Environment Variables  | (test-task:11)
       1. container "test-nginx"
       - AWS_ACCESS_KEY: not defined
       - AWS_ACCESS_KEY_ID: not defined
       - AWS_SECRET_ACCESS_KEY: not defined
       2. container "test-app"
       - AWS_ACCESS_KEY: not defined
       - AWS_ACCESS_KEY_ID: not defined
       - AWS_SECRET_ACCESS_KEY: not defined

Reachability Analyzer

  • パスの送信元
    • 送信元タイプ: Network Interfaces
    • 送信元: ECSタスクのENI
  • パスの送信先
    • 送信先タイプ: VPC Endpoints
    • 送信先: ssmmessages
  • 送信先ポート: 443

結論解決

ここまでやってもエラーが変わらずだったが、ECSの方再デプロイしたら反映され、問題なく接続ができた。ロールの設定など必要なものは基本的にデプロイしてチェックをしていたが、どこかで実施し忘れていたのかもしれない。ただここまでチェックしていれば、大方疎通はできるとは思いました。

Discussion