AmazonのCloudFrontを使用して、Webアプリの静的ファイルを提供しています。
ファイルを更新する必要があること、または更新する必要がある単一のファイルを指摘する必要があることをCloudfrontディストリビューションに伝える方法はありませんか?
この問題の回避策として、logo_1.gif、logo_2.gifなどのファイルにバージョンを付けることをお勧めしますが、これはかなり愚かな解決策のようです。他に方法は絶対にありませんか?
AmazonのCloudFrontを使用して、Webアプリの静的ファイルを提供しています。
ファイルを更新する必要があること、または更新する必要がある単一のファイルを指摘する必要があることをCloudfrontディストリビューションに伝える方法はありませんか?
この問題の回避策として、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>
createInvalidation
リクエストを行った後も、更新が無効になるまでに5〜10分かかることがわかります。私はあなたのコメントの4年後にこのコメントを書いていることに注意してください。
3月19日の時点で、AmazonはCloudfrontのキャッシュTTLを0秒にすることを許可しているため、(理論的には)古いオブジェクトが表示されることはありません。したがって、S3にアセットがある場合、AWS Web Panel => S3 => Edit Properties => Metadataに移動し、「Cache-Control」の値を「max-age = 0」に設定します。
これはAPIドキュメントから直接です:
CloudFrontがオブジェクトをキャッシュするかどうか、およびその期間を制御するには、max-age =ディレクティブでCache-Controlヘッダーを使用することをお勧めします。CloudFrontは、指定された秒数の間オブジェクトをキャッシュします。(最小値は0秒です。)
Invalidation APIを使用すると、数分で更新されます。PHP Invalidatorを
調べてください。
5分で自動更新セットアップ
はい、みんな。CloudFrontの自動更新(無効化)を実行する最善の方法は、ファイルがS3バケットにアップロードされるたびにトリガーされるLambda関数を作成することです(新しいファイルまたは再書き込み)。
これまでにラムダ関数を使用したことがない場合でも、それは本当に簡単です。ステップバイステップの指示に従うだけで、わずか5分で完了します。
ステップ1
https://console.aws.amazon.com/lambda/homeに移動し、[ ラムダ関数の作成 ]をクリックします
ステップ2
空白の関数(カスタム)をクリックします。
ステップ3
空の(ストロークされた)ボックスをクリックして、コンボからS3を選択します。
ステップ4
バケットを選択します(CloudFrontディストリビューションと同じ)
手順5
設定するイベントの種類を「作成したオブジェクト(すべて)」に
手順6
接頭辞と接尾辞を設定するか、それがわからない場合は空のままにします。
手順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
lambdaタブに戻り、Pythonコードに_YOUR_DISTRIBUTION_ID_ではなくディストリビューションIDを貼り付けます。周囲の引用を保持します。
手順13
ハンドラーの設定:lambda_function.lambda_handler
手順14
役割のコンボボックスをクリックし、[ カスタムの役割を作成する]を選択します。ブラウザの新しいタブが開きます。
手順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 USDかかります。また、ラムダ関数の追加料金が適用される場合がありますが、非常に安価です。
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>
このページ(「Cloudfront File Refresh」の最初の結果)にアクセスするすべての人にswook.netで利用可能な +アクセス可能なオンライン無効化ツールがあることを通知するために投稿するだけです
この新しい無効化機能は次のとおりです。
完全な開示:これを作成しました。楽しんで!
これを行う非常に簡単な方法の1つは、FOLDERバージョン管理です。
たとえば、静的ファイルが数百ある場合、それらすべてをyear + versioningによって呼び出されるフォルダーに配置するだけです。
たとえば、2014_v1という名前のフォルダーを使用します。ここには、すべての静的ファイルがあります...
したがって、私のHTML内には常にフォルダーへの参照を入れます。(もちろん、フォルダ名を設定した場所にPHPインクルードがあります。)1つのファイルを変更すると、実際にはすべてのPHPファイルが変更されます。
完全な更新が必要な場合は、フォルダーの名前を2014_v2に変更してソースに変更し、php include内を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での最初の投稿です。うまくできたことを願っています!
TTL = 1時間に設定して交換
http://developer.amazonwebservices.com/connect/ann.jspa?annID=655
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
無効化の場合でも、すべてのアマゾンエッジサーバーで無効化の処理と更新に5〜10分かかります
現在の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
--paths /
してください--paths /*
。私のものもあなたのもので、ディストリビューションを無効にすることはありませんでした...
AWSを使用している場合は、おそらく公式のCLIツールも使用します(遅かれ早かれ)。AWS CLIバージョン1.9.12以降では、ファイル名のリストの無効化がサポートされています。
完全な開示:これを作成しました。楽しんで!