S3 Origin이있는 AWS CloudFront의 파일에 대한 캐시 제어 헤더 없음


27

방금 Amazon AWS로 마이그레이션했습니다. 현재 잘 작동하는 EC2 인스턴스가 있습니다. 앞에서 Nginx를 실행하고 백엔드에서 Apache를 실행합니다. 그것도 잘 돌아가고 있습니다. 모든 사이트가 올바르게 시작되고 EC2에서 제공되는 파일에 대한 Cache-Control 헤더가 포함됩니다.

CloudFront CDN을 통해 액세스하는 Amazon S3에 배치 한 모든 정적 파일에 문제가 있습니다 . 파일에 잘 액세스 할 수 있지만 CORS에는 문제가 없지만 CloudFront는 Cache-Control 헤더가있는 파일을 제공하지 않습니다. 브라우저 캐싱을 활용하고 싶습니다.

내가 보는 것처럼 EC2 인스턴스는 정적 파일이 S3 + CloudFront에서 직접 제공되므로 요청이 EC2의 웹 서버로 이동하지 않으므로 여기서는 역할을하지 않습니다.

나는 완전히 길을 잃었다.

질문 : 1)이 경우 Cache-Control을 어떻게 설정합니까? 2) 캐시 제어를 설정할 수 있습니까? S3 또는 CloudFront에서?

참고 : 개별 객체에 대해 S3에서 헤더를 설정할 수있는 Google의 몇 페이지를 쳤습니다. 내 경우에는 여러 객체에 대해 이야기하기 때문에 특별히 생산적으로 수행하는 방법은 아닙니다.

감사!


S3의 객체 URL과 해당 CloudFront URL을 게시하십시오. 당신이 묘사 한 행동을보고 싶습니다. 또는 헤더를 표시하는 CURL을 모두 게시하십시오.
Tim

console.aws.amazon.com/cloudfront/home 에서 오리진을 편집하여 사용자 정의 헤더 "Expires : Sun, 2027 Oct 2027 13:46:07 GMT"를 추가 할 수있었습니다 . 그러나 작동하지 않는 것 같습니다. 마침내 어떻게 했습니까?
Manolo

답변:


31

Google에서 개별 객체에 대한 S3에서 헤더를 설정할 수있는 몇 페이지를 쳤습니다. 내 경우에는 여러 객체에 대해 이야기하기 때문에 특별히 생산적으로 수행하는 방법은 아닙니다.

음, "생산적"인지 아닌지, 그것이 실제로 작동하도록 설계된 방식입니다.

CloudFront는 헤더를 추가 하지 않습니다 Cache-Control:.

CloudFront를는 패스 스루 (그렇지 않는 구성도 존중)Cache-Control: 이 경우 S3 인 원 서버에 의해 제공되는 헤더.

Cache-Control:객체를 가져올 때 S3에서 제공 한 헤더 를 가져 오려면 객체를 S3에 업로드하거나 후속 put + copy 작업을 통해 객체의 메타 데이터에 추가 할 때 제공해야합니다. 프로세스에서 메타 데이터를 수정하는 S3. 객체 메타 데이터를 편집 할 경우 콘솔이 배후에서 수행하는 작업입니다.

S3에는 버킷의 모든 객체가 이러한 헤더를 반환하도록 강제하는 전역 설정도 없습니다 (개체 별 속성).


업데이트 : Lambda @ Edge는 CloudFront의 새로운 기능으로, 요청 및 / 또는 응답, 뷰어와 캐시 및 / 또는 캐시와 오리진 사이에서 간단한 요청 / 응답 객체 구조에 대해 Node.js로 작성된 코드를 실행하여 트리거를 실행할 수 있습니다. CloudFront에 의해 노출됩니다.

이 기능의 주요 애플리케이션 중 하나는 헤더 조작입니다. 따라서 위의 내용은 여전히 ​​정확하지만 CloudFront 자체는 추가되지 않습니다. Cache-Control이제 Lambda 함수가 CloudFront에서 반환 된 응답에 헤더 를 추가 할 수 있습니다.

이 예제는 응답에 헤더 Cache-Control: public, max-age=86400가없는 경우에만 추가 합니다 Cache-Control.

오리진 응답 트리거에서이 코드를 사용하면 CloudFront가 오리진에서 객체를 가져올 때마다 실행되고 CloudFront가 캐시하기 전에 응답을 수정합니다.

'use strict';

exports.handler = (event, context, callback) => {
    const response = event.Records[0].cf.response;

    if(!response.headers['cache-control'])
    {
        response.headers['cache-control'] = [{ 
            key:   'Cache-Control', 
            value: 'public, max-age=86400' 
        }];
    }

    callback(null, response);
};

업데이트 (2018-06-20) : 최근 정적 요청 헤더를 추가 할 수있는 방식과 유사하지만 정적 요청 응답 헤더를 원본 속성으로 구성 할 수 있도록 CloudFront 팀에 기능 요청을 제출했습니다 . 트위스트하여 각 헤더를 조건부로 추가하거나 (원점이 응답에서 해당 헤더를 제공하지 않은 경우에만) 조건부로 (헤더를 추가하고 헤더가있는 경우 헤더를 덮어 씁니다) 구성 할 수 있습니다.

기능 요청을 통해 일반적으로 실제로 새로운 기능 구현을 고려하고 있는지 또는 이미 기능을 수행했는지 여부에 대한 확인을받지 못합니다. 완료되면 바로 발표됩니다. 그래서, 이것이 구현 될지 모르겠습니다. Lambda @ Edge를 통해이 기능을 이미 사용할 수 있기 때문에 기본 기능에서이 기능이 필요하지 않다는 주장이 있습니다. 간단하고 정적 인 응답 헤더 조작을 수행해야하며, 이것이 트리거가 필요한 유일한 이유라면 Lambda 트리거를 요구하는 것은 재정적으로 추가 대기 시간이 걸리는 불필요한 비용입니다.


그래도 여전히 성가시다.
에리카 케인


1
타다, @Kunal. 이것이 답변에서 "이후 put + copy 작업에 의해 객체의 메타 데이터에 추가 되었다 " 고 언급 한 예입니다 . 경고가 있으므로주의해서 사용하고 테스트하십시오. 모든 날짜 스탬프를 재설정하고 암호화에 영향을 줄 수 있습니다. 또한 객체 알고리즘을 멀티 파트에서 단일 파트 형식으로 변경할 수 있으며, 이는 다른 알고리즘이며 향후 무결성 검사를 위해 다른 곳에 etag를 저장 한 시스템을 혼동합니다. 버킷에서 버전 관리가 활성화 된 경우 이전 버전을 정리하지 않으면 스토리지 비용이 두 배가됩니다.
Michael-sqlbot

1
새로운 Lambda @ Edge 서비스는 이제 캐시 제어 응답 헤더 (다른 것들 중에서도)를 즉시 추가 할 수있는 메커니즘을 제공합니다. 어떻게 할 수 있는지에 대한 실제 예제로 답변을 업데이트했습니다.
Michael-sqlbot

1
@Broshi 역할의 "신뢰 정책"은 람다 서비스와 엣지 람다 서비스를 모두 나열해야합니다. docs.aws.amazon.com/lambda/latest/dg/…보십시오 .
Michael-sqlbot
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.