Memaksa distribusi CloudFront / pembaruan file

146

Saya menggunakan CloudFront dari Amazon untuk menyajikan file statis aplikasi web saya.

Apakah tidak ada cara untuk memberitahu distribusi cloudfront bahwa ia perlu me-refresh file itu atau menunjukkan satu file yang harus di-refresh?

Amazon merekomendasikan agar Anda memberi versi file Anda seperti logo_1.gif, logo_2.gif dan sebagainya sebagai solusi untuk masalah ini, tetapi itu sepertinya solusi yang cukup bodoh. Apakah sama sekali tidak ada cara lain?

Martin
sumber
sebagai sidenote, saya pikir tidak bodoh menamai file statis seperti itu. Kami telah sering menggunakannya dan mengganti nama secara otomatis sesuai versi file dalam kontrol versi telah menyelamatkan kami dari banyak sakit kepala.
eis
1
@ ya kecuali file yang Anda perlu ganti telah ditautkan ke 1000 tempat berbeda secara online. Semoga beruntung, semua tautan itu diperbarui.
Jake Wilson
@ Jakobud mengapa tautan harus diperbarui dalam kasus itu? mereka merujuk ke versi spesifik, yang bukan yang terbaru, jika file telah diubah. Jika file belum diubah, itu akan berfungsi seperti sebelumnya.
eis
6
Dalam beberapa kasus perusahaan dapat membuat kesalahan dalam memposting gambar yang salah untuk sesuatu atau jenis item lain di mana mereka menerima pemberitahuan penghapusan dari sebuah firma hukum dan harus mengganti file. Mengunggah file baru dengan nama baru tidak akan memperbaiki masalah seperti itu, yang sayangnya merupakan masalah yang semakin sering terjadi akhir-akhir ini.
Jake Wilson

Jawaban:

134

Kabar baik. Amazon akhirnya menambahkan Fitur Pembatalan.Lihat Referensi API .

Ini adalah contoh permintaan dari Referensi 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>
James Lawruk
sumber
9
Harap dicatat bahwa pembatalan akan memakan waktu (tampaknya 5-30 menit menurut beberapa posting blog yang saya baca).
Michael Warkentin
37
Jika Anda tidak ingin membuat permintaan API sendiri, Anda juga dapat masuk ke Konsol Amazon dan membuat permintaan Validasi di
j0nes
Bagi Anda yang menggunakan API untuk melakukan invalidation, kira-kira berapa lama untuk validasi berlaku?
ill_always_be_a_warriors
20
Ingat ini biaya $ 0,005 per file setelah 1.000 permintaan pembatalan pertama Anda aws.amazon.com/cloudfront/pricing
TimS
1
@MichaelWarkentin Setelah membuat createInvalidationpermintaan API , saya masih melihat pembaruan membutuhkan waktu 5-10 menit atau lebih untuk membatalkan. Perhatikan saya menulis komentar ini 4 tahun setelah Anda.
tim peterson
19

Pada 19 Maret, Amazon sekarang memungkinkan TTL cache Cloudfront menjadi 0 detik, sehingga Anda (secara teoritis) tidak akan pernah melihat objek basi. Jadi jika Anda memiliki aset Anda di S3, Anda bisa pergi ke AWS Web Panel => S3 => Edit Properties => Metadata, lalu atur nilai "Kontrol-Cache" Anda ke "max-age = 0".

Ini langsung dari dokumentasi API :

Untuk mengontrol apakah CloudFront melakukan cache objek dan untuk berapa lama, kami sarankan Anda menggunakan header Kontrol-Cache dengan max-age = directive. CloudFront melakukan cache objek untuk jumlah detik yang ditentukan. (Nilai minimum adalah 0 detik.)

John K. Chow
sumber
Di mana pengaturan ini di AWS Console UI baru? Saya tidak dapat menemukannya.
ill_always_be_a_warriors
1
Saya menemukan pengaturan untuk file individual, tetapi apakah ada pengaturan untuk membuatnya sehingga apa pun yang diunggah ke ember saya memiliki TTL 0?
ill_always_be_a_warriors
Meskipun saya juga pasti akan tertarik dengan pengaturan lebar bucket, saya menemukan ini solusi yang lebih cepat / lebih baik. Permintaan validasi (bersama dengan API lainnya) sangat membingungkan dan tidak terdokumentasi dengan baik, dan saya memutar roda selama 3 jam sebelum ini berhasil.
Alchemist Dua-Bit
33
Sebut saya gila, tetapi pengaturan TTL ke 0 dan maks-usia ke 0 benar-benar menggunakan CloudFront tanpa caching, bukankah itu meneruskan semua permintaan ke sumber terus memeriksa pembaruan? Pada dasarnya membuat CDN tidak berguna?
acidjazz
6
Jika Anda hanya menggunakan cloudfront sebagai mekanisme untuk memiliki situs S3 statis SSL yang diaktifkan dengan domain khusus, maka caching tidak masalah. Juga, masalah-masalah yang kita diskusikan adalah bahwa dalam fase pengembangan caching 0-waktu itu baik.
Dan G
10

