[アップデート]ECS Service Connectのタイムアウト値を設定できるようになりました

2024.01.23

こんにちは、岩城です。

本日、タイトルのアップデートがありましたので紹介します。

忙しい方向けまとめ

  • ECS Service Connectは、ECS Service間の通信を実現するサービス
  • ECS Service間の通信方法としては他に、ALB、Service Discovery、App Meshがあるが、Service Connectはre:Invent 2022で発表された後発のサービス
  • これまでService Connectのクライアント/サーバー設定のアイドルタイムアウトはデフォルト15秒であり変更できなかった
  • 今回のアップデートにより、アイドルタイムアウトを変更できるようになった
  • デフォルト値は、タスク定義>コンテナ定義>ポートマッピングのアプリケーションプロトコルの設定に応じ、それぞれ以下のとおり
    • None:3600秒
    • HTTP/HTTPS/GRPC:300秒
  • HTTP/HTTPS/GRPCではアイドルタイムアウトだけでなく、リクエストタイムアウトの設定も可能
    • デフォルト15秒
  • タイムアウトの上限はドキュメント上定義なし
  • アイドルタイムアウトは、アクティブなストリームがない場合に接続が終了する時間
  • リクエストタイムアウトは、クライアント/サーバーアプリケーションが応答するまでの待機時間
  • タイムアウト値が延長できることによる長時間実行されるリクエストを処理するアプリケーションのサポートに期待
  • CloudFormationでサポート済み

Service Connectとは

Service Connectについては、以下のエントリで詳細に解説されていますのでご確認ください。

これまでタイムアウト値を変更できなかった

本エントリ執筆時点の日本語公式ドキュメントには、以下の通り変更できないとあります。

このため、長時間実行するリクエストを処理するアプリケーションでは、タイムアウト15秒が影響してService Connectを採用できないケースがありました。

今回のアップデートにより、クライアント/サーバー設定のアイドルタイムアウトが変更できるようになりました。ドキュメントを確認する限り明確な上限の定義はありませんでしたので、タイムアウト値による影響は基本的になくなりそうです。

やってみた

アプリケーションプロトコルNone HTTP HTTPS GRPCそれぞれを設定したタスク定義を用意しました。

各タスク定義を使用したService Connectの設定をマネジメントコンソールで確認しました。

Noneの場合は、アイドルタイムアウトがデフォルト3600秒で設定されるようになっていました。

ドキュメントに上限値の記述がなかったので適当に200000秒にしても設定できました。

本エントリ執筆時点では、マネジメントコンソール上でタイムアウト値を確認することはできませんでした。

また、本エントリ執筆時点ではAWS CLIv2ではサポートされていなかったので、AWS CLIv1で確認しました。

$ aws --version
aws-cli/1.32.25 Python/3.9.16 Linux/6.1.66-91.160.amzn2023.x86_64 exec-env/CloudShell botocore/1.34.25
$ aws ecs describe-services --cluster devio-dev-ecs-cluster --services devio-dev-ecs-service1
~省略~
                    "serviceConnectConfiguration": {
                        "enabled": true,
                        "namespace": "arn:aws:servicediscovery:ap-northeast-1:xxxxxxxxxxxx:namespace/ns-3abwb7futzu6hzy3",
                        "services": [
                            {
                                "portName": "nginx1",
                                "discoveryName": "nginx1",
                                "clientAliases": [
                                    {
                                        "port": 80,
                                        "dnsName": "nginx1.local"
                                    }
                                ],
                                "timeout": {
                                    "idleTimeoutSeconds": 200000
                                }
                            }
                        ]
                    },
~省略~

HTTP/HTTPS/GRPCの場合、アイドルタイムアウトがデフォルト300秒、リクエストタイムアウトがデフォルト15秒で設定されるようになっていました。

$ aws ecs describe-services --cluster devio-dev-ecs-cluster --services devio-dev-ecs-service3
~省略~
                    "serviceConnectConfiguration": {
                        "enabled": true,
                        "namespace": "arn:aws:servicediscovery:ap-northeast-1:xxxxxxxxxxxx:namespace/ns-3abwb7futzu6hzy3",
                        "services": [
                            {
                                "portName": "nginx1",
                                "discoveryName": "nginx3",
                                "clientAliases": [
                                    {
                                        "port": 80,
                                        "dnsName": "nginx3.local"
                                    }
                                ],
                                "timeout": {
                                    "idleTimeoutSeconds": 3600,
                                    "perRequestTimeoutSeconds": 3600
                                }
                            }
                        ]
                    },
~省略~

CloudFormationでもサポート済みであることを確認しており 、以下のような記述でデプロイできました。

  ECSService:
    Type: AWS::ECS::Service
    Properties:
~省略~
      ServiceConnectConfiguration:
        Enabled: true
        Namespace: devio
        Services:
          - ClientAliases:
            - Port: 80
              DnsName: nginx.local
            DiscoveryName: nginx
            PortName: nginx
            Timeout:
              IdleTimeoutSeconds: 3600
              PerRequestTimeoutSeconds: 3600
~省略~

AWS::ECS::Service ServiceConnectService > Timeout

おわりに

タイムアウト値が延長できることによって、長時間実行されるリクエストを処理するアプリケーションをService Connectがサポートできるアップデートでした。

タイムアウト値が延長できないことでService Connectの採用を見送っていた場合、採用の再検討をしてみると良いかも知れません。

本エントリがどなたかのお役に立てれば幸いです。