クラウドフロント配布/ファイルの更新を強制します
-
13-09-2019 - |
質問
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 =>プロパティ=>メタデータを編集するだけで、「キャッシュコントロール」値を「max-age = 0」に設定できます。
これはからまっすぐです APIドキュメント:
CloudFrontがオブジェクトをキャッシュするかどうか、そしてどのくらいの期間、Max-Age = Directiveでキャッシュ制御ヘッダーを使用することをお勧めします。 CloudFrontは、指定された秒数のオブジェクトをキャッシュします。 (最小値は0秒です。)
無効化APIを使用すると、数分で更新されます。
チェックアウト PHP Invalidator.
5分で自動更新セットアップ
さて、みんな。自動クラウドフロントアップデート(無効化)を実行するための現在の可能な最良の方法は、ファイルがS3バケット(新しいものまたは書き換えられた)にアップロードされるたびにトリガーされるLambda関数を作成することです。
Lambda機能を以前に使用したことがない場合でも、それは本当に簡単です - 私のステップバイステップの指示に従ってください、そしてそれはわずか5分かかります:
ステップ1
行きます https://console.aws.amazon.com/lambda/home クリックします ラムダ関数を作成します
ステップ2
クリック 空白関数(カスタム)
ステップ3
空の(ストローク)ボックスをクリックして選択します S3 コンボから
ステップ4
あなたを選択します バケツ (CloudFront Distributionと同じ)
ステップ5
設定します イベントタイプ 「作成されたオブジェクト(すべて)」へ
ステップ6
設定 接頭辞と接尾辞 または、それが何であるかわからない場合は、空のままにしておきます。
ステップ7
小切手 トリガーを有効にします チェックボックスとクリックします 次
ステップ8
あなたの関数に名前を付けます(次のようなもの: yourbucketnames3tocloudfrontoncreateall)
ステップ9
選択する Python 2.7 (またはそれ以降)as ランタイム
ステップ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 新しいブラウザ]タブで、次のステップで使用するためにクラウドフロント配布IDをコピーします。
ステップ12
pythonコードで_your_distribution_id_の代わりに、Lambdaタブに戻り、配布IDを貼り付けます。周囲の引用を保持します。
ステップ13
設定 ハンドラ: :lambda_function.lambda_handler
ステップ14
クリックしてください 役割 コンボボックスと選択 カスタムロールを作成します. 。ブラウザの新しいタブが開きます。
ステップ15
クリック ポリシー文書を表示します, 、 クリック 編集, 、 クリック わかった ロール定義を次のように置き換えます(現状のまま):
{
"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関数の追加料金が適用される場合がありますが、非常に安価です。
バケットエクスプローラー これを非常に簡単にするUIがあります。方法は次のとおりです。
バケツを右クリックします。 「分布の管理」を選択します。
分布を右クリックします。 [CloudFront Invalidation Listを取得]を選択し、[作成]を選択して、新しい無効化リストを作成します。ファイルを選択して無効にし、[Invalidate]をクリックします。 5〜15分待ちます。
あなたが持っている場合 ボト インストールされている(Pythonだけでなく、便利なコマンドラインユーティリティの束もインストールします)、特別に呼ばれるコマンドラインを提供します cfadmin
または、次の機能を提供する「クラウドフロント管理者」:
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>
このページにアクセスしている人に通知するために投稿するだけで(「Cloudfrontファイルの更新」の最初の結果)、使いやすい+アクセスがあることを swook.netで入手可能なオンラインInvalidator
この新しい無効な人は次のとおりです。
- 完全にオンライン(インストールなし)
- 24x7(Googleがホスト)利用可能で、メンバーシップは必要ありません。
- 履歴サポートとパスチェックがあり、ファイルを簡単に無効にすることができます。 (多くの場合、初めて無効になった後、わずか数回クリックしてください!)
- また、それを読んでいるときにわかるように、それは非常に安全です リリース投稿.
完全な開示:私はこれを作りました。楽しむ!
それを行う非常に簡単な方法の1つは、フォルダーバージョン化です。
したがって、たとえば静的ファイルが数百の場合、それらすべてをYear+バージョンで呼ばれるフォルダーに配置するだけです。
たとえば、2014_V1というフォルダーを使用します。
したがって、HTMLの内部では、常にフォルダーへの参照を配置します。 (もちろん、フォルダーの名前を設定した場所にPHPが含まれています。)1ファイルで変更することにより、実際にすべてのPHPファイルで変更されます。
完全な更新が必要な場合は、フォルダを2014_V2にソースに変更し、PHP内の変更を2014_V2に変更するだけです
すべてのHTMLは自動的に変更され、新しいパスを尋ね、CloudFront Miss Cacheをミスしてソースにリクエストします。
例:source.mydomain.comは私のソースです。CloudFront.Mydomain.comはCloudFront Distributionのcnameです。
したがって、このファイルと呼ばれるPHP cloudfront.mydomain.com/2014_v1/javascript.jsと完全に更新したいときは、フォルダーをソースに「2014_V2」に変更し、フォルダーを「2014_V2」に設定してPHPを変更します。 。
このように、無効化の遅延はなく、費用はかかりません!
これはStackoverflowでの私の最初の投稿です。私がうまくやったことを願っています!
TTL = 1時間を設定して交換します
http://developer.amazonwebservices.com/connect/ann.jspa?annid=655
ルビーでは、霧の宝石を使用します
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 Edgeサーバーを処理および更新するには、5〜10分かかります。
現在のAWS CLIは、プレビューモードでの無効化をサポートしています。コンソールで以下を一度実行します。
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
AWSを使用している場合は、おそらくその公式CLIツール(遅かれ早かれ)も使用しています。 AWS CLIバージョン1.9.12 または上記は、ファイル名のリストを無効にすることをサポートしています。
完全な開示:私はこれを作りました。楽しむ!