전체 S3 버킷에 대한 캐시 제어를 자동으로 설정 (버킷 정책 사용?)


124

기존 파일과 향후 파일 모두에 대해 전체 s3 버킷에 대해 캐시 제어 헤더를 설정해야하며 버킷 정책에서이를 수행하려고했습니다. 기존 파일을 편집 할 수 있다는 것을 알고 있으며 직접 업로드하면 파일을 지정하는 방법을 알고 있지만 안타깝게도 파일을 업로드하는 앱은 s3fs를 사용하여 파일을 복사하므로 헤더를 설정할 수 없습니다.

답변:


208

이제이 작업을 수행하는 3 가지 방법이 있습니다. AWS 콘솔 , 명령 줄 또는 s3cmd 명령 줄 도구를 통해 .


AWS 콘솔 지침

이제 이것이 권장되는 솔루션입니다. 간단하지만 시간이 좀 걸릴 수 있습니다.

  • AWS Management 콘솔에 로그인
  • S3 버킷으로 이동
  • 경로별로 모든 파일 선택
  • 메뉴에서 "더보기"를 선택하십시오
  • "메타 데이터 변경"을 선택합니다.
  • "키"필드의 드롭 다운 메뉴에서 "Cache-Control"을 선택합니다. max-age = 604800 값을 입력합니다 (7 일).
  • "저장"버튼을 누릅니다.

( @biplob 덕분에-아래에서 그에게 사랑을주십시오 )


AWS 명령 줄 솔루션

원래이 버킷 정책을 만들었을 때 아무 문제가 없었기 때문에 aws-cli를 사용하여 수행하는 방법을 생각했고 매우 매끄 럽습니다. 조사 할 때 야생에서 어떤 예도 찾을 수 없었기 때문에 도움이 필요한 사람들을 돕기 위해 몇 가지 솔루션을 게시 할 것이라고 생각했습니다.

참고 : 기본적으로 aws-cli는 새 메타 데이터를 지정하더라도 파일의 현재 메타 데이터 만 복사합니다.

명령 줄에 지정된 메타 데이터를 사용하려면 '--metadata-directive REPLACE'플래그를 추가해야합니다. 다음은 몇 가지 예입니다.

단일 파일의 경우

aws s3 cp s3://mybucket/file.txt s3://mybucket/file.txt --metadata-directive REPLACE \
--expires 2034-01-01T00:00:00Z --acl public-read --cache-control max-age=2592000,public

전체 버킷의 경우 (--recursive 플래그 참고) :

aws s3 cp s3://mybucket/ s3://mybucket/ --recursive --metadata-directive REPLACE \
--expires 2034-01-01T00:00:00Z --acl public-read --cache-control max-age=2592000,public

내가 찾은 약간의 문제는 특정 파일 유형에만 적용하려면 모든 파일을 제외하고 원하는 파일을 포함해야합니다.

jpg 및 png 만 :

aws s3 cp s3://mybucket/ s3://mybucket/ --exclude "*" --include "*.jpg" --include "*.png" \
--recursive --metadata-directive REPLACE --expires 2034-01-01T00:00:00Z --acl public-read \
--cache-control max-age=2592000,public

추가 정보가 필요한 경우 설명서에 대한 링크는 다음과 같습니다.

알려진 문제 :

"Unknown options: --metadata-directive, REPLACE"

이것은 오래된 awscli로 인해 발생할 수 있습니다- 아래 @eliotRosewater의 답변 참조


S3cmd 도구

S3cmd는 "Amazon S3 및 CloudFront 서비스를 관리하기위한 명령 줄 도구"입니다. 이 솔루션에는 git pull이 필요하지만 더 간단하고 포괄적 인 솔루션이 될 수 있습니다.

전체 지침은 아래 @ ashishyadaveee11의 게시물을 참조하십시오.


도움이 되었기를 바랍니다.


