Buộc cập nhật tệp / phân phối CloudFront


146

Tôi đang sử dụng CloudFront của Amazon để phục vụ các tệp tĩnh của ứng dụng web của mình.

Có cách nào để nói với một bản phân phối trên nền tảng đám mây rằng nó cần làm mới tệp của nó hoặc chỉ ra một tệp duy nhất cần được làm mới không?

Amazon khuyên bạn nên phiên bản các tệp của mình như logo_1.gif, logo_2.gif và như một cách giải quyết cho vấn đề này nhưng đó có vẻ là một giải pháp khá ngu ngốc. Có hoàn toàn không có cách nào khác?



như một sidenote, tôi không nghĩ thật ngu ngốc khi đặt tên các tệp tĩnh như thế. Chúng tôi đã sử dụng nó rất nhiều và tự động đổi tên theo phiên bản tệp trong kiểm soát phiên bản đã giúp chúng tôi đỡ đau đầu.
eis

1
@eis trừ khi tệp bạn cần thay thế đã được liên kết đến 1000 địa điểm khác nhau trực tuyến. Chúc may mắn nhận được tất cả các liên kết được cập nhật.
Jake Wilson

@Jakobud tại sao các liên kết nên được cập nhật trong trường hợp đó? họ đang đề cập đến phiên bản cụ thể, không phải là phiên bản mới nhất, nếu tệp đã bị thay đổi. Nếu tệp không được thay đổi, nó sẽ hoạt động như trước.
eis

6
Trong một số trường hợp, một công ty có thể mắc lỗi trong việc đăng hình ảnh sai cho một thứ gì đó hoặc một loại mặt hàng khác mà họ nhận được thông báo gỡ xuống từ một công ty luật và phải thay thế tệp. Chỉ cần tải lên một tệp mới với một tên mới sẽ không khắc phục được loại vấn đề đó, thật không may là một vấn đề ngày càng phổ biến hiện nay.
Jake Wilson

Câu trả lời:


134

Tin tốt. Amazon cuối cùng đã thêm một tính năng vô hiệu. Xem tài liệu tham khảo API .

Đây là một yêu cầu mẫu từ Tham chiếu 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>

9
Xin lưu ý rằng việc vô hiệu hóa sẽ mất một thời gian (dường như 5-30 phút theo một số bài đăng trên blog tôi đã đọc).
Michael Warkentin

37
Nếu bạn không muốn tự mình thực hiện một yêu cầu API, bạn cũng có thể đăng nhập vào Bảng điều khiển Amazon và tạo một yêu cầu Không hợp lệ tại đó: docs.amazonwebservice.com/AmazonCloudFront/latest/iêu
j0nes

Đối với những người sử dụng API để thực hiện việc vô hiệu hóa, mất bao lâu để việc vô hiệu hóa có hiệu lực?
ill_always_be_a_warriors

20
Hãy nhớ chi phí này $ 0,005 cho mỗi tệp sau 1.000 yêu cầu vô hiệu đầu tiên của bạn mỗi tháng aws.amazon.com/cloudfront/pricing
TimS

1
@MichaelWarkentin Sau khi thực hiện createInvalidationyêu cầu API , tôi vẫn thấy bản cập nhật mất 5-10 phút hoặc lâu hơn để vô hiệu hóa. Lưu ý tôi viết bình luận này 4 năm sau bạn.
tim peterson

19

Kể từ ngày 19 tháng 3, Amazon hiện cho phép bộ nhớ cache của Cloudfront là 0 giây, do đó, về mặt lý thuyết, bạn sẽ không bao giờ nhìn thấy các vật thể cũ. Vì vậy, nếu bạn có tài sản của mình trong S3, bạn chỉ cần truy cập Bảng điều khiển web AWS => S3 => Chỉnh sửa thuộc tính => Siêu dữ liệu, sau đó đặt giá trị "Điều khiển bộ đệm" của bạn thành "max-age = 0".

Đây là trực tiếp từ tài liệu API :

