CloudFront 배포 / 파일 업데이트 강제


146

Amazon CloudFront를 사용하여 웹 앱의 정적 파일을 제공하고 있습니다.

Cloudfront 배포에서 파일을 새로 고치거나 새로 고쳐야하는 단일 파일을 가리켜 야한다고 말할 방법이 없습니까?

Amazon 은이 문제의 해결 방법으로 logo_1.gif, logo_2.gif 등과 같은 파일의 버전을 권장하지만 매우 어리석은 해결책 인 것 같습니다. 다른 방법은 없습니까?



참고로, 정적 파일 이름을 그런 식으로 지정하는 것은 어리석지 않다고 생각합니다. 우리는 그것을 많이 사용하고 있으며 버전 제어의 파일 버전마다 자동 이름 바꾸기를 사용하면 많은 두통을 줄일 수 있습니다.
eis

1
교체해야 할 파일이 온라인으로 1000 개의 다른 장소에 링크되어 있지 않으면 @eis. 모든 링크를 업데이트하는 행운을 빕니다.
Jake Wilson

@Jakobud이 경우 링크를 업데이트해야하는 이유는 무엇입니까? 그들은 파일이 변경된 경우 최신 버전이 아닌 특정 버전을 말합니다. 파일이 변경되지 않은 경우 이전처럼 작동합니다.
eis

6
경우에 따라 회사는 법률 회사로부터 게시 중단 통지를 받고 파일을 교체해야하는 항목 또는 다른 유형의 항목에 대해 잘못된 이미지를 게시하는 데 실수를 할 수 있습니다. 단순히 새로운 이름으로 새 파일을 업로드해도 이런 종류의 문제는 해결되지 않을 것입니다. 불행히도 요즘 점점 더 일반적인 문제입니다.
Jake Wilson

답변:


134

좋은 소식. 아마존은 마침내 무효화 기능을 추가했습니다. API 참조 서를 참조하십시오 .

이것은 API Reference의 샘플 요청입니다.

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
무효화에는 다소 시간이 걸릴 수 있습니다 (내가 읽은 일부 블로그 게시물에 따라 5-30 분).
Michael Warkentin

37
API 요청을 직접하지 않으려면 Amazon Console에 로그인하여 여기에서 무효화 요청을 만들 수 있습니다. docs.amazonwebservices.com/AmazonCloudFront/latest/…
j0nes

API를 사용하여 무효화를 수행하는 사용자에게는 무효화가 적용되는 데 대략 얼마나 걸립니까?
ill_always_be_a_warriors

20
매월 처음 1,000 건의 무효화 요청이 발생한 후 파일 당 0.005 USD의 비용이 발생합니다. aws.amazon.com/cloudfront/pricing
TimS

1
@MichaelWarkentin API createInvalidation요청을 한 후에도 여전히 업데이트가 5-10 분 정도 걸리므로 무효화됩니다. 이 의견 은 귀하의 4 년 후에 작성합니다.
팀 피터슨

19

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 초입니다.)


새 AWS Console UI에서이 설정은 어디에 있습니까? 찾을 수 없습니다.
ill_always_be_a_warriors

1
개별 파일에 대한 설정을 찾았지만 버킷에 업로드 된 항목의 TTL이 0이되도록 설정하는 설정이 있습니까?
ill_always_be_a_warriors

버킷 전체 설정에도 관심이 있지만 이것이 더 빠르고 더 나은 솔루션이라는 것을 알았습니다. 무효화 요청 (나머지 API와 함께)은 매우 혼란스럽고 문서화가 잘되어 있지 않기 때문에 즉시 작동하기 전에 3 시간 동안 바퀴를 회전 시켰습니다.
2 비트 연금술사

