TRY
S3 PresignedUrl과 함께 Metadata을 추가하였다.
필요한 다양한 정보들을 Metadata에 저장하려고 했다.
겸사겸사 수정하다가 만나버렸다.
CATCH
- SignatureDoesNotMatch
무엇이 문제일까 고민하며 이것저것 수정해보았다.
CORS도 확인해보고PUT
,GET
method도 확인해보고.
파일 이름때문인가 등등 확인해보고. credential이나 S3Presigner 설정도 확인해보고..
도저히 모를때쯤 내가Custom metadata
를 추가했다는 것을 생각해넀다.
metadata를 추가한다면request header
에 추가해줘야 한다.
만약 mimetype과 filename을 metadata에 추가해줬다면 다음과 같이 header에 추가해줘야 한다.headers: { "x-amz-meta-mimetype": "image/jpeg", "x-amz-meta-filename": "test1.jpg" }
그리고 또 다시
- SignatureDoesNotMatch
아 metadata만의 문제가 아니었구나 했다.
GET PresignedURL
은 정상적으로 동작하는데PUT PresignedURL
만 동작하지않았다.
쭉 403 response 값을 쭉 읽어보다가 알았다.<Error> <Code>SignatureDoesNotMatch</Code> <Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message> <AWSAccessKeyId>~~~</AWSAccessKeyId> <StringToSign>~~~</StringToSign> <SignatureProvided>~~~</SignatureProvided> <StringToSignBytes>~~~</StringToSignBytes> <CanonicalRequest>PUT /temp/~~~ X-Amz-Algorithm=~~~;X-Amz-Credential=~~~; X-Amz-Expires=~~~;X-Amz-SignedHeaders=~~~ host:~~~ x-amz-acl: x-amz-meta-filename:test1.jpg x-amz-meta-mimetype:image/jpeg
밑에 보면
x-amz-acl
값이 비어있는 것을 확인할 수 있었다.
내가 실수로 acl을 설정한 것이었다.
만약 저 값을 채워도 다음과 같은 Response를 받게 된다.400 bad request <Error> <Code>AccessControlListNotSupported</Code> <Message>The bucket does not allow ACLs</Message> <RequestId>~~~</RequestId> <HostId>~~~</HostId> </Error>
그렇다.
우리 s3 bucket은 acl이 설정된 적이 없는 bucket이었다.
S3 Permission tab을 확인해보면 알 수 있다.Object Ownership Bucket owner enforced ACLs are disabled. All objects in this bucket are owned by this account. Access to this bucket and its objects is specified using only policies
ACL
acl은 Access Controll List로 Bucket에 대한 접근 권한 설정에 대한 리스트이다.
간단한 S3 접근 권한을 설정할땐 좋으나 보통 IAM 을 이용해 권한을 부여한다.
AWS 권한에 대한 설정을 전체적으로 관리하기 쉽기 때문이다.
참고
이 값을 PutObjectRequest
에 추가해놨었기 때문이었다.
이를 제거한 뒤로 정상적으로 동작하였다.
FINALLY
보통 어떤 에러들을 만나거나 이럴땐 사용하는 툴이나 라이브러리들에 대한 이해가 부족해서 발생하는 경우가 많은 편이다.
이럴때마다 반성하게 된다.
덕분에 ACL과 AWS, S3등의 권한등에 대해 좀 더 찾아본 것 같다.
끝