Để kiểm soát xem CloudFront có lưu trữ một đối tượng hay không và trong bao lâu, chúng tôi khuyên bạn nên sử dụng tiêu đề Cache-Control với lệnh max-age = directive. CloudFront lưu trữ đối tượng trong số giây đã chỉ định. (Giá trị tối thiểu là 0 giây.)


Cài đặt này ở đâu trong Giao diện người dùng AWS Console mới? Tôi không thể tìm thấy nó.
ill_always_be_a_warriors

1
Tôi đã tìm thấy cài đặt cho một tệp riêng lẻ, nhưng có cài đặt nào để làm cho nó sao cho mọi thứ được tải lên nhóm của tôi có chỉ số 0 không?
ill_always_be_a_warriors

Mặc dù tôi cũng chắc chắn sẽ quan tâm đến một thiết lập toàn thùng, tôi thấy đây là một giải pháp nhanh hơn / tốt hơn. Các yêu cầu không hợp lệ (cùng với phần còn lại của API) rất khó hiểu và được ghi lại kém, và tôi quay bánh xe của mình trong 3 giờ trước khi điều này hoạt động ngay lập tức.
Nhà giả kim hai bit

33
Gọi tôi là điên nhưng cài đặt TTL thành 0 và tuổi tối đa thành 0 thực sự sử dụng CloudFront mà không lưu vào bộ đệm, điều đó có chuyển tiếp tất cả các yêu cầu đến nguồn gốc liên tục kiểm tra các bản cập nhật không? Thực chất làm cho CDN trở nên vô dụng?
acidjazz

6
Nếu bạn chỉ sử dụng cloudfront như một cơ chế để có một trang web S3 hỗ trợ SSL tĩnh với một miền tùy chỉnh, thì bộ nhớ đệm không thành vấn đề. Ngoài ra, những vấn đề chúng tôi đang thảo luận là trong các giai đoạn phát triển bộ nhớ đệm 0 lần là tốt.
Dan G

10

Với API không hợp lệ, nó sẽ được cập nhật sau vài phút.
Kiểm tra Trình xác thực PHP .


Điều này thật đúng với gì mà tôi đã tìm kiếm. Tôi sẽ kết nối điều này trong hook-web của Beanstalkapp khi tự động triển khai từ git! Cảm ơn các liên kết!
cointilt

10

Thiết lập cập nhật tự động trong 5 phút

Được rồi các chàng trai. Cách tốt nhất có thể để thực hiện cập nhật CloudFront tự động (không hợp lệ) là tạo chức năng Lambda sẽ được kích hoạt mỗi khi bất kỳ tệp nào được tải lên nhóm S3 (một tệp mới hoặc viết lại).

Ngay cả khi bạn chưa bao giờ sử dụng các chức năng lambda trước đây, điều này thực sự dễ dàng - chỉ cần làm theo các hướng dẫn từng bước của tôi và sẽ chỉ mất 5 phút:

Bước 1

Truy cập https://console.aws.amazon.com/lambda/home và nhấp vào Tạo chức năng lambda

Bước 2

Nhấp vào Chức năng trống (tùy chỉnh)

Bước 3

Nhấp vào hộp trống (vuốt) và chọn S3 từ kết hợp

Bước 4

Chọn bạn Bucket (giống như để phân phối CloudFront)

Bước 5

Đặt Loại sự kiện thành "Đối tượng được tạo (Tất cả)"

Bước 6

Đặt Tiền tố và Hậu tố hoặc để trống nếu bạn không biết nó là gì.

Bước 7

Chọn hộp kiểm Kích hoạt và nhấp vào Tiếp theo

Bước 8

Đặt tên cho chức năng của bạn (đại loại như: YourBucketNameS3ToCloudFrontOnCreate ALL )

Bước 9

Chọn Python 2.7 (hoặc mới hơn) làm Thời gian chạy

Bước 10

Dán mã sau thay vì mã python mặc định:

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

Bước 11

Mở https://console.aws.amazon.com/cloudfront/home trong tab trình duyệt mới và sao chép ID phân phối CloudFront của bạn để sử dụng trong bước tiếp theo.