6
정확히 무엇을해야하는지에 대한 실제 예를 들어 주셔서 감사합니다. 문서를 읽는 것만으로도 가능한 것이 무엇인지 알아내는 데 어려움이있었습니다.
danneu 2015-06-27

2
위의 명령 중 하나를 실행할 때 "알 수없는 옵션 : --metadata-directive, REPLACE"가 표시됩니다. 도와주세요.
user3722785 jul.

1
이제 더 쉬운 방법이 있습니다. 이제 AWS 콘솔을 통해 버킷의 모든 파일에 대한 메타 데이터를 변경할 수 있습니다. 아래 CoderBoy의 답변 참조 : stackoverflow.com/a/47072736/2538952
Martin Tschammer

1
--meta-directive REPLACE를 사용하면 명령에서 복사되지 않은 이전 메타 데이터를 덮어 씁니다! 예를 들어 "content-encoding gzip"은 cp 명령에 명시 적으로 추가되지 않은 경우 제거됩니다.
Harmen Janssen

1
합니까 cp다운로드 및 다시 업로드 모든 것을?
mlissner

37

이제 AWS 콘솔에서 쉽게 변경할 수 있습니다.

  • AWS Management 콘솔에 로그인
  • S3 버킷으로 이동
  • 경로별로 모든 파일 선택
  • 메뉴에서 "더보기"를 선택하십시오
  • "메타 데이터 변경"을 선택합니다.
  • "키"필드의 드롭 다운 메뉴에서 "Cache-Control"을 선택합니다.
  • max-age = 604800 값에 (7 일) 입력
  • "저장"버튼을 누릅니다.

실행하는 데 시간이 걸리는 것은 버킷 파일에 따라 다릅니다. 실수로 브라우저를 닫은 경우 처음부터 다시 실행하십시오.


6
"경로별로 모든 파일 선택"이란 무엇을 의미합니까?
Tamzin Blake

1
설정 메타에 원하는 디렉토리에서 모든 / 일부 파일 선택
biplob

늦은 답변 죄송합니다. 아니, 그렇지 않습니다. 애플리케이션에서 설정해야합니다.
biplob

이전 메타 데이터를 대체합니까 아니면 추가합니까? (모든 콘텐츠 유형을 잃고 싶지 않습니다!)
Chris

방금 기존 값을 제거하지 않음을 확인했습니다. 지정한 키만 설정 (존재하는 경우 키 덮어 쓰기)
rynop

21

단계

  1. git clone https://github.com/s3tools/s3cmd
  2. 실행 s3cmd --configure (확인 이메일 또는 Amazon 계정 페이지에서 키를 복사하여 붙여 넣으라는 메시지가 표시됩니다. 복사 할 때주의하십시오! 대소 문자를 구분하고 정확하게 입력해야합니다. 그렇지 않으면 유효하지 않은 오류에 대한 오류가 계속 발생합니다. 서명 또는 유사합니다. s3:ListAllMyBuckets키 에 권한 을 추가해야합니다. 그렇지 않으면 AccessDenied액세스를 테스트하는 동안 오류가 발생합니다.)
  3. ./s3cmd --recursive modify --add-header="Cache-Control:public ,max-age= 31536000" s3://your_bucket_name/

슈퍼 대답. 감사합니다! 이 헤더 설정이없는 항목 만 업데이트 할 수있는 방법이 있습니까?
PKHunter

누구든지 window의 S3Express와 함께 사용할 유사한 솔루션이 있습니까?
Joe

12

내 평판 점수가 50 점을 넘었다면 그냥 언급하겠습니다. 그러나 (아직) 아니므로 여기에 또 다른 완전한 대답이 있습니다.


나는 잠시 동안이 문제에 대해 머리를 두드렸다. 문서를 찾아서 읽을 때까지. 다른 사람에게 도움이되는 경우 여기에 공유 :

