aws-sdk-go에서 S3 객체를 얻으려고 "SignatureDoesNotMatch"라고 말하면
4193 단어 5aws-sdk-goS3AWS
signed url을 사용하는 것은 아니지만 SignatureDoesNotMatch라고합니다.
ACL을 설정하지 않은 signed url도 사용하지 않는 버킷에 연결하여 객체를 검색하는 코드를 구현하면 SignatureDoesNotMatch: The request signature we calculated does not match the signature you provided. Check your key and signing method.
라고합니다.
비슷한 오류에 빠진 사람의 도움이 되시길 바랍니다.
TL;DR
/
를 포함하지 마십시오. 코드
코드는 적당하지만 분위기는 다음과 같습니다.
func hogehoge() error {
config := aws.Config{
Region: aws.String(os.Getenv("REGION")),
}
sess := session.New(&config)
d := s3manager.NewDownloader(sess)
n, err := d.Download(file, &s3.GetObjectInput{
Bucket: aws.String("hogehoge/"), //!!!!!!!
Key: aws.String("piyopiyo/year=2020/month=04/fugafuga.gz"),
})
if err != nil {
return err //エラーになる
}
fmt.Printf("downloaded %d bytes", n)
}
오류가 발생하거나 그렇지 않으면
코드에 쓰여진 대로입니다만, 버킷명의 뒤에 실수해
/
를 붙여 버리고 있습니다.이 버킷 이름에서
/
를 제거하면 모든 경우에 올바르게 작동합니다.그러나
/
를 붙이면 조금 이상한 동작을 했습니다.오류가 발생하지 않음
ListObjects
를 실행하여 객체 목록을 얻을 수 있습니다. =
를 포함하지 않는 S3 객체를 DL 할 수 있습니다. 오류
=
를 포함하는 S3 객체를 DL 할 수 없습니다. 직접적인 원인은 몰랐지만 aws-sdk-go 내부의 구현을 보는 한 S3 객체를 DL 할 때는 GET 요청을 발행하고있는 것 같습니다. 하고 있는 것이 아닐까라고 생각했습니다.
htps : // 기주 b. 코 m / 아 ws / 아 ws-sdk 고 / 이스에 s / 3110
또한 이 issue에서 언급한 것처럼 "버킷 이름으로
=
또는 /
를 사용할 수 없습니다."라는 S3 자체의 규칙이 있습니다.aws-sdk-go에서도 그 전제에 따라 구현한 결과, 이번과 같이 「DL 할 수 있거나 할 수 없거나 한다」이상한 거동이 일어난 것이 아닐까 생각됩니다.
Reference
이 문제에 관하여(aws-sdk-go에서 S3 객체를 얻으려고 "SignatureDoesNotMatch"라고 말하면), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/S-Elly/items/b1020437eb3f2033b65e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)