Bước 12

Quay trở lại tab lambda và dán id phân phối của bạn thay vì _YOUR_DISTRIBNING_ID_ trong mã Python. Giữ báo giá xung quanh.

Bước 13

Đặt trình xử lý : lambda_feft.lambda_handler

Bước 14

Nhấp vào hộp tổ hợp vai trò và chọn Tạo vai trò tùy chỉnh . Tab mới trong trình duyệt sẽ được mở.

Bước 15

Bấm xem tài liệu chính sách , bấm chỉnh sửa , bấm OK và thay thế định nghĩa vai trò bằng sau (như hiện tại):

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

Bước 16

Bấm cho phép . Điều này sẽ đưa bạn trở lại một lambda. Kiểm tra kỹ tên vai trò mà bạn vừa tạo được chọn trong hộp tổ hợp vai trò hiện có .

Bước 17

Đặt Bộ nhớ (MB) thành 128 và Hết giờ thành 5 giây.

Bước 18

Bấm vào Tiếp theo , sau đó bấm Tạo chức năng

Bước 19

Bạn tốt để đi! Giờ đây, mỗi lần bạn tải lên / tải lại bất kỳ tệp nào lên S3, nó sẽ được đánh giá ở tất cả các vị trí của CloudFront Edge.

Tái bút - Khi bạn đang kiểm tra, hãy đảm bảo rằng trình duyệt của bạn đang tải hình ảnh từ CloudFront chứ không phải từ bộ đệm cục bộ.

PSS - Xin lưu ý rằng chỉ có vô hiệu hóa 1000 tệp đầu tiên mỗi tháng là miễn phí, mỗi lần vô hiệu hóa vượt quá giới hạn $ 0,005 USD. Ngoài ra phí bổ sung cho chức năng Lambda có thể được áp dụng, nhưng nó cực kỳ rẻ.


Chỉ là mục cuối cùng từ mỗi đợt S3?
Phil

@Phil Mã được viết theo cách đó để chỉ các tệp mới tải lên sẽ bị vô hiệu, không phải toàn bộ nhóm. Trong trường hợp tải lên nhiều tệp, mỗi tệp sẽ bị vô hiệu riêng. Hoạt động như một lá bùa.
Kainax

Lý do duy nhất mã này hoạt động như mong đợi là vì S3 hiện chỉ bao gồm một mục cho mỗi thông báo, nghĩa là độ dài của mảng luôn luôn vui vẻ 1 và do đó, ngay cả khi bạn tải lên nhiều tệp trong một lần, bạn sẽ nhận được thông báo hoàn toàn mới mỗi tập tin. Bạn không nhận được thông báo cho toàn bộ xô trong mọi trường hợp. Dù sao đi nữa, mã này khi được viết chưa sẵn sàng nên AWS thay đổi hành vi đó. An toàn hơn nhiều để viết mã xử lý toàn bộ mảng, bất kể độ dài, đó là điểm ban đầu (đáng buồn bỏ lỡ) của tôi.
Phil

Lý do duy nhất tại sao AWS thêm trình xử lý sự kiện là ... à ... để xử lý các sự kiện. Tại sao họ sẽ loại bỏ nó? Bất kể một tệp mới đã được thêm vào như thế nào, nó sẽ kích hoạt sự kiện cho API và đó là cách nó hoạt động ngay bây giờ và sẽ tiếp tục hoạt động. Tôi đang sử dụng AWS được 4 năm và họ không bao giờ thay đổi điều gì nên mã trước đó đã ngừng hoạt động. Ngay cả khi họ thay đổi API, họ sẽ thay đổi phiên bản độc lập mới, nhưng tất cả các phiên bản trước vẫn luôn được hỗ trợ. Trong trường hợp cụ thể đó, tôi không tin rằng sự kiện tệp cá nhân sẽ bị xóa. Nó có thể đã được sử dụng bởi hàng triệu dự án trên toàn thế giới.
Kainax

