Resource Orchestration Service (ROS) API を呼び出すときに、リクエストがタイムアウトになった場合、またはサーバーで内部エラーが発生した場合、クライアントは再試行リクエストを送信しようとすることがあります。 この場合、リクエストで ClientToken パラメーターを指定することで、クライアントがリクエストを繰り返し送信することを防ぐことができます。
冪等性とは
冪等性は、数学またはコンピューターサイエンスにおける一部の操作とリソースの特性です。 冪等性により、操作を実行するか、リソースを複数回適用した後に、最初のリクエストの結果を取得できます。 冪等性は、分散システムの設計において重要です。
冪等性を確保する
ほとんどの場合、クライアントは、返された HTTP ステータスコードが 500 Internal Server Error または 503 Service Unavailable である場合、または結果が返されない場合に、再試行リクエストを送信します。 ROS API を呼び出すときは、クライアントが最大 64 文字の ASCII 文字を含む文字列を生成し、その文字列を ClientToken パラメーターの値として指定して、再試行リクエストの冪等性を確保できるように、パラメーターを指定できます。
ClientToken
以下は、ClientToken リクエストパラメーターに関する情報です。
- ClientToken パラメーターの値は、クライアントによって生成される、大文字と小文字が区別される一意の文字列であり、最大 64 文字の ASCII 文字を含めることができます。 例:
ClientToken=123e4567-e89b-12d3-a456-42665544****。 - 再試行リクエストに、最初のリクエストと同じ ClientToken 値が含まれているものの、他のパラメーターには異なる値が含まれている場合、ROS は
InvalidIdempotenceParameterエラーコードを返します。説明 SignatureNonce、Timestamp、および Signature パラメーターの値は、再試行リクエストで変更する必要があります。 ROS API では、SignatureNonce パラメーターはリプレイ攻撃を防ぎ、Timestamp パラメーターは各リクエストの時刻を記録します。 したがって、各再試行リクエストの SignatureNonce パラメーターと Timestamp パラメーターの値は、最初のリクエストの値とは異なる必要があります。 デフォルトでは、SignatureNonce パラメーターと Timestamp パラメーターの値を変更すると、Signature パラメーターの値が変更されます。 - 再試行リクエストで ClientToken パラメーターを指定すると、次の結果が返される場合があります。
- 呼び出しが成功したことを示す HTTP ステータスコード
200 OKが返されます。 この場合、クライアントは最初のリクエストと同じ結果を取得できます。 サーバーは影響を受けません。 400 Bad Requestなどの、呼び出しが失敗したことを示す HTTP ステータスコードが返されます。 この場合、後で試してくださいなどのエラーメッセージが表示された場合、再試行リクエストは失敗します。 エラーメッセージに基づいてエラーの原因を特定し、別の再試行リクエストを送信できます。
- 呼び出しが成功したことを示す HTTP ステータスコード
リクエストの例
この例では、CreateStack 操作を呼び出して、再試行リクエストでスタックを作成します。 ClientToken リクエストパラメーターを最初のリクエストに含まれる ClientToken 値に設定し、他のリクエストパラメーターの値を変更しない場合、サーバーによって返される StackId 値は、最初のリクエストの値と同じになります。 ClientToken パラメーターを最初のリクエストの値とは異なる値に設定すると、サーバーは StackId パラメーターに異なる値を返し、複数のスタックを作成する場合があります。
リクエストの例
http(s)://ros.aliyuncs.com/?Action=CreateStack
&RegionId=cn-hangzhou
&StackName=MyStack
&TemplateBody={"ROSTemplateFormatVersion": "2015-09-01"}
&ClientToken=123e4567-e89b-12d3-a456-42665544****
&<共通リクエストパラメーター>レスポンスの例
{
"StackId": "4a6c9851-3b0f-4f5f-b4ca-a14bf691****",
"RequestId": "B288A0BE-D927-4888-B0F7-B35EF84B6E6F"
}