CloudFormationでECS更新速度に関連した設定を操作する

ECSのConnectionDraining用設定をCloudFormationテンプレートにて行う際、どういったKey-Valueの構成をどの要素に追加すればよいのかをまとめました。
2020.01.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

担当プロジェクトにてECSの更新に掛かる時間で超過気味の傾向があり、時間短縮を検討してみました。5〜10分程度かかるのはやむなしとしても、1回20分程度まで伸びることもある状態です。

更新プロセスの問題も考えられますが、AWSナレッジセンターに該当するトラブルシューティング内容があり、用いているCFnのテンプレートに幾つか項目を調整することで対処できる可能性を知りました。

コンテナインスタンスが DRAINING に設定されているときに停止が遅れる Amazon ECS タスクのトラブルシューティング

実際にどのあたりの項目かを調べてみましたが、同等の問題にあたった幾つかのブログ記事は管理コンソールでの解説が主でした。そこで、実際のkey設定箇所及びResourceにつけるべきかを調べた結果についてまとめました。なお、今回はFargateタイプが対象となります。

検討内容

AWSナレッジセンターの記事から、今回検討できる項目は以下の2つです。

  • DeploymentConfiguration パラメータが正しく設定されていることを確認する
  • 登録解除の遅延値が正しく設定されていることを確認する

ECS_CONTAINER_STOP_TIMEOUTについてはFargateでは利用不可能な点で除外しています。

DeploymentConfiguration

対象となるのはAWS::ECS::ServiceDeploymentConfiguration

AWS::ECS::Service DeploymentConfiguration - AWS CloudFormation

DeploymentConfiguration詳細は、以下の図解記事が分かりやすいと思います。

ECSでコンテナのrolling update - Carpe Diem

MinimumHealthyPercentの初期値は100%、MaximumPercentの初期値は200%のため、初期は時短優先設定となります。

    Type: AWS::ECS::Service
      DeploymentConfiguration:
        MinimumHealthyPercent: 100
        MaximumPercent: 200

設定値は検証時に使っていたもので、特に最適というものではありません。

登録解除の遅延値

デプロイ時のライフサイクル設定を変更します。登録解除の遅延値を上げましたが、ヘルスチェックも含めて手を入れています。

設定に伴って影響がでる箇所については、以下の記事が分かりやすいと思います。

AWS CodeDeployの速度改善(ALB) - Qiita

ヘルスチェックにて今回触れるのは以下の項目です。

HealthCheckIntervalSeconds

個々のターゲットのヘルスチェックの概算間隔 (秒単位)。範囲は 5~300 秒です。ターゲットタイプが instance または ip の場合のデフォルトは 30 秒で、ターゲットタイプが lambda の場合のデフォルトは 35 秒です。

HealthCheckTimeoutSeconds

ヘルスチェックを失敗と見なす、ターゲットからレスポンスがない時間 (秒単位)。範囲は 2~120 秒です。ターゲットタイプが instance または ip の場合のデフォルトは 5 秒で、ターゲットタイプが lambda の場合のデフォルトは 30 秒です。

UnhealthyThresholdCount

ターゲットが異常であると見なされるまでに必要なヘルスチェックの連続失敗回数。範囲は 2~10 です。デフォルトは 2 です。

Groupからの登録解除遅延についてはTargetGroupAttributesにてderegistration_delay.timeout_secondsをKey-Valueの組み合わせで登録します。

deregistration_delay.timeout_seconds

登録解除するターゲットの状態が draining から unused に変わるのを Elastic Load Balancing が待機する時間 (秒単位)。範囲は 0 ~ 3600 秒です。デフォルト値は 300 秒です。ターゲットが Lambda 関数である場合、この属性はサポートされません。

公式ドキュメント上では以下の項目にて詳細が掲載されています。

ターゲットグループのヘルスチェック - Elastic Load Balancing AWS::ElasticLoadBalancingV2::TargetGroup TargetGroupAttribute - AWS CloudFormation

   Type: AWS::ElasticLoadBalancingV2::TargetGroup
     Properties:
       HealthCheckIntervalSeconds: 5
       HealthCheckTimeoutSeconds: 5
       UnhealthyThresholdCount: 2
       TargetGroupAttributes:
         - Key: deregistration_delay.timeout_seconds
           Value: '50'

設定値は検証時に使っていたもので、特に最適というものではありません。

あとがき

管理コンソール上の設定とCFn上の項目の一致と、単純にKey-Valueとして設定すればよいのか、listとして組むのかを只管検証して進めました。CFnで済ませる場合の方法まで直ぐにはたどり着き難かったため、参考になると幸いです。