Trong trường hợp nếu tôi hiểu nhầm nhận xét đầu tiên của bạn và bạn có nghĩa là 'Số lượng': 1 sẽ chỉ thêm mục cuối cùng - có vòng lặp FOR cho mỗi mục trong mảng.
Kainax

9

Xô Explorer có một giao diện người dùng làm cho việc này khá dễ dàng. Đây là cách thực hiện:

Nhấp chuột phải vào xô của bạn. Chọn "Quản lý phân phối."
Nhấp chuột phải vào bản phân phối của bạn. Chọn "Nhận danh sách vô hiệu hóa Cloudfront" Sau đó chọn "Tạo" để tạo danh sách vô hiệu hóa mới. Chọn các tệp để vô hiệu hóa và nhấp vào "Không hợp lệ." Đợi 5-15 phút.


4

Nếu bạn đã cài đặt boto (không chỉ dành cho python, mà còn cài đặt một loạt các tiện ích dòng lệnh hữu ích), nó cung cấp một dòng lệnh được sử dụng cụ thể được gọi là cfadminhoặc 'quản trị viên đám mây' cung cấp các chức năng sau:

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

Bạn bất biến mọi thứ bằng cách chạy:

$sam# cfadmin invalidate <distribution> <path>

Trên thực tế cfadmin là một công cụ rất hữu ích, đặc biệt nếu bạn cần đặt lại bộ đệm của CloudFront từ tập lệnh triển khai console \ bash \ travis ci. BTW ở đây là bài viết làm thế nào để thiết lập lại \ không hợp lệ bộ đệm CoudFront trong quá trình triển khai travis thành aws
Mikita Manko

3

Chỉ cần đăng bài để thông báo cho bất kỳ ai truy cập trang này (kết quả đầu tiên trên 'Làm mới tệp trên nền tảng đám mây') rằng có quyền truy cập + dễ sử dụng vô hiệu hóa trực tuyến có sẵn tại swook.net

Trình vô hiệu hóa mới này là:

  • Hoàn toàn trực tuyến (không cần cài đặt)
  • Có sẵn 24x7 (được lưu trữ bởi Google) và không yêu cầu bất kỳ thành viên nào.
  • Có hỗ trợ lịch sử và kiểm tra đường dẫn để cho phép bạn vô hiệu hóa các tệp của mình một cách dễ dàng. (Thường chỉ với một vài lần nhấp sau khi vô hiệu hóa lần đầu tiên!)
  • Nó cũng rất an toàn, như bạn sẽ tìm ra khi đọc bài phát hành của nó .

Tiết lộ đầy đủ: Tôi đã thực hiện điều này. Chúc vui vẻ!


2
xin lỗi, nhưng ngay cả "bạn nói" thông tin đăng nhập không được lưu trữ hoặc được thực hiện ... người ta không bao giờ nên cung cấp thông tin của mình cho bên thứ ba. Có thể được thực hiện một xác thực amazon từ xa hoặc một cái gì đó?
d.raev

Bạn nên đặt cái này phía sau https ít nhất.
Oliver Tynes

Các công cụ trực tuyến nhìn chung rất hay, nhưng việc cung cấp thông tin đăng nhập cho công cụ của bên thứ 3 sẽ là mối quan tâm bảo mật hợp lệ. Tôi sẽ đề nghị sử dụng bảng điều khiển web chính thức hoặc công cụ CLI chính thức .
RayLuo

2
Vì sự an toàn của người khác, tôi đánh giá thấp câu trả lời này. Bạn không bao giờ nên hỏi mọi người về thông tin đăng nhập của họ
Moataz Elmasry

3

một cách rất dễ dàng để làm điều đó là phiên bản FOLDER.

Vì vậy, nếu các tệp tĩnh của bạn là hàng trăm chẳng hạn, chỉ cần đặt tất cả chúng vào một thư mục được gọi theo năm + phiên bản.

ví dụ tôi sử dụng một thư mục có tên 2014_v1 trong đó tôi có tất cả các tệp tĩnh ...

