Amazon CloudFront를 사용하여 웹 앱의 정적 파일을 제공하고 있습니다.
Cloudfront 배포에서 파일을 새로 고치거나 새로 고쳐야하는 단일 파일을 가리켜 야한다고 말할 방법이 없습니까?
Amazon 은이 문제의 해결 방법으로 logo_1.gif, logo_2.gif 등과 같은 파일의 버전을 권장하지만 매우 어리석은 해결책 인 것 같습니다. 다른 방법은 없습니까?
Amazon CloudFront를 사용하여 웹 앱의 정적 파일을 제공하고 있습니다.
Cloudfront 배포에서 파일을 새로 고치거나 새로 고쳐야하는 단일 파일을 가리켜 야한다고 말할 방법이 없습니까?
Amazon 은이 문제의 해결 방법으로 logo_1.gif, logo_2.gif 등과 같은 파일의 버전을 권장하지만 매우 어리석은 해결책 인 것 같습니다. 다른 방법은 없습니까?
답변:
좋은 소식. 아마존은 마침내 무효화 기능을 추가했습니다. 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>
createInvalidation
요청을 한 후에도 여전히 업데이트가 5-10 분 정도 걸리므로 무효화됩니다. 이 의견 은 귀하의 4 년 후에 작성합니다.
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 초입니다.)
무효화 API를 사용하면 몇 분 안에 업데이트됩니다. PHP Invalidator를
확인하십시오 .
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 기능에 대한 추가 요금이 적용될 수도 있지만 매우 저렴합니다.
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>
이 페이지를 방문하는 모든 사람 ( 'Cloudfront File Refresh'의 첫 번째 결과)에게 사용하기 쉬운 액세스 권한이 있음을 알리기 위해 게시 swook.net에서 가능한 온라인 무효화 기가 있음을
이 새로운 무효 기는 다음과 같습니다.
전체 공개 : 나는 이것을했다. 즐기세요!
가장 쉬운 방법은 폴더 버전 관리입니다.
예를 들어 정적 파일이 수백 개라면 연중 + 버전 지정이라는 폴더에 모든 파일을 넣으십시오.
예를 들어 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의 첫 번째 게시물입니다.
TTL = 1 시간으로 설정하고 교체
http://developer.amazonwebservices.com/connect/ann.jspa?annID=655
루비에서 안개 보석 사용
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 분이 걸립니다.
미리보기 모드에서 현재 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
--paths /
하십시오 --paths /*
. 광산은 또한 당신과 같았으며 배포를 무효화하지 않았습니다 ...
AWS를 사용하는 경우 공식 CLI 도구 (수퍼 이상)를 사용할 수도 있습니다. AWS CLI 버전 1.9.12 이상은 파일 이름 목록 무효화를 지원합니다.
전체 공개 : 나는 이것을했다. 즐기세요!