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
})
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
- 2 回答
- 0 关注
- 212 浏览
添加回答
举报