Vì vậy, bên trong HTML của tôi, tôi luôn đặt tham chiếu đến thư mục. (tất nhiên tôi có một PHP bao gồm nơi tôi đã đặt tên của thư mục.) Vì vậy, bằng cách thay đổi trong 1 tệp, nó thực sự thay đổi trong tất cả các tệp PHP của tôi ..

Nếu tôi muốn làm mới hoàn toàn, tôi chỉ cần đổi tên thư mục thành 2014_v2 thành nguồn của mình và thay đổi bên trong php bao gồm thành 2014_v2

tất cả HTML tự động thay đổi và yêu cầu đường dẫn mới, bộ đệm MISS trên nền tảng đám mây và yêu cầu nó đến nguồn.

Ví dụ: SOURCE.mydomain.com là nguồn của tôi, cloudfront.mydomain.com là CNAME để phân phối trên nền tảng đám mây.

Vì vậy, PHP đã gọi tệp này là cloudfront.mydomain.com/2014_v1/javascript.js và khi tôi muốn làm mới hoàn toàn, chỉ cần tôi đổi tên thư mục thành nguồn thành "2014_v2" và tôi thay đổi PHP bao gồm bằng cách đặt thư mục thành "2014_v2" .

Như thế này không có sự chậm trễ cho sự vô hiệu và KHÔNG CHI PHÍ!

Đây là bài viết đầu tiên của tôi trong stackoverflow, hy vọng tôi đã làm tốt!



2

Trong ruby, sử dụng đá quý sương mù

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

ngay cả khi không hợp lệ, vẫn mất 5-10 phút để quá trình vô hiệu hóa xử lý và làm mới trên tất cả các máy chủ cạnh amazon


Bạn vừa cứu mạng tôi!
Fábio Batista

2

AWS CLI hiện tại hỗ trợ không hợp lệ trong chế độ xem trước. Chạy các mục sau trong bảng điều khiển của bạn một lần:

aws configure set preview.cloudfront true

Tôi triển khai dự án web của mình bằng cách sử dụng npm. Tôi có các đoạn script sau trong 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"
}

Có các tập lệnh ở trên, bạn có thể triển khai trang web của mình với:

npm run deploy

1
Tôi nghĩ bạn cần dấu hoa thị trong lệnh 'aws.invalidate' của mình, đổi --paths /thành --paths /*. của tôi cũng giống như của bạn và nó không làm mất hiệu lực phân phối ...
Herald Smit

1

Nếu bạn đang sử dụng AWS, có lẽ bạn cũng sử dụng công cụ CLI chính thức của nó (sớm hay muộn). AWS CLI phiên bản 1.9.12 trở lên hỗ trợ vô hiệu hóa danh sách tên tệp.

Tiết lộ đầy đủ: Tôi đã thực hiện điều này. Chúc vui vẻ!


Liên kết chết - dẫn đến 404 :( và tôi không thể cập nhật nó vì phiên bản 1.9.12 bị thiếu trong ghi chú phát hành ( aws.amazon.com/releasenotes/?tag=releasenotes%23keywords%23cli )
SlyDave

Dude, thtat là một phiên bản được phát hành gần 3 năm trước. Hãy thử phiên bản mới nhất và tính năng có thể vẫn còn đó. (Tiết lộ đầy đủ: Tôi không còn làm việc trên AWS CLI nữa.)
RayLuo

ồ tôi biết, chỉ thấy kỳ lạ là trong tất cả các bản phát hành, chỉ có 1.9.12 không tồn tại: D (đó là những gì tôi nhận được về việc không thể cập nhật liên kết). Nhận xét này là một gợi ý cho bất cứ ai tìm thấy ở đây, giống như tôi đã làm và cần phải tìm các bản phát hành cho AWS CLI. không có hại, không hôi
SlyDave

0

Chuyển đến CloudFront.

Nhấp vào ID / Phân phối của bạn.

Bấm vào Vô hiệu.

Nhấp vào tạo Vô hiệu.

Trong hộp ví dụ khổng lồ gõ * và bấm không hợp lệ

Làm xong

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.