Amazon の CloudFront を使用して、Web アプリの静的ファイルを提供しています。
ファイルを更新する必要があること、または更新する必要がある単一のファイルを指摘する必要があることをクラウドフロントディストリビューションに伝える方法はありませんか?
Amazon は、この問題の回避策として、logo_1.gif、logo_2.gif などのファイルをバージョン管理することを推奨していますが、それはかなりばかげた解決策のように思えます。絶対に他に方法はないのですか?
Amazon の CloudFront を使用して、Web アプリの静的ファイルを提供しています。
ファイルを更新する必要があること、または更新する必要がある単一のファイルを指摘する必要があることをクラウドフロントディストリビューションに伝える方法はありませんか?
Amazon は、この問題の回避策として、logo_1.gif、logo_2.gif などのファイルをバージョン管理することを推奨していますが、それはかなりばかげた解決策のように思えます。絶対に他に方法はないのですか?
朗報です。Amazon はついに無効化機能を追加しました。API リファレンス を参照してください。
これは、API リファレンスからのサンプル リクエストです。
POST /2010-08-01/distribution/[distribution ID]/invalidation HTTP/1.0
Host: cloudfront.amazonaws.com
Authorization: [AWS authentication string]
Content-Type: text/xml
<InvalidationBatch>
<Path>/image1.jpg</Path>
<Path>/image2.jpg</Path>
<Path>/videos/movie.flv</Path>
<CallerReference>my-batch</CallerReference>
</InvalidationBatch>
3 月 19 日の時点で、Amazon は Cloudfront のキャッシュ TTL を 0 秒にすることを許可するようになったため、(理論的には) 古いオブジェクトが表示されることはありません。したがって、アセットが S3 にある場合は、AWS Web パネル => S3 => プロパティの編集 => メタデータに移動し、「Cache-Control」の値を「max-age=0」に設定します。
これは、 APIドキュメントから直接です:
CloudFront がオブジェクトをキャッシュするかどうか、およびその期間を制御するには、max-age= ディレクティブで Cache-Control ヘッダーを使用することをお勧めします。CloudFront は、指定された秒数だけオブジェクトをキャッシュします。(最小値は 0 秒です。)
5分で自動更新セットアップ
わかりました、皆さん。CloudFront の自動更新 (無効化) を実行する現時点での最善の方法は、ファイルが S3 バケットにアップロードされるたびにトリガーされる Lambda 関数を作成することです (新しいものまたは書き換えられたもの)。
以前にラムダ関数を使用したことがなくても、非常に簡単です。私のステップバイステップの指示に従うだけで、わずか 5 分で済みます。
ステップ1
https://console.aws.amazon.com/lambda/homeに移動し、 Create a lambda functionをクリックします
ステップ2
空白の関数 (カスタム)をクリックします。
ステップ 3
空の(ストロークされた)ボックスをクリックして、コンボからS3を選択します
ステップ 4
バケットを選択します(CloudFront ディストリビューションと同じ)
ステップ 5
イベントの種類を「作成されたオブジェクト (すべて)」に設定します
ステップ 6
Prefix と Suffix を設定するか、わからない場合は空のままにします。
ステップ 7
[トリガーを有効にする] チェックボックスをオンにして、[次へ] をクリックします。
ステップ 8
関数に名前を付けます (例: YourBucketNameS3ToCloudFrontOnCreateAll )
ステップ 9
ランタイムとしてPython 2.7 (またはそれ以降) を選択します。
ステップ 10
デフォルトの Python コードの代わりに次のコードを貼り付けます。
from __future__ import print_function
import boto3
import time
def lambda_handler(event, context):
for items in event["Records"]:
path = "/" + items["s3"]["object"]["key"]
print(path)
client = boto3.client('cloudfront')
invalidation = client.create_invalidation(DistributionId='_YOUR_DISTRIBUTION_ID_',
InvalidationBatch={
'Paths': {
'Quantity': 1,
'Items': [path]
},
'CallerReference': str(time.time())
})
ステップ 11
新しいブラウザー タブでhttps://console.aws.amazon.com/cloudfront/homeを開き、次のステップで使用するために CloudFront ディストリビューション ID をコピーします。
ステップ 12
ラムダ タブに戻り、Python コードの _YOUR_DISTRIBUTION_ID_ の代わりにディストリビューション ID を貼り付けます。周囲の引用符を保持します。
ステップ 13
ハンドラーの設定: lambda_function.lambda_handler
ステップ 14
ロールコンボボックスをクリックし、Create a custom roleを選択します。ブラウザの新しいタブが開きます。
ステップ15
ポリシー ドキュメントの表示、編集、OKの順にクリックし、ロール定義を次のように置き換えます (そのまま)。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
],
"Resource": "arn:aws:logs:*:*:*"
},
{
"Effect": "Allow",
"Action": [
"cloudfront:CreateInvalidation"
],
"Resource": [
"*"
]
}
]
}
ステップ 16
許可 をクリックします。これにより、ラムダに戻ります。作成したばかりのロール名が [既存のロール] コンボボックスで選択されていることを再確認します。
ステップ17
メモリ (MB)を 128 に、タイムアウトを 5 秒に設定します。
ステップ18
[次へ] をクリックし、[関数の作成] をクリックします。
ステップ19
準備できた!これで、ファイルを S3 にアップロード/再アップロードするたびに、すべての CloudFront Edge ロケーションで評価されます。
PS - テストするときは、ブラウザがローカル キャッシュからではなく、CloudFront から画像をロードしていることを確認してください。
PSS - 1 か月あたり最初の 1000 ファイルの無効化のみが無料であり、制限を超えるたびに 0.005 米ドルの費用がかかることに注意してください。また、Lambda 関数の追加料金が発生する場合がありますが、非常に安価です。
Invalidation API を使用すると、数分で更新されます。PHP Invalidator
を確認してください。
Bucket Explorerには、これを非常に簡単にする UI があります。方法は次のとおりです。
バケットを右クリックします。「ディストリビューションの管理」を選択します。
ディストリビューションを右クリックします。[Cloudfront 無効化リストを取得] を選択し、[作成] を選択して新しい無効化リストを作成します。無効にするファイルを選択し、「無効にする」をクリックします。5 ~ 15 分待ちます。
botoがインストールされている場合(これは python だけでなく、便利なコマンド ライン ユーティリティも多数インストールされます)、特にcfadmin
「cloud front admin」と呼ばれるコマンド ライン ユーティリティが提供され、次の機能が提供されます。
Usage: cfadmin [command]
cmd - Print help message, optionally about a specific function
help - Print help message, optionally about a specific function
invalidate - Create a cloudfront invalidation request
ls - List all distributions and streaming distributions
次を実行して無効にします。
$sam# cfadmin invalidate <distribution> <path>
ruby では、fog gem を使用して
AWS_ACCESS_KEY = ENV['AWS_ACCESS_KEY_ID']
AWS_SECRET_KEY = ENV['AWS_SECRET_ACCESS_KEY']
AWS_DISTRIBUTION_ID = ENV['AWS_DISTRIBUTION_ID']
conn = Fog::CDN.new(
:provider => 'AWS',
:aws_access_key_id => AWS_ACCESS_KEY,
:aws_secret_access_key => AWS_SECRET_KEY
)
images = ['/path/to/image1.jpg', '/path/to/another/image2.jpg']
conn.post_invalidation AWS_DISTRIBUTION_ID, images
無効化の場合でも、無効化が処理され、すべての Amazon エッジ サーバーで更新されるまでに 5 ~ 10 分かかります。
これを行う非常に簡単な方法の 1 つは、FOLDER のバージョン管理です。
たとえば、静的ファイルが数百ある場合は、それらすべてを year+versioning という名前のフォルダーに入れるだけです。
たとえば、私は 2014_v1 という名前のフォルダーを使用しており、その中にすべての静的ファイルがあります...
したがって、HTML内には常にフォルダーへの参照を入れます。(もちろん、フォルダーの名前を設定した場所にPHPインクルードがあります。)したがって、1つのファイルを変更すると、実際にはすべてのPHPファイルが変更されます..
完全に更新したい場合は、フォルダーの名前を 2014_v2 に変更してソースに入れ、php インクルード内を 2014_v2 に変更します。
すべての HTML が自動的に変更され、新しいパス、cloudfront MISS キャッシュを要求してソースに要求します。
例: SOURCE.mydomain.com は私のソース、cloudfront.mydomain.com は cloudfront ディストリビューションへの CNAME です。
したがって、PHP はこのファイルを cloudfront.mydomain.com/2014_v1/javascript.js と呼び、完全に更新する場合は、ソースのフォルダーの名前を「2014_v2」に変更し、フォルダーを「2014_v2」に設定して PHP インクルードを変更します。 .
このように、無効化の遅延はなく、費用もかかりません!
これは、stackoverflow での最初の投稿です。
プレビュー モードでの現在の AWS CLI サポートの無効化。コンソールで次を 1 回実行します。
aws configure set preview.cloudfront true
npm を使用して Web プロジェクトをデプロイします。に次のスクリプトがありますpackage.json
。
{
"build.prod": "ng build --prod --aot",
"aws.deploy": "aws s3 sync dist/ s3://www.mywebsite.com --delete --region us-east-1",
"aws.invalidate": "aws cloudfront create-invalidation --distribution-id [MY_DISTRIBUTION_ID] --paths /*",
"deploy": "npm run build.prod && npm run aws.deploy && npm run aws.invalidate"
}
上記のスクリプトを配置すると、次の方法でサイトをデプロイできます。
npm run deploy
このページ (「Cloudfront File Refresh」の最初の結果) にアクセスする人に、使いやすくアクセスしやすいオンライン無効化ツールが swook.net で入手できることを知らせるために投稿するだけです。
この新しい無効化機能は次のとおりです。
完全な開示:私はこれを作りました。楽しむ!