CloudFront dağıtımını / dosya güncellemesini zorla


146

Web uygulamalarımın statik dosyalarını sunmak için Amazon'un CloudFront'unu kullanıyorum.

Bir cloudfront dağıtımına, dosyasını yenilemesi veya yenilenmesi gereken tek bir dosyaya işaret etmesi gerektiğini söylemenin bir yolu yok mu?

Amazon, bu soruna geçici çözüm olarak logo_1.gif, logo_2.gif ve benzeri dosyalarınızı sürümlendirmenizi önerir, ancak bu oldukça aptalca bir çözüm gibi görünüyor. Kesinlikle başka bir yolu yok mu?



bir yan not olarak, statik dosyaları böyle adlandırmanın aptalca olduğunu düşünmüyorum. Bunu çok kullanıyoruz ve sürüm kontrolünde dosya sürümüne göre otomatik yeniden adlandırmaya sahip olmak bizi çok fazla baş ağrısından kurtardı.
eis

1
Değiştirmeniz gereken dosya çevrimiçi olarak 1000 farklı yere bağlanmadığı sürece @eis. Tüm bu bağlantıların güncellenmesinde iyi şanslar.
Jake Wilson

@Jakobud Bu durumda bağlantılar neden güncellenmeli? dosya değiştirildiyse en son olmayan belirli bir sürüme atıfta bulunuyorlar. Dosya değiştirilmediyse, daha önce olduğu gibi çalışacaktır.
eis

6
Bazı durumlarda bir şirket, bir hukuk firmasından yayından kaldırma bildirimi aldığı ve dosyayı değiştirmesi gereken bir şey veya başka bir öğe türü için yanlış görüntüyü yayınlarken hata yapabilir. Yeni bir adla yeni bir dosya yüklemek, bu tür bir sorunu çözmeyecektir, bu maalesef günümüzde giderek daha yaygın olan bir sorundur.
Jake Wilson

Yanıtlar:


136

İyi haberler. Amazon sonunda bir Geçersiz Kılma Özelliği ekledi. API Referansı'na bakın .

Bu, API Referansından alınan örnek bir istektir:

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>

9
Lütfen geçersiz kılmanın biraz zaman alacağını unutmayın (okuduğum bazı blog yazılarına göre görünüşe göre 5-30 dakika).
Michael Warkentin

38
Kendiniz bir API talebinde bulunmak istemiyorsanız, Amazon Konsolunda da oturum açabilir ve orada bir Geçersiz Kılma
j0nes

API'yı kullanarak geçersiz kılanlar için, geçersiz kılmanın yürürlüğe girmesi yaklaşık olarak ne kadar sürüyor?
ill_always_be_a_warriors

21
Aylık ilk 1.000 geçersiz kılma isteğinizden sonra bu ücretin dosya başına 0,005 ABD doları olduğunu unutmayın aws.amazon.com/cloudfront/pricing
TimS

1
@MichaelWarkentin API createInvalidationtalebinde bulunduktan sonra , güncellemenin geçersiz kılınmasının 5-10 dakika kadar sürdüğünü görüyorum. Dikkat edin bu yorumu sizinkinden 4 yıl sonra yazıyorum .
tim peterson

19

Amazon, 19 Mart itibarıyla artık Cloudfront'un önbellek TTL'sinin 0 saniye olmasına izin veriyor, bu nedenle siz (teorik olarak) asla eski nesneleri görmemelisiniz. Öyleyse, varlıklarınızı S3'te bulunduruyorsanız, AWS Web Panel => S3 => Özellikleri Düzenle => Meta Veriye gidip "Cache-Control" değerinizi "max-age = 0" olarak ayarlayabilirsiniz.

Bu, doğrudan API belgelerinden alınmıştır :

CloudFront'un bir nesneyi önbelleğe alıp almayacağını ve ne kadar süreyle önbelleğe alacağını kontrol etmek için, Cache-Control başlığını max-age = yönergesi ile kullanmanızı öneririz. CloudFront nesneyi belirtilen saniye kadar önbelleğe alır. (Minimum değer 0 saniyedir.)


Yeni AWS Konsolu kullanıcı arayüzünde bu ayar nerede? Bulamıyorum
ill_always_be_a_warriors

1
Tek bir dosyanın ayarını buldum, ancak bunu paketime yüklenen herhangi bir şeyin TTL'si 0 olacak şekilde yapacak bir ayar var mı?
ill_always_be_a_warriors