33
미친 듯이 전화하지만 TTL을 0으로 설정하고 최대 연령을 0으로 설정하면 실제로 캐싱없이 CloudFront를 사용하고 있습니다. 그러면 모든 요청을 지속적으로 업데이트를 확인하는 원본으로 전달하지 않습니까? 본질적으로 CDN을 쓸모 없게 만드십니까?
acidjazz

6
클라우드 도메인을 사용자 지정 도메인이있는 정적 SSL 사용 S3 사이트를 갖는 메커니즘으로 사용하는 경우 캐싱은 중요하지 않습니다. 또한 우리가 논의하고있는 이러한 문제는 개발 단계에서 0 번 캐싱이 좋다는 것입니다.
Dan G

10

무효화 API를 사용하면 몇 분 안에 업데이트됩니다. PHP Invalidator를
확인하십시오 .


이것이 바로 내가 찾던 것입니다. git에서 자동 배포 할 때 Beanstalkapp의 웹 후크에 이것을 연결할 것입니다! 링크 주셔서 감사합니다!
cointilt

10

5 분 안에 자동 업데이트 설정

알았어 이제 자동 CloudFront 업데이트 (무효화)를 수행하는 가장 좋은 방법은 파일이 S3 버킷 (새 파일 또는 다시 작성)에 업로드 될 때마다 트리거되는 Lambda 함수를 만드는 것입니다.

이전에 람다 함수를 사용한 적이 없어도 정말 쉽습니다. 단계별 지침을 따르면 5 분 정도 걸립니다.

1 단계

https://console.aws.amazon.com/lambda/home으로 이동하여 람다 함수 생성을 클릭 하십시오.

2 단계

빈 기능 (사용자 정의)을 클릭하십시오

3 단계

빈 상자를 클릭하고 콤보 에서 S3 을 선택하십시오.

4 단계

버킷 선택 (CloudFront 배포와 동일)

5 단계

설정 이벤트 유형을 "개체 생성 (전체)"에

6 단계

접두사와 접미사를 설정 하거나 모르는 경우 비워 두십시오.

7 단계

확인 트리거 활성화 확인란을 클릭 다음을

8 단계

함수 이름을 지정하십시오 ( YouBucketNameS3ToCloudFrontOnCreateAll 등 ).

9 단계

선택 파이썬 2.7 로 (또는 그 이상) 런타임

10 단계

기본 파이썬 코드 대신 다음 코드를 붙여 넣습니다.

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 단계

람다 탭으로 돌아가서 _YOUR_DISTRIBUTION_ID_ 대신 배포 ID를 Python 코드에 붙여 넣으십시오. 인용 부호를 유지하십시오.

13 단계

핸들러 설정 : lambda_function.lambda_handler

14 단계

역할 콤보 상자를 클릭 하고 사용자 정의 역할 작성을 선택 하십시오 . 브라우저의 새 탭이 열립니다.

15 단계

클릭 보기 정책 문서를 클릭, 편집을 클릭, 확인 하고 (있는 그대로) 다음과 역할 정의를 대체 :

