EC2 インスタンス自動起動時エラー「Automation Step Execution fails when it is changing the state of each instance. Get Exception from StartInstances API of ec2 Service. …」を回避するには

2023.02.01

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

困っていること

AWS Systems Manager の一機能であるメンテナンスウィンドウから Runbook 「samplexxxxx-StartEC2Instance」を呼び出して EC2 インスタンスを自動起動してます。
以下のエラーが Runbook で時々発生しEC2 インスタンスの起動に失敗するので、原因と回避方法について教えてください。

Automation Step Execution fails when it is changing the state of each instance. Get Exception from StartInstances API of ec2 Service.
Exception Message from StartInstances API: [Request limit exceeded. (Service: AmazonEC2; Status Code: 503; Error Code: RequestLimitExceeded; Request ID: ■■■■■■■■-■■■■-■■■■-■■■■-■■■■■■■■■■■■; Proxy: null)].
Please refer to Automation Service Troubleshooting Guide for more diagnosis details.

どう対応すればいいの?

原因

呼び出し上限を超える StartInstances API 実行リクエストが行われた場合に発生するエラー内容と見受けられます。

参考ドキュメント では Request limit に関する記載と、API に設定された 2 つのリクエスト制限「Request Rate Limiting」/「Resource Rate Limiting」についての記載があるのでご確認ください。
簡単ですが、以下に纏めます。

  • Request Rate Limiting
    1秒間に実行可能な API 実行回数。

  • Resource Rate Limiting
    StartInstances API の場合は、1 秒間に起動可能なインスタンスの数を意味する。

なお、StartInstances の場合、それぞれの制限は以下の通りです。

  • Request Rate Limiting
    Bucket Maximum Capacity : 5
    Bucket Refill Rate : 2

1 秒間で最大 5 回の API が実行可能です。1 秒間に 5 回の API が発行された時点でバケットのトークンが空となりますが毎秒 2 トークンが補充されます。

  • Resource Rate Limiting
    Bucket Maximum Capacity : 1000
    Bucket Refill Rate : 2

1 秒間の StartInstances API で最大 1000 インスタンスを同時起動可能です。1 秒間に 5 回の API が発行された時点でバケットのトークンが空となりますが毎秒 2 トークンが補充されます。

上記の認識より、複数の StartInstances API が短期間で同時実行されている状況であるかなどを確認してください。 実行タイミングによって Request Rate Limiting の制限でエラーとなるなどが考えられます。

回避方法

下記 3 つの方法により対策が可能ですので、ご要件に合わせて対応してください。

  • エラー発生時にリトライを実行する  

Runbook において 1 度目にエラーが発生する場合、スリープ後にリトライする方法 は問題の解消に有効な可能性があるので、実装して回避されるかご確認ください。

  • 1 回の StartInstances API 実行で複数のインスタンスを起動するように変更する

起動対象の EC2 インスタンスが多い場合、1つのインスタンス起動ごとに 1 回の StartInstances API を実行する場合には、Request Rate Limiting の上限によりエラーが発生する可能性が高くなります。
複数のインスタンスを 1 回の StartInstances API でまとめて起動することで、Request Rate Limiting のトークン消費が抑えられるため、エラーが発生しにくくなることが期待できます。

  • メンテナンスウィンドウに登録するタスクの優先順位を調整する

ドキュメント 記載のとおり、メンテナンスウィンドウに登録するタスクは優先順位に基づいて実行されます。
一部のタスクの優先度を変更するなどで同時に StartInstances API 実行する数を調整することでエラーが抑制できる可能性が考えられます。

[タスクの優先順位] で、このタスクの優先度を指定します。ゼロ (0) が最高の優先度になります。メンテナンスウィンドウのタスクは、優先度順にスケジュールされ、優先度が同じタスクは並行してスケジュールされます。

参考資料