Kova genişliğindeki bir ortamla da kesinlikle ilgilenecek olsam da, bunu daha hızlı / daha iyi bir çözüm buldum. Geçersiz kılma istekleri (API'nin geri kalanıyla birlikte) çok kafa karıştırıcı ve yetersiz belgelenmiştir ve bu anında çalışmadan önce tekerleklerimi 3 saat boyunca döndürdüm.
İki Bit Simyacı

33
Bana deli deyin, ancak TTL'yi 0'a ve maksimum yaşı 0'a ayarlamak, gerçekten CloudFront'u önbelleğe almadan kullanmaktır, bu, tüm istekleri sürekli olarak güncellemeleri kontrol ederek kaynağa iletmez mi? Esasen CDN'yi işe yaramaz hale mi getiriyor?
acidjazz

6
Cloudfront'u, özel bir etki alanına sahip statik SSL etkin bir S3 sitesine sahip olmak için bir mekanizma olarak kullanıyorsanız, önbelleğe alma önemli değildir. Ayrıca, tartıştığımız bu konular, geliştirme aşamalarında 0 kez önbelleğe almanın iyi olduğudur.
Dan G

10

Invalidation API ile birkaç dakika içinde güncellenir. PHP Invalidator'a
göz atın .


Tam olarak aradığım buydu. Git'ten otomatik dağıtım yaparken bunu Beanstalkapp'ın web kancalarına bağlayacağım! Bağlantı için teşekkürler!
cointilt

10

5 dakikada otomatik güncelleme kurulumu

Tamam arkadaşlar. Otomatik CloudFront güncellemesini (geçersiz kılma) gerçekleştirmenin şimdilik mümkün olan en iyi yolu, S3 klasörüne herhangi bir dosya yüklendiğinde (yeni bir tane veya yeniden yazıldığında) her seferinde tetiklenecek olan Lambda işlevi oluşturmaktır.

Daha önce hiç lambda işlevlerini kullanmamış olsanız bile, bu gerçekten çok kolay - adım adım talimatlarımı izleyin ve yalnızca 5 dakika sürecektir:

Aşama 1

Https://console.aws.amazon.com/lambda/home adresine gidin ve lambda işlevi oluştur'u tıklayın.

Adım 2

Boş İşlevi tıklayın (özel)

Aşama 3

Boş (konturlu) kutuya tıklayın ve açılan menüden S3'ü seçin

4. adım

Senin seçin Bucket (CloudFront dağıtımı için aynı)

Adım 5

Bir ayarlama Olay türü "Nesne düzenlendi (All)" için

6. Adım

Önek ve Sonek'i ayarlayın veya ne olduğunu bilmiyorsanız boş bırakın.

7. Adım

Kontrol tetik etkinleştirme onay kutusunu tıklamanız İleri

8. Adım

İşlevinizi adlandırın (örneğin: YourBucketNameS3ToCloudFrontOnCreateAll )

9. Adım

Çalışma Zamanı olarak Python 2.7 (veya üstü) seçin

10. adım

Varsayılan python kodu yerine aşağıdaki kodu yapıştırın:

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. adım

Yeni bir tarayıcı sekmesinde https://console.aws.amazon.com/cloudfront/home sayfasını açın ve sonraki adımda kullanmak üzere CloudFront dağıtım kimliğinizi kopyalayın.

Adım 1/2

Lambda sekmesine dönün ve Python kodunda _YOUR_DISTRIBUTION_ID_ yerine dağıtım kimliğinizi yapıştırın. Çevreleyen alıntıları koruyun.

Adım 13

İşleyiciyi ayarla : lambda_function.lambda_handler

14. adım

Rol birleşik giriş kutusunu tıklayın ve Özel bir rol oluştur'u seçin . Tarayıcıda yeni sekme açılacaktır.

Adım 15

Click görünüm politikası belgesi tıklayın düzenlemek için tıklayın, OK ve (gibidir) Aşağıdaki ile rol tanımını değiştirin:

{
  "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. adım

İzin ver'i tıklayın . Bu sizi lambdaya geri döndürecektir. Yeni oluşturduğunuz rol adının Mevcut rol birleşik giriş kutusunda seçili olduğunu iki kez kontrol edin .

17. Adım

Set Bellek (MB) 128 ve Zaman Aşımı 5 sn.

Adım 18

Click İleri , ardından işlevi oluşturma

Adım 19

Senin gitmen iyidir! Artık herhangi bir dosyayı S3'e her yüklediğinizde / yeniden yüklediğinizde, tüm CloudFront Edge konumlarında değerlendirilecektir.

Not - Test ederken, tarayıcınızın görüntüleri yerel önbellekten değil, CloudFront'tan yüklediğinden emin olun.

PSS - Lütfen, ayda sadece ilk 1000 dosyanın geçersiz kılınmasının ücretsiz olduğunu, limit aşımının her bir geçersiz kılmanın 0,005 USD tutarında olduğunu unutmayın. Ayrıca Lambda işlevi için ek ücretler uygulanabilir, ancak son derece ucuzdur.


Her bir S3 partisindeki son ürün mü?
Phil

@Phil Kod bu şekilde yazılır, böylece sadece yeni yüklenen dosyalar geçersiz kılınacaktır, bütün bir kova değil. Çoklu dosya yükleme durumunda, her biri ayrı ayrı geçersiz kılınacaktır. Tıkır tıkır çalışıyor.
Kainax

Bu kodun beklendiği gibi çalışmasının tek nedeni, S3'ün şu anda bildirim başına yalnızca bir öğe içermesidir, yani dizinin uzunluğu mutlu bir şekilde her zaman 1'dir ve sonuç olarak, tek seferde birden fazla dosya yükleseniz bile, tamamen yeni bir bildirim alırsınız dosya başına. Hiçbir durumda tüm paket için bir bildirim almazsınız. Ne olursa olsun, bu kod yazıldığı şekliyle AWS'nin bu davranışı değiştirmesi durumunda hazır değildir. Uzunluğa bakılmaksızın tüm diziyi işleyen kod yazmak çok daha güvenli, bu benim orijinal (ne yazık ki gözden kaçan) noktamdı.
Phil

AWS'nin olay işleyicileri eklemesinin tek nedeni ... olayları işlemektir. Neden kaldırsınlar? Yeni bir dosyanın nasıl eklendiğinin bir önemi yok, API için olayı tetiklemesi gerekir ve şu anda böyle çalışır ve çalışmaya devam edecektir. AWS'yi 4 yıldır kullanıyorum ve hiçbir şeyi değiştirmedikleri için önceki kod çalışmayı durdurdu. API'yi değiştirseler bile, onu yeni bir bağımsız sürüm olarak değiştirirler, ancak önceki tüm sürümler her zaman desteklenmeye devam eder. Bu özel durumda, kişisel dosya olayının hiçbir zaman kaldırılacağına inanmıyorum. Muhtemelen dünya çapında milyonlarca proje tarafından kullanılmaktadır.
Kainax

İlk yorumunuzu yanlış anlarsam ve 'Miktar': 1'in yalnızca son öğeyi ekleyeceğini kastetmeniz durumunda - dizideki her öğe için FOR döngüsü vardır.
Kainax

9

Bucket Explorer , bunu şimdi oldukça kolaylaştıran bir kullanıcı arayüzüne sahiptir. Bunu nasıl yapacağınız aşağıda açıklanmıştır:

Paketinizi sağ tıklayın. "Dağıtımları Yönet" i seçin.
Dağıtımınıza sağ tıklayın. "Cloudfront geçersiz kılma listesini al" ı seçin, ardından yeni bir geçersiz kılma listesi oluşturmak için "Oluştur" u seçin. Geçersiz kılınacak dosyaları seçin ve "Geçersiz kıl" ı tıklayın. 5-15 dakika bekleyin.


4

Eğer boto yüklediyseniz (sadece python için değil, aynı zamanda bir dizi kullanışlı komut satırı aracı da yüklüyse), cfadminaşağıdaki işlevleri sunan özel olarak veya 'bulut ön yöneticisi' olarak adlandırılan bir komut satırı kullanımı sunar:

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

Aşağıdakileri koşarak olaylara değer biçersiniz:

$sam# cfadmin invalidate <distribution> <path>

Aslında cfadmin, özellikle konsol \ bash \ travis ci dağıtım betiğinden CloudFront önbelleğini sıfırlamanız gerekiyorsa çok yararlı bir araçtır. BTW , travis konuşlandırması sırasında aws'ye yerleştirilirken CoudFront önbelleğinin nasıl sıfırlanacağı \ geçersiz kılınacağı yazıdır
Mikita Manko

3

Sadece bu sayfayı ziyaret eden herkesi (ilk sonuç 'Cloudfront File Refresh'le sonuçlanır) swook.net adresinde kullanımı kolay bir çevrimiçi invalidator olduğunu bildirmek için yayınlayın

Bu yeni invalidator:

  • Tamamen çevrimiçi (kurulum yok)
  • 7x24 kullanılabilir (Google tarafından barındırılır) ve herhangi bir üyelik gerektirmez.
  • Dosyalarınızı kolaylıkla geçersiz kılmanıza izin veren geçmiş desteği ve yol denetimi vardır. (Genellikle ilk kez geçersiz kıldıktan sonra sadece birkaç tıklama ile!)
  • Ayrıca, yayın gönderisini okurken öğreneceğiniz gibi çok güvenlidir .

Tam açıklama: Bunu ben yaptım. İyi eğlenceler!


2
üzgünüm, ama kimlik bilgileri saklanmayan veya saklanmayan "siz" deseniz bile ... kişi kimlik bilgilerini asla üçüncü bir tarafa vermemelidir. Uzak bir amazon kimlik doğrulaması veya başka bir şey uygulanabilir mi?
d.raev

Bunu en azından https'nin arkasına koymalısınız.
Oliver Tynes

Çevrimiçi araçlar genellikle iyidir, ancak üçüncü taraf araca kimlik bilgileri sağlamak geçerli bir güvenlik sorunu olacaktır. Resmi web konsolunu veya resmi CLI aracını kullanmanızı öneririm .
RayLuo

2
Başkalarının güvenliği için, bu yanıtı olumsuz olarak değerlendiriyorum. İnsanlardan asla kimlik bilgilerini
istememelisiniz

3

bunu yapmanın çok kolay bir yolu FOLDER sürümlemedir.

Dolayısıyla, statik dosyalarınız örneğin yüzlerce ise, hepsini yıl + sürüm belirleme olarak adlandırılan bir klasöre koyun.

örneğin, içinde tüm statik dosyalarımın bulunduğu 2014_v1 adlı bir klasör kullanıyorum ...

Bu yüzden HTML'min içinde her zaman referansı klasöre koyarım. (tabii ki klasörün adını belirlediğim bir PHP eklentim var.) Yani 1 dosyada değiştirerek aslında tüm PHP dosyalarımda değişiyor ..

Tam bir yenileme istiyorsam, klasörü 2014_v2 olarak kaynağıma yeniden adlandırırım ve php include içinde 2014_v2 olarak değiştiririm

tüm HTML otomatik olarak değişir ve yeni yolu, cloudfront MISS önbelleğini sorar ve kaynağa talep eder.

Örnek: SOURCE.mydomain.com benim kaynağım, cloudfront.mydomain.com ise cloudfront dağıtımı için CNAME.

PHP bu dosyayı cloudfront.mydomain.com/2014_v1/javascript.js olarak adlandırdı ve tam bir yenileme istediğimde, klasörü kaynakta "2014_v2" olarak yeniden adlandırıyorum ve klasörü "2014_v2" olarak ayarlayarak PHP include'i değiştiriyorum .

Bunun gibi, geçersiz kılma için gecikme ve MALİYET YOKTUR!

Bu, stackoverflow'daki ilk gönderim, umarım iyi yapmışımdır!



2

Yakutta sis mücevherini kullanarak

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

geçersiz kılmada bile, tüm amazon edge sunucularında geçersiz kılmanın işlenmesi ve yenilenmesi 5-10 dakika sürer


Az önce hayatımı kurtardın!
Fábio Batista

2

mevcut AWS CLI, önizleme modunda geçersiz kılmayı destekler. Aşağıdakileri konsolunuzda bir kez çalıştırın:

aws configure set preview.cloudfront true

Web projemi npm kullanarak dağıtıyorum. Bende aşağıdaki komut dosyaları var 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"
}

Yukarıdaki komut dosyalarını yerinde bulundurarak sitenizi aşağıdakilerle dağıtabilirsiniz:

npm run deploy

1
Ben, senin 'aws.invalidate' komutu değişikliği yıldız gerektiğini düşünüyorum --paths /için --paths /*. benimki de seninki gibiydi ve dağıtımı geçersiz
Herald Smit

1

AWS kullanıyorsanız, muhtemelen resmi CLI aracını da kullanırsınız (er ya da geç). AWS CLI sürüm 1.9.12 veya üzeri, dosya adları listesinin geçersiz kılınmasını destekler.

Tam açıklama: Bunu ben yaptım. İyi eğlenceler!


Ölü bağlantı - 404'e yol açar :( ve sürüm notlarında 1.9.12 sürümü eksik olduğundan güncelleyemiyorum ( aws.amazon.com/releasenotes/?tag=releasenotes%23keywords%23cli )
SlyDave

Dostum, bu neredeyse 3 yıl önce yayınlanan bir versiyondu. En son sürümü deneyin ve özellik muhtemelen hala oradadır. (Tam açıklama: Artık AWS CLI üzerinde çalışmıyorum.)
RayLuo

oh biliyorum, sadece tüm sürüm notları arasında sadece 1.9.12'nin mevcut olmaması garip geldi: D (bu bağlantıyı güncelleyememekle ilgili aldığım şeydi). Yorum, benim yaptığım ve AWS CLI için yayın notlarını bulmaya ihtiyaç duyduğum gibi, burada yolu bulan herkes için bir ipucuydu. zarar yok, faul yok.
SlyDave

0

CloudFront'a gidin.

Kimliğinize / Dağıtımlarınıza tıklayın.

Geçersiz Kılmaya tıklayın.

Geçersiz Kılma oluştur'u tıklayın.

Dev örnek kutusuna * yazın ve geçersiz kıl'a tıklayın

Bitti

görüntü açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.