为了账号安全,请及时绑定邮箱和手机立即绑定

S3 存储桶命名策略问题,以及尝试将开发工具包生成的请求发送到实现 S3 API 的 API 的问题

S3 存储桶命名策略问题,以及尝试将开发工具包生成的请求发送到实现 S3 API 的 API 的问题

Go
波斯汪 2022-08-01 19:02:03
如果标题措辞没有正确描述问题,请道歉,我不完全确定如何措辞。我正在开发一个可以像处理S3 API一样处理请求的API,因此应该与Go S3 SDK一起使用,我在尝试将存储桶名称传递给Go S3 SDK函数时遇到了一个问题。例如:result, err := svc.CreateBucket(&s3.CreateBucketInput{     Bucket:aws.String(bucketName), })当存储桶名称设置为我认为正在解析为两个单独标签的字符串时,例如或SDK似乎生成一个请求,其中主机地址设置为终端节点地址,即 后跟存储桶名称,我的 API 可以相应地接受、处理和响应该名称。testBucketmyBuckethttp://localhost:8000/s3/但是,当存储桶名称包含解析为单个标签(如 or)的字符串时,SDK 会生成一个主机地址,其中存储桶名称位于主机之前,即 这会导致错误,因为我编写的API不支持此主机地址。testbuckettestbuckethttp://test.localhost:8000/s3/理想情况下,我需要以某种方式支持使用单标签存储桶名称,通过扩展 API 处理请求的方式,或者通过制定一种方法来强制 SDK 停止更改主机 URL 格式。如果有人能够帮助解决问题,或提供建议,我将不胜感激。
查看完整描述

2 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

因此,我逐步了解了 AWS 开发工具包 V2,该函数是导致主机异常的原因。我要提到这一点,这取决于AWS看看这是否是一个错误。不过有办法解决这个问题!moveBucketNameToHost(req.URL, bucket)


您需要将“端点解析器”属性设置为 。这将阻止它被此功能更改。HostnameImmutabletrue


示例:创建自定义冲突解决程序时


// for custom localstack endpoint

    customResolver := aws.EndpointResolverFunc(func(service, region string) (aws.Endpoint, error) {

        if service == s3.ServiceID {

            return aws.Endpoint{

                PartitionID:   "aws",

                URL:           "http://localhost:4566",

                SigningRegion: "eu-west-1",

                HostnameImmutable: true, // This must be set to true to disable the host changing

            }, nil

        }

        // returning EndpointNotFoundError will allow the service to fallback to it's default resolution

        return aws.Endpoint{}, &aws.EndpointNotFoundError{}

    })


    config, err := config.LoadDefaultConfig(context.TODO(), config.WithRegion("eu-west-1"), config.WithEndpointResolver(customResolver))

    if err != nil {

        log.Fatalf("unable to load SDK config, %v", err)

    }


    client := s3.NewFromConfig(config)

更新


默认情况下,S3 使用虚拟主机路径样式对存储桶进行寻址。这就是主机名被突变为 {bucketname}.localhost:4566 的原因。


S3 对有效存储桶名称的要求很少。因此,根据要求,camelCase 是一个无效的存储桶名称,因此 SDK 回退到路径样式的 url。因此,主机名不会发生突变,您会看到 localhost:4566/camelCase。


根据解决方法,如果 HostnameImmutable 属性设置为 true,则 SDK API 客户端将不会修改 URL 的主机名。如果 API 要求客户端使用特定于操作的主机名值,这可能会导致 API 客户端无法正常运行。


在您的情况下,更好的解决方案是直接在S3选项上启用UsePathStyle选项


result, err :=  client.CreateBucket(ctx, &input, func(o *s3.Options) {

        o.UsePathStyle = true

})


查看完整回答
反对 回复 2022-08-01
?
烙印99

TA贡献1829条经验 获得超13个赞

我相信这是由于对SDK进行了更改,以删除对基于路径的存储桶路由的支持:http://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html

您可以更新 的配置,将存储桶名称作为子域(默认)或路径。https://docs.aws.amazon.com/sdk-for-go/api/aws/#ConfigConfig.S3ForcePathStyle


查看完整回答
反对 回复 2022-08-01
  • 2 回答
  • 0 关注
  • 212 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信