CloudFront のキャッシュを削除して再生成する ( JavaScript SDK )

CloudFront のキャッシュを削除して再生成する ( JavaScript SDK )

SN

11/20 23:33

AWS CloudFront のキャッシュを JavaScript SDK を使って削除した後に再生成するスクリプトのメモです。


背景

CloudFront でキャッシュはしたい。キャッシュはしたいけど、データは更新される。更新されたらキャッシュも更新したい。キャッシュを削除すれば良いけど、そうすると最初のアクセス時にキャッシュ生成コストを負担することになる。その負担をユーザに課したくない。つまり、削除後に再生成するようにしたい。


やり方

やり方は本当に単純で CloudFront の SDK を使って、指定 URL のキャッシュを削除して、HTTP リクエストでアクセスしてキャッシュを生成するっていうだけです。気をつけなきゃいけないのは CloudFront のキャッシュ条件程度と、HTTP リクエストのタイミングくらいです。


CloudFront キャッシュ削除の反映

CloudFront は現時点 ( 2018/11/20 ) でキャッシュを削除してから約5秒程度でキャッシュが削除されます。

(*) 90%程度のエッジサーバは5秒、全部に完全に反映するには1〜2分程度というアナウンスが AWS からあったようですがオリジナルソースの URL が今は NotFound 状態で公式アナウンスはありません…

というわけで、5秒後くらいに HTTP リクエストしてあげればキャッシュを再生成できるということになります。


コード

const got = require('got')
const AWS = require('aws-sdk')
const cloudfront = new AWS.CloudFront({
apiVersion: '2018-06-18',
accessKeyId: 'ACCESS_KEY',
secretAccessKey: 'SECRET_KEY',
})

(() => {
const invalidCache = async () => {
const timestamp = new Date()
const string_timestamp = String(timestamp.getTime())
const invalidate_items = ['/example.json']
const item_count = invalidate_items.length
const params = {
DistributionId: 'DistributionId',
InvalidationBatch: {
CallerReference: string_timestamp,
Paths: {
Quantity: item_count,
Items: invalidate_items
}
}
}
await cloudfront.createInvalidation(params).promise()
setTimeout(() => {
got('https://example.com/example.json', {
headers: {
'Origin': 'https://example.com'
}
})
}, 5000)
}
invalidCache()
})()


createInvalidation でキャッシュ削除を開始します。Promise の完了時に削除自体が完了しているわけではなく、あくまでスタックに積んだ状態です。なので、そこからおおよそ5秒後には消えているだろうという見積もりで got ライブラリを使って HTTP リクエストをしています。

その際に、CloudFront で設定した Headers の値と一致するようなリクエストパラメータにする必要があります。今回のコードだと CORS のために Origin ヘッダーをホワイトリストに追加しているので Origin ヘッダーを追加しています。


Invalidation のステータスをポーリング

キャッシュ削除が完全に完了したかどうかを知るには数秒おきにステータス確認するしかないです。2秒おきに getInvalidation を叩いて該当 ID のステータスを取得しています。ちなみに実際に試してみると InProgress から Completed になるまで約2分弱かかりました。

const checkStatus = (id) => {
const params = {
DistributionId: 'DistributionId',
Id: id
}
cloudfront.getInvalidation(params, (err, data) => {
console.log(err, data)
})
}

const invalidCache = () => {
const timestamp = new Date()
const string_timestamp = String(timestamp.getTime())
const invalidate_items = ['/example.json']
const item_count = invalidate_items.length
const params = {
DistributionId: 'DistributionId',
InvalidationBatch: {
CallerReference: string_timestamp,
Paths: {
Quantity: item_count,
Items: invalidate_items
}
}
}
cloudfront.createInvalidation(params, (err, data) => {
const id = data.Invalidation.Id
setInterval(checkStatus, 2000, id)
})
}


以上です。完全ではないですが実用性はそれなりにあると思います。実際には AWS Lambda などを使って、データベース更新コールバックなどで実行するような感じになると思います。

PR:デジカフェ

Qiita - AWSタグが付けられた新着投稿

【Node.js】postで受け取った画像をS3へアップロードする