Dengan API Validasi, API diperbarui dalam beberapa menit.
Lihat PHP Invalidator .

anjanesh
sumber
Ini persis apa yang saya cari. Saya akan menghubungkan ini di web-hook Beanstalkapp ketika penggelaran otomatis dari git! Terima kasih untuk tautannya!
cointilt
10

Pengaturan pembaruan otomatis dalam 5 menit

Oke teman Cara terbaik yang mungkin saat ini untuk melakukan pembaruan CloudFront otomatis (tidak valid) adalah dengan membuat fungsi Lambda yang akan dipicu setiap kali setiap file diunggah ke bucket S3 (yang baru atau ditulis ulang).

Bahkan jika Anda belum pernah menggunakan fungsi lambda sebelumnya, itu sangat mudah - cukup ikuti petunjuk langkah demi langkah saya dan hanya membutuhkan 5 menit:

Langkah 1

Buka https://console.aws.amazon.com/lambda/home dan klik Buat fungsi lambda

Langkah 2

Klik pada Fungsi Kosong (khusus)

Langkah 3

Klik pada kotak kosong (dibelai) dan pilih S3 dari kombo

Langkah 4

Pilih Bucket Anda (sama seperti untuk distribusi CloudFront)

Langkah 5

Tetapkan Jenis Acara ke "Objek Dibuat (Semua)"

Langkah 6

Tetapkan Awalan dan Sufiks atau biarkan kosong jika Anda tidak tahu apa itu.

Langkah 7

Centang Enable trigger checkbox dan klik Next

Langkah 8

Namai fungsi Anda (sesuatu seperti: YourBucketNameS3ToCloudFrontOnCreateAll )

Langkah 9

Pilih Python 2.7 (atau lebih baru) sebagai Runtime

Langkah 10

Rekatkan kode berikut daripada kode python default:

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())
            })

Langkah 11

Buka https://console.aws.amazon.com/cloudfront/home di tab browser baru dan salin ID distribusi CloudFront Anda untuk digunakan pada langkah berikutnya.

Langkah 12

Kembali ke tab lambda dan tempel id distribusi Anda alih-alih _YOUR_DISTRIBUTION_ID_ dalam kode Python. Simpan kutipan di sekitarnya.

Langkah 13

Setel handler : lambda_function.lambda_handler

Langkah 14

Klik pada kotak kombo peran dan pilih Buat peran khusus . Tab baru di browser akan dibuka.

Langkah 15

Klik lihat dokumen kebijakan , klik edit , klik OK dan ganti definisi peran dengan yang berikut (sebagaimana adanya):

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    },
    {
      "Effect": "Allow",
      "Action": [
          "cloudfront:CreateInvalidation"
      ],
      "Resource": [
          "*"
      ]
    }
  ]
}

Langkah 16

Klik izinkan . Ini akan mengembalikan Anda ke lambda. Periksa ulang bahwa nama peran yang baru saja Anda buat dipilih di kotak kombo peran yang ada .

Langkah 17

Set Memory (MB) ke 128 dan Timeout ke 5 detik.

Langkah 18

Klik Berikutnya , lalu klik Buat fungsi

Langkah 19

Kamu baik untuk pergi! Sekarang, setiap kali Anda akan mengunggah / mengunggah kembali file apa pun ke S3, itu akan dievaluasi di semua lokasi CloudFront Edge.

PS - Saat Anda menguji, pastikan browser Anda memuat gambar dari CloudFront, bukan dari cache lokal.

PSS - Harap dicatat, bahwa hanya 1000 file invalidasi pertama per bulan adalah gratis, setiap invalidasi melebihi batas biaya $ 0,005 USD. Biaya tambahan untuk fungsi Lambda mungkin berlaku, tetapi sangat murah.

