programing tip

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

itbloger 2020. 8. 16. 19:55
반응형

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


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


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


AWS 콘솔 지침

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

  • AWS Management Console에 로그인
  • 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의 게시물을 참조하십시오.


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


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

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

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


단계

  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/

Were it that my reputation score were >50, I'd just comment. But it's not (yet) so here's another full answer.


I've been banging my head on this problem for a while now. Until I found & read the docs. Sharing that here in case it helps anyone else:

What ended up reliably working for me was this command. I chose a 1 second expiration time for testing to verify expected results:

aws s3 cp \
  --metadata-directive REPLACE \
  --cache-control max-age=1,s-maxage=1 \
  s3://bucket/path/file \
  s3://bucket/path/file
  • --metadata-directive REPLACE is required when "cp" modifying metadata on an existing file in S3
  • max-age sets Browser caching age, in seconds
  • s-maxage sets CloudFront caching, in seconds

Likewise, if setting these Cache-Control header values on a file while uploading to S3, the command would look like:

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

I don't think you can specify this at the bucket level but there are a few workarounds for you.

  1. Copy the object to itself on S3 setting the appropriate cache-control headers for the copy operation.

  2. Specify response headers in the url to the files. You need to use pre-signed urls for this to work but you can specify certain response headers in the querystring including cache-control and expires. For a full list of the available options see: http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTObjectGET.html?r=5225


To those attempting to use Dan's answer and getting the error:

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

I ran into the issue, and the problem was that I installed awscli using

sudo apt-get install awscli

This installed an old version of the awscli which is missing the --metadata-directive command. So I used sudo apt-get remove awscli to remove it.

Then reinstalled following the procedure from amazon: http://docs.aws.amazon.com/streams/latest/dev/kinesis-tutorial-cli-installation.html

The only difference is that I had to use sudo -H because of permission issues which others might run into also.


You can always configure a lambda with a trigger on PUTOBJECT on S3, the lambda will simply change the header of this particular object that was just put.

Then you can run the copy command mentioned above one last time, and all the new objects will be fixed by the lambda.

UPDATE:

Here is a good place to start from: https://www.aaronfagan.ca/blog/2017/how-to-configure-aws-lambda-to-automatically-set-cache-control-headers-on-s3-objects/

참고URL : https://stackoverflow.com/questions/10435334/set-cache-control-for-entire-s3-bucket-automatically-using-bucket-policies

반응형