3 つの EC2 インスタンスを作成し、その後、それぞれに繰り返しタグを付けています。インスタンスが実行されているように見えても、タグのリクエストが失敗することがあります。
これはタイミングの問題でしょうか?インスタンスを作成してから数秒待ってからタグ付けする必要がありますか? それが開始するのを待つ決定論的な方法はありますか?
3 つの EC2 インスタンスを作成し、その後、それぞれに繰り返しタグを付けています。インスタンスが実行されているように見えても、タグのリクエストが失敗することがあります。
これはタイミングの問題でしょうか?インスタンスを作成してから数秒待ってからタグ付けする必要がありますか? それが開始するのを待つ決定論的な方法はありますか?
一方、AWS はAPI リクエスト エラーのトラブルシューティングに関するより詳細なドキュメントを追加しました。これには、最終的な整合性に関するセクションが含まれています。これは、以下の最初の回答の分析を基本的に確認します。
Amazon EC2 API は、API をサポートするシステムの分散性により、結果整合性モデルに従います。これは、Amazon EC2 リソースに影響する実行する API コマンドの結果が、実行する後続のすべてのコマンドにすぐに表示されない可能性があることを意味します。[...]
[...] たとえば、[...]作成したばかりのリソースを変更または記述するコマンドを実行すると、その ID がシステム全体に伝播されていない可能性があり、リソースが伝播したことを示すエラーが返されます。存在しません。
結果整合性を管理するには、次の操作を実行できます。
コマンドを実行してリソースを変更する前に、リソースの状態を確認してください。指数バックオフ アルゴリズムを使用して適切な Describe コマンドを実行し、前のコマンドがシステム全体に伝播するのに十分な時間を確保します。[...]
Describe コマンドが正確な応答を返す場合でも、後続のコマンド間に待機時間を追加します。数秒の待機時間から始めて、指数バックオフ アルゴリズムを適用し、最大約 5 分の待機時間まで徐々に増やします。
[鉱山を強調]
注意: 一方、ほとんどのAWS SDKは、デフォルトの再試行ポリシーを調整したり、カスタム実装を追加したりするオプションを含め、これらの提案を自動的に適用します。
AWS API の最終的に一貫性のある設計は、さまざまな大規模な AWS ユーザーがますます遭遇するようになり、当然、より深く調べてそれに応じて回避する必要があります。たとえば、次の記事を参照してください。
すでに@datasage によってコメントされているように、AWS API は一般に結果整合性のみとして扱われる必要があるようです。これは最初に遭遇したときは確かに予想外でしたが、実際には後から考えると大規模なサービス、つまりエンジニアリング担当者にとってはそれほど驚くことではありません。CAP定理に対処するための運用上のトレードオフ。
Alex Ciminian の質問Implementing idempotency for AWS Spot Instance Requests に対する私のコメントも参照してください。そこでは、同様の一貫性の問題に関するテスト結果について説明しています。
興味深い問題 - [...] 私は、Bamboo AWS プラグインのコンテキストでさまざまな同様の API の遅延に遭遇し、AWS API は全面的にのみ結果的に一貫性があるものとして扱う必要があると結論付けました。たとえば、create 呼び出しからリソース ID を受け取り、その ID に基づいてリソースにタグを付けることができたが、(まだ) 存在しないと思われるため、その後は説明しないというケースに遭遇したことさえあります。
上記のケースの詳細については、AWS API の頻繁なポーリングがスロットル制限を引き起こすを調べてください。ここでは、 AWS SDK for Java内の利用可能ではあるが制限された再試行/バックオフ機能を介して処理を改善するための分析とアプローチを要約します- ソリューション理想的ではありませんが、当分の間、かなり改善されているようです。
同様に、再設計されたAWS SDK for PHP 2では、問題に対処するために必要な状態になるまでリソースをポーリングできる専用の「Waiter」オブジェクトが導入されました。詳細については、クイックスタート内の「 Waiter 」セクションを参照してください。
SDK によって提供される高レベルの抽象化の 1 つは、「ウェイター」の概念です。ウェイターは、リソースをポーリングすることによってリソースが特定の状態になるのを簡単に待機する方法を提供することで、結果整合性システムでの作業を容易にするのに役立ちます。[...] 「waitUntil」で始まる @method タグはすべて、ウェイターを利用します。
$client->waitUntil('BucketExists', array('Bucket' => 'my-bucket'));
タグ名は、インスタンスが起動されるまで作成できません。インスタンスの作成中に key_name を指定してみてください。boto を使用している場合は、
reservation = conn.run_instances(1, 1, instance_type='m1.small', key_name='samplename')
次に、key_name を渡すことでインスタンスを取得できます。インスタンスが実行状態になったら、タグ名を指定することもできます。