Kainax
sumber
Hanya item terakhir dari setiap batch S3?
Phil
@ Phil Kode ini ditulis sedemikian sehingga hanya file yang baru diunggah yang akan divalidasi, bukan seluruh ember. Dalam hal pengunggahan multi-file, masing-masingnya akan dibatalkan secara terpisah. Bekerja seperti pesona.
Kainax
Satu-satunya alasan kode ini berfungsi seperti yang diharapkan adalah karena S3 saat ini hanya menyertakan satu item per notifikasi, yaitu, panjang array selalu bahagia 1, dan akibatnya, bahkan jika Anda mengunggah beberapa file sekaligus, Anda mendapatkan notifikasi yang sama sekali baru per file. Anda tidak mendapatkan pemberitahuan untuk seluruh ember dalam hal apa pun. Namun demikian, kode ini sebagai tulisan tidak siap jika AWS mengubah perilaku itu. Jauh lebih aman untuk menulis kode yang menangani seluruh array, berapa pun panjangnya, yang merupakan poin asli saya (sayangnya tidak terjawab).
Phil
Satu-satunya alasan mengapa AWS menambahkan penangan acara adalah ... yah ... untuk menangani acara. Mengapa mereka menghapusnya? Tidak peduli bagaimana file baru telah ditambahkan, itu harus memicu acara untuk API dan itu adalah cara kerjanya sekarang dan akan tetap berfungsi. Saya menggunakan AWS selama 4 tahun dan mereka tidak pernah mengubah sesuatu sehingga kode sebelumnya berhenti berfungsi. Bahkan jika mereka mengubah API, mereka mengubahnya menjadi versi mandiri baru, tetapi semua versi sebelumnya selalu tetap didukung. Dalam kasus tertentu saya hanya tidak percaya bahwa acara file pribadi akan pernah dihapus. Mungkin sudah digunakan oleh jutaan proyek di seluruh dunia.
Kainax
Jika saya salah memahami komentar pertama Anda dan maksud Anda 'Kuantitas': 1 hanya akan menambahkan item terakhir - ada loop UNTUK setiap item dalam array.
Kainax
9

Bucket Explorer memiliki UI yang membuatnya sangat mudah sekarang. Begini caranya:

Klik kanan ember Anda. Pilih "Kelola Distribusi."
Klik kanan distribusi Anda. Pilih "Dapatkan daftar validasi Cloudfront" Lalu pilih "Buat" untuk membuat daftar invalidasi baru. Pilih file yang tidak valid, dan klik "Valid." Tunggu 5-15 menit.

Leopd
sumber
4

Jika Anda telah menginstal boto (yang tidak hanya untuk python, tetapi juga menginstal banyak utilitas baris perintah yang berguna), ia menawarkan perintah baris util yang secara khusus disebut cfadminatau 'cloud front admin' yang menawarkan fungsi berikut:

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

Anda membatalkan sesuatu dengan menjalankan:

$sam# cfadmin invalidate <distribution> <path>
samuraisam
sumber
Sebenarnya cfadmin adalah alat yang sangat membantu, terutama jika Anda perlu mengatur ulang CloudFront cache dari konsol deployment \ bash \ travis ci script. BTW di sini adalah postingan cara mereset \ membatalkan cache CoudFront selama penyebaran travis menjadi aws
Mikita Manko
3

Hanya memposting untuk memberi tahu siapa pun yang mengunjungi halaman ini (hasil pertama di 'Cloudfront File Refresh') bahwa ada + online invalidator yang mudah digunakan tersedia di swook.net

Validator baru ini adalah:

  • Sepenuhnya online (tidak ada instalasi)
  • Tersedia 24x7 (dihosting oleh Google) dan tidak memerlukan keanggotaan apa pun.
  • Ada dukungan riwayat, dan pemeriksaan jalur untuk memungkinkan Anda membatalkan file Anda dengan mudah. (Seringkali hanya dengan beberapa klik setelah membatalkan untuk pertama kalinya!)
  • Ini juga sangat aman, karena Anda akan tahu ketika membaca posting rilisnya .

Pengungkapan penuh: Saya membuat ini. Selamat bersenang-senang!

bangun
sumber
2
maaf, tetapi bahkan "Anda mengatakan" kredensial tidak disimpan atau dibiarkan ... seseorang tidak boleh memberikan kredensial kepada pihak ke-3. Mungkin menerapkan otentikasi amazon jarak jauh atau sesuatu?
d.raev
Setidaknya Anda harus meletakkan ini di belakang https.
Oliver Tynes
Alat daring umumnya bagus, tetapi memberikan kredensial ke alat pihak ketiga akan menjadi masalah keamanan yang valid. Saya menyarankan untuk menggunakan konsol web resmi atau alat CLI resmi .
RayLuo
2
Demi keamanan orang lain, saya menurunkan jawaban ini. Anda seharusnya tidak pernah meminta kredensial orang kepada mereka
Moataz Elmasry
3

