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를 실행하여 객체 목록을 얻을 수 있습니다.
  • 상기에서 취득한 오브젝트의 메타(key라든지)를 참조할 수 있다.
  • 키에 =를 포함하지 않는 S3 객체를 DL 할 수 있습니다.

  • 오류


  • 키에 =를 포함하는 S3 객체를 DL 할 수 없습니다.

  • 직접적인 원인은 몰랐지만 aws-sdk-go 내부의 구현을 보는 한 S3 객체를 DL 할 때는 GET 요청을 발행하고있는 것 같습니다. 하고 있는 것이 아닐까라고 생각했습니다.
    htps : // 기주 b. 코 m / 아 ws / 아 ws-sdk 고 / 이스에 s / 3110
    또한 이 issue에서 언급한 것처럼 "버킷 이름으로 = 또는 /를 사용할 수 없습니다."라는 S3 자체의 규칙이 있습니다.
    aws-sdk-go에서도 그 전제에 따라 구현한 결과, 이번과 같이 「DL 할 수 있거나 할 수 없거나 한다」이상한 거동이 일어난 것이 아닐까 생각됩니다.

    좋은 웹페이지 즐겨찾기