edit-icon download-icon

How to ensure idempotence

最終更新日: Dec 10, 2018

ECS を作成するために CreateInstance インターフェイスを呼び出すときに、リクエストタイムアウトまたは内部サーバーエラーが発生した場合は、クライアントがそのリクエストの再送を試みることがあります。こうしたときに、クライアントがオプションで ClientToken パラメーターを使用すると、サーバーは想定より多くのインスタンスを作成しません。このパラメーターを設定すると、リクエストのべき等性も確保されます。ClientToken はクライアントが生成する一意の文字列で、大文字小文字が区別され、64 文字以内の ASCII 文字で構成されます。

ユーザーが CreateInstance インターフェイスの呼び出しに同一の ClientToken 値を使用すると、サーバーは同じ InstanceId を含む同一のリクエスト結果を返します。したがって、エラー発生時に再試行する際に同じ ClientToken 値を使用すると、ECS で確実にインスタンスを 1 つだけ作成し、同じ InstanceId を取得することができます。

ユーザーが、異なるリクエストパラメーターに使用済みの ClientToken を指定すると、ECS は IdempotentParameterMismatch エラーコードを返します。しかし、SignatureNonceTimeStampSignature の各パラメーターは、リクエストの再送時には必ず変更するようにしてください。ECS は SignatureNonce を使用して反射攻撃を防止し、TimeStamp を使用して各リクエストの時刻を記録するので、重複するリクエストでも、SignatureNonce パラメーターと TimeStamp パラメーターの値が異なっていることが必要です。これにより、生成される Signature 値も異なるものになります。

一般に、クライアントが操作を再試行する必要があるのは、500 (InternalError) エラーか 503 (ServiceUnAvailable) エラーが発生した場合、または応答を受信できない場合に限られます。200 が返された場合は、操作を再試行しても結果は直前と変わりませんが、サーバーステータスには何の影響もありません。4xx のエラーコードが返された場合は、”後で再試行してください” という明示的なメッセージが表示されたのでない限り、再試行しても通常は成功しません。