Auto Scaling API を呼び出す際に、リクエストがタイムアウトしたり、内部サーバーエラーで失敗したりすることがあります。クライアントがリクエストをリトライする場合、ClientToken パラメーターを含めることで、操作の重複を防ぐことができます。
べき等性とは
べき等性とは、数学やコンピューターサイエンスにおける一部の操作やリソースが持つプロパティです。これは、リクエストが何回送信されても、操作やリソースが同じ結果をもたらすことを意味します。べき等性は、分散システムの設計において重要な役割を果たします。
べき等性の確保
通常、クライアントは 500 (InternalError) または 503 (ServiceUnavailable) エラーを受け取った場合、あるいは応答がない場合にのみリクエストをリトライする必要があります。Auto Scaling API を使用する際にリトライされたリクエストのべき等性を確保するには、クライアント側で最大 64 文字のユニークな ASCII 文字列を生成し、それを ClientToken パラメーターに割り当てます。
ClientToken
ClientToken は、クライアント側で生成する、大文字と小文字を区別する最大 64 文字のユニークな ASCII 文字列です。例:
ClientToken=123e4567-e89b-12d3-a456-42665544****。異なるリクエストパラメーターで同じ ClientToken を再利用すると、Auto Scaling は
IdempotentParameterMismatchエラーを返します。説明SignatureNonce、Timestamp、および Signature パラメーターは、リトライごとに変更する必要があります。Auto Scaling は、リプレイ攻撃を防ぐために SignatureNonce を使用し、各リクエストの時刻をマークするために Timestamp を使用します。したがって、リクエストをリトライする際には、SignatureNonce と Timestamp に異なる値を指定する必要があり、これにより Signature パラメーターも変更されます。
ClientToken パラメーターを含めた後の動作は次のとおりです。
リクエストが HTTP ステータスコード 200 を返した場合、同じトークンでリトライすると、サーバーの状態を変更することなく元の結果が返されます。
リクエストが 4xx HTTP ステータスコードを返した場合、エラーメッセージで別途指示 (例:
try it later) がない限り、リトライは失敗します。リクエストをリトライする前に、エラーメッセージに基づいて問題を解決する必要があります。
べき等なリクエストの例
たとえば、CreateScalingGroup API を呼び出してスケーリンググループを作成する際に、同一のリクエストパラメーターで同じ ClientToken を使用すると、サーバーは同じ応答を返し、スケーリンググループは 1 つだけ作成されることが保証されます。
http(s)://ess.aliyuncs.com/?Action=CreateScalingGroup
&ScalingGroupName=scalinggroup****
&InstanceId=i-28wt4****
&RegionId=cn-qingdao
&MinSize=2
&MaxSize=20
&DefaultCooldown=300
.......
&ClientToken=123e4567-e89b-12d3-a456-42665544****
&<common request parameters>API リスト
以下は、ClientToken パラメーターをサポートする API の一部です。完全なリストについては、各操作の API ドキュメントをご参照ください。
スケーリンググループの作成: CreateScalingGroup
ECS インスタンスのスケーリング設定の作成: CreateScalingConfiguration
スケーリンググループからの 1 つ以上の ECS インスタンスの削除: RemoveInstances
スケーリングルールの実行: ExecuteScalingRule
1 つ以上の RDS インスタンスのアタッチ: AttachDBInstances
スケーリンググループへの 1 つ以上のサーバーグループのアタッチ: AttachServerGroups
1 つ以上の SLB インスタンスのアタッチ: AttachLoadBalancers
スケーリンググループへの 1 つ以上の ALB サーバーグループのアタッチ: AttachAlbServerGroups
SLB インスタンスの 1 つ以上の vServer グループのアタッチ: AttachVServerGroups