salah satu cara yang sangat mudah untuk melakukannya adalah versi FOLDER.

Jadi jika file statis Anda ratusan misalnya, cukup masukkan semuanya ke folder yang disebut tahun + versi.

misalnya saya menggunakan folder bernama 2014_v1 di mana di dalamnya saya memiliki semua file statis saya ...

Jadi di dalam HTML saya, saya selalu meletakkan referensi ke folder. (tentu saja saya punya PHP termasuk di mana saya telah menetapkan nama folder.) Jadi dengan mengubah 1 file itu sebenarnya berubah di semua file PHP saya ..

Jika saya ingin refresh lengkap, saya cukup mengganti nama folder menjadi 2014_v2 menjadi sumber saya dan mengubah di dalam php termasuk ke 2014_v2

semua HTML secara otomatis berubah dan meminta jalur baru, cache MISS cloudfront dan minta ke sumber.

Contoh: SOURCE.mydomain.com adalah sumber saya, cloudfront.mydomain.com adalah CNAME untuk distribusi cloudfront.

Jadi PHP menyebut file ini cloudfront.mydomain.com/2014_v1/javascript.js dan ketika saya ingin refresh penuh, cukup saya mengubah nama folder menjadi sumber menjadi "2014_v2" dan saya mengubah PHP termasuk dengan mengatur folder ke "2014_v2" .

Seperti ini, tidak ada penundaan untuk pembatalan dan TIDAK ADA BIAYA!

Ini adalah posting pertama saya di stackoverflow, harap saya melakukannya dengan baik!

Marco
sumber
2

Di ruby, menggunakan permata kabut

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

bahkan pada saat invalidation, masih membutuhkan 5-10 menit untuk validasi untuk memproses dan me-refresh semua server edge amazon

raycchan
sumber
Anda baru saja menyelamatkan hidup saya!
Fábio Batista
2

AWS CLI saat ini mendukung pembatalan dalam mode pratinjau. Jalankan yang berikut ini di konsol Anda sekali:

aws configure set preview.cloudfront true

Saya menggunakan proyek web saya menggunakan npm. Saya memiliki skrip berikut di 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"
}

Memiliki skrip di atas di tempat Anda dapat menyebarkan situs Anda dengan:

npm run deploy
Dmitry Efimenko
sumber
1
Saya pikir Anda memerlukan tanda bintang di perintah 'aws.invalidate' Anda, ubah --paths /ke --paths /*. milikku juga seperti milikmu dan itu tidak membatalkan distribusi ...
Herald Smit
1

Jika Anda menggunakan AWS, Anda mungkin juga menggunakan alat CLI resminya (cepat atau lambat). AWS CLI versi 1.9.12 atau lebih tinggi mendukung pembatalan daftar nama file.

Pengungkapan penuh: Saya membuat ini. Selamat bersenang-senang!

RayLuo
sumber
Tautan mati - mengarah ke 404 :( dan saya tidak dapat memperbaruinya karena versi 1.9.12 hilang dari catatan rilis ( aws.amazon.com/releasenotes/?tag=releasenotes%23keywords%23cli )
SlyDave
Bung, itu adalah versi yang dirilis hampir 3 tahun yang lalu. Coba versi terbaru dan fitur tersebut kemungkinan masih ada. (Pengungkapan penuh: Saya tidak bekerja pada AWS CLI lagi.)
RayLuo
oh saya tahu, hanya merasa aneh bahwa dari semua releasenotes, hanya 1.9.12 tidak ada: D (yang saya dapatkan karena tidak dapat memperbarui tautan). Komentar itu lebih merupakan petunjuk bagi siapa pun yang menemukan jalan ke sini, seperti yang saya lakukan dan perlu menemukan releasenotes untuk AWS CLI. tidak ada salahnya, tidak busuk.
SlyDave
0

Pergi ke CloudFront.

Klik pada ID / Distribusi Anda.

Klik pada Validasi.

Klik buat validasi.

Pada kotak contoh raksasa, ketik * dan klik tidak valid

Selesai

masukkan deskripsi gambar di sini

Jay
sumber