AWS SDK for Ruby
開発者ガイド

ウェーターを使用する

ウェーターは、クライアントに発生する特定の状態をポーリングするユーティリティメソッドです。ウェーターはサービスクライアントに対して定義されたポーリング間隔で何度か試行した後に失敗する場合があります。ウェーターを使用する方法の例については、「シンプルなプライマリキーを使用してシンプルなテーブルを作成する」を参照してください。

ウェーターの呼び出し

ウェーターを呼び出すには、クライアントサービスで #wait_until を呼び出します。次の例では、ウェーターは、続行する前にインスタンス i-12345678 が実行するまで待機します。

ec2 = Aws::EC2::Client.new begin ec2.wait_until(:instance_running, instance_ids:['i-12345678']) puts "instance running" rescue Aws::Waiters::Errors::WaiterFailed => error puts "failed waiting for instance running: #{error.message}" end

最初のパラメータがウェーターの名前で、サービスクライアントに対して固有であり、どのオペレーションを待機しているかを示します。2 番目のパラメータは、ウエーターに呼び出されたクライアントメソッドに渡されるパラメータのハッシュで、ウェーター名に応じて異なります。

待機できるオペレーションの一覧および各オペレーションに必要なクライアントメソッドについては、「#wait_until」および、使用しているクライアント用の「#waiter_names」フィールドドキュメントを参照してください。

待機の失敗

ウェーターは、次の例外のいずれかで失敗する場合があります。

Aws::Waiters::Errors::FailureStateError

待機中にエラー状態が発生しました。

Aws::Waiters::Errors::NoSuchWaiterError

指定されたウェーター名は使用しているクライアントに対して定義されていません。

Aws::Waiters::Errors::TooManyAttemptsError

試行数がウェーターの max_attempts 値を超えています。

Aws::Waiters::Errors::UnexpectedError

予期しないエラーが待機中に発生しました。

Aws::Waiters::Errors::WaiterFailed

待機中に待機状態の 1 つが超過、または別のエラーが発生しました。

これらすべてのエラー - NoSuchWaiterError を除く - は、WaiterFailed に基づいています。ウェーターのエラーを見つけるには、次の例に示すように、WaiterFailed を使用します。

rescue Aws::Waiters::Errors::WaiterFailed => error puts "failed waiting for instance running: #{error.message}" end

ウェーターの設定

各ウェーターにはデフォルトのポーリング間隔とプログラムへコントロールを返す前の試行回数の上限があります。これらの値を設定するには、max_attempts および delay: パラメータを #wait_until 呼び出しで使用します。次の例は、最大 25 秒待機、5 秒間隔でポーリングします。

# Poll for ~25 seconds client.wait_until(...) do |w| w.max_attempts = 5 w.delay = 5 end

待機の失敗を無効にするには、これらのパラメータのいずれかの値を nil に設定します。

ウェーターの拡張

ウェーターの動作を変更するには、各ポーリング試行の前および待機の前にトリガーされたコールバックを登録できます。

次の例は、各試行の待機時間を 2 倍にすることにより、ウェーターのエクスポネンシャルバックオフを実装します。

ec2 = Aws::EC2::Client.new ec2.wait_until(:instance_running, instance_ids:['i-12345678']) do |w| w.interval = 0 # disable normal sleep w.before_wait do |n, resp| sleep(n ** 2) end end

次の例は試行最大数を無効にし、代わりに、エラーが発生する前に 1 時間 (3600 秒) 待機します。

started_at = Time.now client.wait_until(...) do |w| # Disable max attempts w.max_attempts = nil # Poll for 1 hour, instead of a number of attempts before_wait do |attempts, response| throw :failure if Time.now - started_at > 3600 end end