web-dev-qa-db-ja.com

CloudFrontディストリビューション/ファイルの更新を強制する

私はAmazonのCloudFrontを使用して、Webアプリの静的ファイルを提供しています。

クラウドフロントディストリビューションに、ファイルを更新する必要があること、または更新する必要がある単一のファイルを指定する必要があることを伝える方法はありませんか?

この問題の回避策として、logo_1.gif、logo_2.gifなどのファイルをバージョン管理することをお勧めしますが、これは非常に愚かな解決策のようです。他に方法はありませんか?

144
Martin

良いニュース。 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>
132
James Lawruk

3月19日の時点で、AmazonはCloudfrontのキャッシュTTLを0秒にできるようになったため、(理論的には)古いオブジェクトが表示されることはありません。したがって、S3にアセットがある場合は、AWS Webパネル=> S3 =>プロパティの編集=>メタデータに移動し、「Cache-Control」値を「max-age = 0」に設定するだけです。

これは、 APIドキュメント から直接です:

CloudFrontがオブジェクトをキャッシュするかどうか、およびその期間を制御するには、max-age =ディレクティブでCache-Controlヘッダーを使用することをお勧めします。 CloudFrontは、指定された秒数の間オブジェクトをキャッシュします。 (最小値は0秒です。)

19
John K. Chow

5分で自動化された更新セットアップ

わかった、みんな。現在、CloudFrontの自動更新(無効化)を実行する最良の方法は、S3バケットにファイルがアップロードされるたびにトリガーされるLambda関数を作成することです(新しいファイルまたは書き換えられたファイル)。

以前にラムダ関数を使用したことがない場合でも、それは本当に簡単です-私のステップバイステップの指示に従うだけで、わずか5分かかります:

ステップ1

https://console.aws.Amazon.com/lambda/home に移動して、をクリックしますラムダ関数を作成します

ステップ2

空白関数(カスタム)をクリックします

ステップ3

空の(ストローク)ボックスをクリックし、コンボからS3を選択します

ステップ4

Bucketを選択します(CloudFrontディストリビューションと同じ)

ステップ5

Event Typeを「Object Created(All)」に設定します

ステップ6

PrefixとSuffixを設定するか、それが何であるかわからない場合は空のままにします。

ステップ7

トリガーの有効化チェックボックスをチェックして、次へをクリックします

ステップ8

関数に名前を付けます(YourBucketNameS3ToCloudFrontOnCreateAll

ステップ9

Python 2.7(以降)をRuntimeとして選択します

ステップ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

Sethandler:lambda_function.lambda_handler

ステップ14

roleコンボボックスをクリックし、カスタムロールの作成を選択します。ブラウザの新しいタブが開きます。

ステップ15

ポリシードキュメントの表示をクリックし、editをクリックして、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

allowをクリックします。これにより、ラムダに戻ります。作成したロール名がExisting roleコンボボックスで選択されていることを再確認します。

ステップ17

Memory(MB)を128に、Timeoutを5秒に設定します。

ステップ18

Nextをクリックしてから、Create functionをクリックします

ステップ19

準備できた!これで、S3にファイルをアップロード/再アップロードするたびに、すべてのCloudFront Edgeロケーションで評価されます。

PS-テスト中は、ブラウザーがローカルキャッシュからではなくCloudFrontから画像を読み込んでいることを確認してください。

PSS-毎月最初の1000個のファイルの無効化のみが無料で、制限を超える無効化の費用はそれぞれ0.005 USDであることに注意してください。 Lambda関数の追加料金も適用される場合がありますが、非常に安価です。

10
Kainax

Invalidation APIを使用すると、数分で更新されます。
チェックアウト PHP Invalidator

10
anjanesh

Bucket Explorer には、これを非常に簡単にするUIがあります。方法は次のとおりです。

バケットを右クリックします。 「配布の管理」を選択します。
ディストリビューションを右クリックします。 「Cloudfront無効化リストの取得」を選択し、「作成」を選択して新しい無効化リストを作成します。無効にするファイルを選択し、「無効にする」をクリックします。 5〜15分待ちます。

9
Leopd

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>
4
samuraisam

このページにアクセスした人に通知するために投稿するだけです(「Cloudfront File Refresh」の最初の結果)。使いやすい+ access のオンライン無効化機能がswook.netで利用可能であることを通知します

この新しい無効化機能は次のとおりです。

  • 完全にオンライン(インストールなし)
  • 24時間年中無休(Googleがホスト)で、メンバーシップは不要です。
  • 履歴のサポートと、ファイルを簡単に無効にするためのパスチェックがあります。 (多くの場合、初めて無効にした後、数回クリックするだけで!)
  • また、 リリースポスト を読むとわかるように、非常に安全です。

完全な開示:これを作成しました。楽しんで!

3
swook

それを行う非常に簡単な方法の1つは、フォルダーのバージョン管理です。

たとえば、静的ファイルが数百個ある場合、それらすべてをyear + versioningによって呼び出されるフォルダーに入れるだけです。

たとえば、内部にすべての静的ファイルがある2014_v1というフォルダーを使用しています...

したがって、HTML内では、常にフォルダーへの参照を配置します。 (もちろん、フォルダー名を設定したPHP includeがあります。)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」に変更し、PHPフォルダーを「2014_v2」に設定して組み込みます。

このように、無効化に遅延はなく、費用もかかりません!

これはstackoverflowの最初の投稿です、うまくやったことを願っています!

3
MarcoP

現在の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
2
Dmitry

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 Edgeサーバーで無効化が処理および更新されるまでに5〜10分かかります

2
raycchan
2
Hml

AWSを使用している場合は、おそらく公式のCLIツール(遅かれ早かれ)も使用するでしょう。 AWS CLIバージョン1.9.12 以上では、ファイル名のリストの無効化がサポートされます。

完全な開示:これを作成しました。楽しんで!

1
RayLuo