Node.jsでCloudFrontのInvalidationを作成して完了するまで待つ

CloudFrontのInvalidationをコードから制御したい時、Invalidationの完了を待ってから次の作業をしたいときありますよね。

waitForという関数を使うことによって簡単に完了を待つことができたのでメモしておきます。

aws-sdkでの接続情報の設定についてはこちらの記事にあります。

aws-sdkのインストール

npm install aws-sdk

コード

waitForでInvalidationの完了を待つためには、createInvalidation時に得られるInvalidation.Idを指定する必要があります。

const AWS = require('aws-sdk');
const cloudfront = new AWS.CloudFront();

DISTRIBUTION_ID = 'XXXXXXXXXXXXXX'


const createInvalidation = ()=>{
  const params = {
    DistributionId: DISTRIBUTION_ID,
    InvalidationBatch: {
      CallerReference: Date.now().toString(),
      Paths: {
        Quantity: '2',
        Items: ['/', '/posts*']
      }
    }
  }

  return new Promise((resolve, reject) => {
    cloudfront.createInvalidation(params, (err, data)=>{
      if(err){
        reject(err)
      }else{
        resolve(data)
      }
    })
  })
}

const waitForInvalidationToComplete = (invalidationId)=>{
  const params = {
    DistributionId: DISTRIBUTION_ID,
    Id: invalidationId
  }

  return new Promise((resolve, reject) => {
    cloudfront.waitFor('invalidationCompleted', params, (err, data)=>{
      if(err){
        reject(err)
      }else{
        resolve(data)
      }
    })
  })
}

createInvalidation().then((data)=>{
  waitForInvalidationToComplete(data.Invalidation.Id).then(()=>{
    console.log('invalidation completed')
  }).catch((err)=>{
    console.log(err)
  })
}).catch((err)=>{
  console.log(err)
})