{
  "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-한 달에 처음 1000 개의 파일 무효화는 무료이며 각 무효화는 한도 $ 0.005 USD입니다. Lambda 기능에 대한 추가 요금이 적용될 수도 있지만 매우 저렴합니다.


각 S3 배치의 마지막 항목입니까?
Phil

@Phil 코드는 그런 식으로 작성되므로 전체 업로드 된 파일이 아니라 새로 업로드 된 파일 만 무효화됩니다. 여러 파일을 업로드 할 경우 각 파일이 개별적으로 무효화됩니다. 매력처럼 작동합니다.
Kainax

이 코드가 예상대로 작동하는 유일한 이유는 S3가 현재 알림 당 하나의 항목 만 포함했기 때문입니다. 즉, 배열의 길이는 항상 1이므로 여러 파일을 한 번에 업로드하더라도 완전히 새로운 알림을받습니다 파일 당. 어떤 경우에도 전체 버킷에 대한 알림을받지 않습니다. 그럼에도 불구하고, 작성된이 코드는 AWS가 해당 동작을 변경해야 할 준비가되지 않았습니다. 길이에 관계없이 전체 배열을 처리하는 코드를 작성하는 것이 훨씬 안전합니다.
Phil

AWS가 이벤트 핸들러를 추가하는 유일한 이유는 ... 음 ... 이벤트를 처리하는 것입니다. 왜 제거할까요? 새 파일이 추가 된 방식에 관계없이 API에 대한 이벤트를 트리거해야하며 이것이 현재 작동하는 방식이며 계속 작동합니다. 나는 4 년 동안 AWS를 사용하고 있으며 이전 코드가 작동을 멈추도록 변경하지 않았습니다. API를 변경하더라도 새로운 독립형 버전으로 변경했지만 모든 이전 버전은 항상 지원됩니다. 이 특별한 경우에는 개인 파일 이벤트가 제거 될 것이라고 믿지 않습니다. 아마도 전 세계 수백만 개의 프로젝트에서 이미 사용되었을 것입니다.
Kainax

첫 번째 주석을 잘못 이해하고 '수량': 1 은 마지막 항목 만 추가 한다는 것을 의미하는 경우 배열의 모든 항목에 대해 FOR 루프가 있습니다.
Kainax

9

버킷 익스플로러 는 이제 이것을 쉽게 할 수있는 UI를 가지고 있습니다. 방법은 다음과 같습니다.

버킷을 마우스 오른쪽 버튼으로 클릭하십시오. "배포 관리"를 선택하십시오.
배포판을 마우스 오른쪽 버튼으로 클릭하십시오. "Cloudfront 무효화 목록 가져 오기"를 선택한 다음 "생성"을 선택하여 새 무효화 목록을 만듭니다. 무효화 할 파일을 선택하고 "유효하지 않음"을 클릭하십시오. 5-15 분 기다립니다.


4

boto가 설치되어 있다면 (파이썬뿐만 아니라 많은 유용한 명령 줄 유틸리티도 설치합니다) 특별히 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>

실제로 cfadmin은 특히 콘솔 \ bash \ travis ci 배포 스크립트에서 CloudFront 캐시를 재설정해야하는 경우 매우 유용한 도구입니다. BTW 여기에있다 다시 설정하는 방법 포스트는 \ 무효화 CoudFront 캐시 AWS에 트래비스 배포 중
Mikita Manko

3

이 페이지를 방문하는 모든 사람 ( 'Cloudfront File Refresh'의 첫 번째 결과)에게 사용하기 쉬운 액세스 권한이 있음을 알리기 위해 게시 swook.net에서 가능한 온라인 무효화 기가 있음을

이 새로운 무효 기는 다음과 같습니다.

  • 완전 온라인 (설치 없음)
  • 연중 무휴 (Google에서 호스팅)로 사용할 수 있으며 멤버십이 필요하지 않습니다.
  • 파일을 쉽게 무효화 할 수 있도록 기록 지원 및 경로 확인이 있습니다. (처음 무효화 한 후 몇 번의 클릭만으로도 종종 발생합니다!)
  • 릴리스 게시물을 읽을 때 알 수 있으므로 매우 안전 합니다.

전체 공개 : 나는 이것을했다. 즐기세요!


2
미안하지만 자격 증명이 저장되거나 파열되지 않은 "당신이 말하는"조차도 ... 타자에게 자신의 자격 증명을 제공해서는 안됩니다. 원격 아마존 인증 또는 무언가를 구현할 수 있습니까?
d.raev

적어도 https 뒤에 배치해야합니다.
Oliver Tynes

온라인 도구는 일반적으로 훌륭하지만 타사 도구에 자격 증명을 제공하는 것이 유효한 보안 문제입니다. 공식 웹 콘솔 또는 공식 CLI 도구 를 사용하는 것이 좋습니다 .
RayLuo

2
다른 사람들의 안전을 위해이 답변을 하향 조정하고 있습니다. 사람들에게 자격 증명을 요구해서는 안됩니다.
Moataz Elmasry

3

가장 쉬운 방법은 폴더 버전 관리입니다.

예를 들어 정적 파일이 수백 개라면 연중 + 버전 지정이라는 폴더에 모든 파일을 넣으십시오.

예를 들어 2014_v1이라는 폴더를 사용합니다. 여기서 내부에 모든 정적 파일이 있습니다 ...

그래서 내 HTML 안에 항상 폴더에 대한 참조를 넣습니다. (물론 폴더 이름을 설정 한 위치에 PHP가 포함되어 있습니다.) 따라서 1 개의 파일을 변경하면 실제로는 모든 PHP 파일에서 변경됩니다.

완전한 새로 고침을 원하면 폴더의 이름을 2014_v2로 바꾸고 PHP 내부에서 2014_v2로 변경하십시오.

모든 HTML은 자동으로 새로운 경로 인 cloudfront MISS 캐시를 변경하여 소스에 요청합니다.

예 : SOURCE.mydomain.com은 내 소스이고 cloudfront.mydomain.com은 CNAME에서 cloudfront 배포입니다.

따라서 PHP는이 파일을 cloudfront.mydomain.com/2014_v1/javascript.js라고 부르고 전체 새로 고침을 원할 때 간단히 폴더의 이름을 "2014_v2"로 바꾸고 폴더를 "2014_v2"로 설정하여 PHP include를 변경하십시오. .

이와 같이 무효화에 대한 지연이없고 비용이 없습니다!

이것은 stackoverflow의 첫 번째 게시물입니다.



2

루비에서 안개 보석 사용

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 Server에서 무효화를 처리하고 새로 고치는 데 여전히 5-10 분이 걸립니다.


당신은 내 생명을 구했습니다!
Fábio Batista 2016 년

2

미리보기 모드에서 현재 AWS CLI 지원 무효화. 콘솔에서 다음을 한 번 실행하십시오.

aws configure set preview.cloudfront true

npm을 사용하여 웹 프로젝트를 배포합니다. 내 스크립트에는 다음과 같은 스크립트가 있습니다 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

1
'aws.invalidate'명령에 별표가 필요하다고 생각합니다 .로 변경 --paths /하십시오 --paths /*. 광산은 또한 당신과 같았으며 배포를 무효화하지 않았습니다 ...
Herald Smit

1

AWS를 사용하는 경우 공식 CLI 도구 (수퍼 이상)를 사용할 수도 있습니다. AWS CLI 버전 1.9.12 이상은 파일 이름 목록 무효화를 지원합니다.

전체 공개 : 나는 이것을했다. 즐기세요!


데드 링크-404로 이어집니다. (버전 1.9.12가 릴리스 노트에서 누락되어 업데이트 할 수 없습니다 ( aws.amazon.com/releasenotes/?tag=releasenotes%23keywords%23cli )
SlyDave

Duat, thtat은 거의 3 년 전에 출시 된 버전입니다. 최신 버전을 사용하면 기능이 여전히있을 수 있습니다. (전체 공개 : 더 이상 AWS CLI에서 작업하지 않습니다.)
RayLuo

오, 나는 단지 모든 릴리즈 노트 중 1.9.12만이 존재하지 않는 것이 이상하다는 것을 알았습니다. 이 의견은 AWS CLI 릴리스 노트를 찾아야했던 것처럼 여기에서 찾은 사람에게 힌트가되었습니다. 해를 끼치 지 않고 파울도 없습니다.
SlyDave

0

CloudFront로 이동하십시오.

ID / 배포를 클릭하십시오.

무효화를 클릭하십시오.

무효화 생성을 클릭합니다.

거대한 예제 상자에 *를 입력하고 무효화를 클릭하십시오.

끝난

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.