Waiter

AWS SDKなどで利用できるCloudFormationのAPIには Waiters という機能が存在する。これは文字通り、CloudFormationでのスタック作成・削除などの処理の終了を待つだけの機能だ。ここでは、Node.jsのSDKを用いた場合の例を紹介する。

Waitersとして使用できるメソッド waitFor() は、スタックの状態をポーリングし、引数に渡したスタックの状態になるまで監視してくれるメソッドだ。ポーリングのため処理はしばらくその場で止まるので、Lambdaなどの実行時間に制限のあるサービス上で動かすことには向かない。

waitForの状態として指定できる名前は次の5つだ。どの状態を指定した場合でも waitForはメソッド CloudFormation.describeStacks() を決められた秒数間隔、決まった回数まで呼び出し、現在の状態を確認する。確認できた時点か、エラーが発生した時点、または時間切れが起きた時点で次の処理に進む。(スタックの作成・削除などが失敗してロールバック等が起きた際はWaitersがエラーを吐くので、 catch でエラー処理を行うことができる。)

名前 状態
stackExists 指定されたstackNameかstackIdが存在するか確認、5秒ごと最大20回のポーリングを行う
stackCreateComplete 作成の完了を待つ、30秒ごと最大120回のポーリングを行う
stackDeleteComplete 削除の完了を待つ、30秒ごと最大120回のポーリングを行う
stackUpdateComplete 更新の完了を待つ、30秒ごと最大120回のポーリングを行う
changeSetCreateComplete 変更セットの作成完了を待つ、30秒ごと最大120回のポーリングを行う

次の例は、CloudFormationでスタックの作成を開始し、そのスタックの作成待って終了時に任意の処理を実行する例だ。今回のwaitForは stackCreateComplete を指定されているので、指定したスタックIDのスタックの作成が完了するまで待機する。もちろん、エラーが出た場合は catch のほうに流れる。

const aws  = require('aws-sdk')
const cloudformation = new aws.CloudFormation()

let params = {
  StackName: 'waiter-test',
  TemplateURL: 'https://s3-ap-northeast-1.amazonaws.com/test-bucket/demo.yaml',
  Capabilities: [],
  Parameters: []
}

// スタックを作成
cloudformation.createStack(params).promise()
.then(res => {
  let stackId = { StackName: res.StackId }

  // 状態と監視するスタックIDを引数に waitFor() を実行
  return cloudformation.waitFor('stackCreateComplete', stackId).promise()
})
.then(res => {
  // スタックの作成が終了し、指定した状態になったときの処理
  console.log(res)
})
.catch(err => {
  // スタックの作成が失敗し、ロールバックが行われたときの処理
  console.error(err)
})

参考

results matching ""

    No results matching ""