나를 위해 안정적으로 작동하게 된 것은이 명령이었습니다. 예상 결과를 확인하기 위해 테스트를 위해 1 초의 만료 시간을 선택했습니다.

aws s3 cp \
  --metadata-directive REPLACE \
  --cache-control max-age=1,s-maxage=1 \
  s3://bucket/path/file \
  s3://bucket/path/file
  • --metadata-directive REPLACEcpS3의 기존 파일에서 메타 데이터를 " "수정할 때 필요합니다.
  • max-age 브라우저 캐싱 기간을 초 단위로 설정합니다.
  • s-maxage CloudFront 캐싱 설정 (초)

마찬가지로 S3에 업로드하는 동안 파일에 이러한 Cache-Control 헤더 값을 설정하면 명령은 다음과 같습니다.

aws s3 cp \
  --cache-control max-age=1,s-maxage=1 \
  /local/path/file \
  s3://bucket/path/file

8

버킷 수준에서 지정할 수 없다고 생각하지만 몇 가지 해결 방법이 있습니다.

  1. 복사cache-control 작업에 적합한 헤더를 설정하여 S3 에서 객체를 자신 에 복사합니다.

  2. 파일에 대한 URL에 응답 헤더를 지정합니다 . 이 작업을 수행하려면 미리 서명 된 URL을 사용해야하지만 cache-control및을 포함하여 쿼리 문자열에 특정 응답 헤더를 지정할 수 있습니다 expires. 사용 가능한 옵션의 전체 목록은 http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectGET.html?r=5225를 참조하십시오.


감사합니다 Geoff, 나는 (1)에 대해 알고 있었지만 (2)에 대해서는 알지 못했습니다. 내가 바라던 것이 아님 (불가능할 것
같지는

# 1을 수행하는 방법에 대한 예제 AWS CLI 명령이 있습니까? docs.aws.amazon.com/cli/latest/reference/s3/cp.html
dpegasusm

3

S3의 PUTOBJECT에서 트리거로 람다를 항상 구성 할 수 있으며, 람다는 방금 놓인이 특정 객체의 헤더를 변경합니다.

그런 다음 위에서 언급 한 복사 명령을 마지막으로 실행하면 모든 새 개체가 람다에 의해 수정됩니다.

최신 정보:

시작하기에 좋은 곳은 다음과 같습니다. https://www.aaronfagan.ca/blog/2017/how-to-configure-aws-lambda-to-automatically-set-cache-control-headers-on-s3-objects /


이 람 바를 만드는 방법에 대한 자세한 내용을 제공 할 수 있습니까? 훌륭한 솔루션 인 것 같습니다.
Wouter

1
@Wouter 물론, 실제로 쉽게 갈 수있는 링크를 찾았습니다. aaronfagan.ca/blog/2017/… 도움이나 지원이 필요하면 기꺼이 도와 드리겠습니다.
Ibrahim Bou Ncoula

나는 이것이 오래되었다는 것을 알고 있지만이 리소스가 내가 찾던 것에 유용하다는 것을 알았습니다. 감사합니다. 당신을 위해 upvotes 내 친구!
castaway2000

1

Dan의 대답을 사용하고 오류를 얻으려는 사람들에게 :

"알 수없는 옵션 : --metadata-directive, REPLACE"

문제가 발생했고 문제는 다음을 사용하여 awscli를 설치했다는 것입니다.

sudo apt-get 설치 awscli

이로 인해 --metadata-directive 명령이 누락 된 이전 버전의 awscli가 설치되었습니다. 그래서 sudo apt-get remove awscli를 사용하여 제거했습니다.

그런 다음 Amazon의 절차에 따라 다시 설치했습니다. http://docs.aws.amazon.com/streams/latest/dev/kinesis-tutorial-cli-installation.html

유일한 차이점은 다른 사람들도 발생할 수있는 권한 문제 때문에 sudo -H를 사용해야한다는 것입니다.

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