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)
})