SN

12/17 17:59



はじめに

おはこんばんにちは@kaoryuuuです。

今回はnodeで実装したAPIでPOSTされた画像をS3へアップロードする方法を紹介していこうと思います。


今回やること

base64エンコードされた画像を受け取り...

お名前.COMのDDNSをLambdaを使って更新する

SN

12/17 15:36



理由目的

自宅サーバのDDNS更新をAWSを使って行う。

普通に更新すれば良いじゃないと言われるが、以下の理由が。


お名前.COMの更新ソフトはWindowsのみ
家で主に動いているサーバはNASのLinux(Synology ...

CircleCI2.0からEC2にアクセスするときだけ特定のIPを許可したい

CircleCI2.0からEC2にアクセスするときだけ特定のIPを許可したい

SN

12/17 15:06

Yper株式会社 でエンジニアをやっています。

個人情報とかも扱うのでセキュリティを固めていて、CircleCIのお便利さとバッティングしたときのメモです。


やりたいこと

EC2にCircleCIからSSHしてなんかしら...

AWSome Day 2018 Tokyo メモ

SN

12/17 15:00



AWSome Day 2018 Tokyo メモ


オープニングセッション:はじめての AWS ~初級者から中級者への道筋。クラウドアーキテクチャの理解を深める~

亀田 治伸


アマゾン ウェブ サービス ジャパン株式会社 マー...

JAWS-UG 初心者支部#15 AWS re:Invent 2018 re:Cap !! メモ

SN

12/17 14:51



JAWS-UG 初心者支部#15 AWS re:Invent 2018 re:Cap !! メモ


19:10-19:30 「(仮)初めてのre:invent ~若造目線の楽しみ方~」 Yu Otsubo


re:Inventとは

AWS主催の年次ユーザカンファレンス

今年で7回...

AWS Serverless Expressでlambdaの障害が起きて困った話

AWS Serverless Expressでlambdaの障害が起きて困った話

SN

12/17 14:04



はじめに

これはServerless2 Advent Calendarの13日目の記事です。

ただ、この記事を書いている今日はもう17日です。。。

この記事を書こう(ホントは別の話を書く予定だった)としていた当日に障害だっ...

AWS EC2 �設定手順忘備録

SN

12/17 11:16



AWS EC2 設定


準備


EC2 VPC+InternetGWの中につくる



ホスト名の設定:リモートログイン


sshでログイン ssh -i ***.pem ec2-usr@xxx.xxx.xxx.xxx (パブリックIPでログイン)
ホスト名を設定する(1) sudo...

AWSとDockerを使用したOmiseGo / ewallet環境構築

AWSとDockerを使用したOmiseGo / ewallet環境構築

SN

12/17 10:30



【本文】

この記事は Blockchain Advent Calendar 2018 の15日目の記事です。

空いていたので、急遽ねじ込みました!

OmiseGoのewalletをAWS上でdockerイメージを使って簡単に構築する手順について共有...

SSMパラメータストアのパラメータ値だけに閲覧制限をかける

SSMパラメータストアのパラメータ値だけに閲覧制限をかける

SN

12/17 10:19

SSMのパラメータストアを使うにあたり、特別な権限をもったユーザ以外にパラメータの値(Key-ValueでいうValueの方)を見せたくないケースがありませんか?

その際、パラメータストアへの全ての読み取り権限を遮...

AWS ML University の Deep Learning についてのコンテンツを訳してみた

AWS ML University の Deep Learning についてのコンテンツを訳してみた

SN

12/17 10:13



はじめに

この記事は株式会社ナレッジコミュニケーションが運営する Amazon AI by ナレコム Advent Calendar 2018 の17日目の記事になります。

Amazon.comのエンジニアが人工知能に関する技術を学ぶ際に利用...

AWSのBig Data and Analyticsのレポート

SN

12/17 10:06

 2018年12月7日にAWSのBig Data and Analyticsに参加しましたので、その内容をアウトプットしたいと思います。


今後のビッグデータはデータレイクが必要になる


発端となった出来事

 PentahoのCTOであるJam...

カオスエンジニアリングを体感せよ ~ChaosLambda編~

カオスエンジニアリングを体感せよ ~ChaosLambda編~

SN

12/17 08:00



カオスエンジニアリングとは



NetflixではChaos Monkey、Gorilla、Kongなどのツールを構築することで、様々なシステム、ゾーン、さらにはリージョン全体がダウンした時に、サービスが存続可能であるように継...

SSMで オンプレミスの windows PC(サーバでない) のアプリ一覧取得

SN

12/17 07:00

AWS を使って社内PCのソフトウェア管理(SAM)に書いたように、なんと、SSMが、通常のPCでも使えます。Mac や、Linux Desktop でも、つかえるようです。

SSMは、エージェントアプリケーションです。対象となるシ...

ハイブリッドクラウドについて思うところ

ハイブリッドクラウドについて思うところ

SN

12/17 07:00



はじめに

この記事は リクルートライフスタイルアドベントカレンダー2018 の17日目です。

ホットペッパービューティーでエンジニアをしています。shaseです。

現在開発中のプロジェクトが、大人の事情に...

【AWS】米国リージョンからSimple Notification Service(SNS)を利用してSMSを送ってみる

【AWS】米国リージョンからSimple Notification Service(SNS)を利用してSMSを送ってみる

SN

12/17 02:09

こちらで書いた記事 を試行錯誤する過程で、可能性の一つとして、海外のSMSが受信できる必要があるかもしれないと思い、そのプランを追加購入したのですが、結果としてアクティベートには必要ありませんでした。
...

AWS X-RayをRailsに導入しようとしてつまづいた話と解決した話

AWS X-RayをRailsに導入しようとしてつまづいた話と解決した話

SN

12/17 01:21

この記事はHamee Advent Calendar 2018 17日目の記事です。


AWS X-Rayって何?

AWS公式の説明によると


AWS X-Ray はアプリケーションが処理するリクエストに関するデータを収集するサービスです。データを表...

AWSでIAMユーザーを作成した

AWSでIAMユーザーを作成した

SN

12/16 23:47



概要

AWSでIAMユーザーを作成した際のメモです。


IAMユーザーとは

AWSにアクセスする権限を人やサーバに付与するためのもの。


IAMユーザー使う理由

AWSのアカウント作成時に発行されるユーザーはroot権...

[メモ]VPCのIPアドレスに対して作成出来るサブネットの範囲

SN

12/16 22:55

AWSで作成したVPCの中に複数のサブネットを作成出来ます。

たまにサブネットを作成しようとしてVPCの範囲外で作成しようとしてしまったり、よく理由がわからず作成出来ない、みたいなのがあったので、VPCと作成...

AWS Lambda でPHP動かして DynamoDBを操作する

SN

12/16 22:31



はじめに

この記事は、駆け出しエンジニアのための Advent Calendar 2018の15日目の記事です


re:Invent2018

先日ラスベガスで開催された、AWS re:Invent2018にて、

AWS Lambdaに、Custom Runtimeという...

【小ネタ】CloudWatch参照中にセッションが切れてしまったら【AWS】

【小ネタ】CloudWatch参照中にセッションが切れてしまったら【AWS】

SN

12/16 22:01



はじめに

性能評価や不具合原因の調査・分析等の際に、CloudWatchMetrics・CloudWatchLogsなどを駆使して、複数メトリクスを組み合わせ・並べて見ながら調べていく、といったことはままあると思います。

...

PR:Amazonプライムビデオ

Qiita

Qiita - 人気の投稿

Qiita - AWSタグが付けられた新着投稿

Qiita - Gitタグが付けられた新着投稿

Qiita - Linuxタグが付けられた新着投稿

Qiita - MySQLタグが付けられた新着投稿

Qiita - nginxタグが付けられた新着投稿

Qiita - Dockerタグが付けられた新着投稿

Qiita - Pythonタグが付けられた新着投稿

Qiita - Rubyタグが付けられた新着投稿

Qiita - PHPタグが付けられた新着投稿

Qiita - Javaタグが付けられた新着投稿

Qiita - JavaScriptタグが付けられた新着投稿