amazon-web-services - 获取 s3 存储桶上的资源 URI

标签 amazon-web-services go amazon-s3 aws-sdk aws-sdk-go

目前,我使用字符串插值手动构造 URI:

fmt.Sprintf("https://%s.%s.amazonaws.com/%s/%s", serviceId, region, namespace, filename)

恕我直言,当我通过环境变量的参数传递它们时,哪个不好。我可以访问使用我们的 s3 存储桶正确初始化的 aws.Session 对象。

是否有一种语义上正确的方式(可能使用 aws sdk API)来生成与dummy string builder 相同的资源 URI?

最佳答案

从一个例子...

虽然 aws-sdk-go 确实在 svc.GetObjectRequest 返回的结构中公开了 *http.Request,但它返回的 URL实际上更像是一种“url 格式”,直到您对请求运行一个方法,如 SignPresign

可以找到一些Presign 示例On This Page . Get 示例提供以下输出:

2017/08/03 09:47:43 The URL is https://get-resource-uri-test.s3-us-west-2.amazonaws.com/myKey?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIFJBK7YB3H7CTZIA%2F20170803%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20170803T144743Z&X-Amz-Expires=900&X-Amz-SignedHeaders=host&X-Amz-Signature=3c279aece1eda3c33b0711bb0e5a86e330e378f9052f1e73cdb0b9ca19de6209

请注意,我使用“get-resource-uri-test”作为我的存储桶名称,因为示例中的那个已经在使用中


调整后的例子

由于这不是您要查找的输出类型,我已将示例调整为使用 Sign,这样可以使内容更加清晰,因为身份验证信息已放入 header /等.而不是在 URL 中:

svc := s3.New(session.New(&aws.Config{Region: aws.String("us-west-2")}))
req, _ := svc.GetObjectRequest(&s3.GetObjectInput{
    Bucket: aws.String("get-resource-uri-test"),
    Key:    aws.String("myKey"),
})

// Instead of using Presign, which was provided in example
if err := req.Sign(); err != nil {
    log.Println("Failed to sign request", err)
}

log.Println("The URL is", req.HTTPRequest.URL)

2017/08/03 09:53:22 The URL is https://get-resource-uri-test.s3-us-west-2.amazonaws.com/myKey


注意事项

虽然这个建议确实避免了对 S3 的实际调用,但我对此确实有复杂的感觉。在某些方面,aws-sdk-go 似乎旨在某种程度上消除对 URL 操作的需要,而是根据您要完成的任务生成它(主要是在内部)。

那么,我们真的有必要创建一个完整的 S3 客户端,以便在 Go 中从 Amazon 获得适当的“认可/祝福”的 url 吗?这似乎有点过分,但这是迄今为止我发现的从 aws-sdk-go 接收格式化 URL 的唯一方法。如果其他人能够提出更合理的替代方案,我会鼓励该人也发布他/她的解决方案。

我可能不需要这么说,但如果您打算大规模使用此示例,我建议您创建一个 s3 客户端(在示例中名为 svc提供)并重复使用其 GetObjectRequest 方法以避免每次需要确定 URL 时都创建新的客户端。

关于amazon-web-services - 获取 s3 存储桶上的资源 URI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45482885/

相关文章:

java - 为亚马逊 s3 上的每个视频商店创建缩略图的最佳方法是什么?

python - 尝试在 AWS Data Pipeline 上构建自动化脚本

amazon-web-services - Zookeeper 无法监听 3888 端口

go - 在 heroku 上部署 golang 应用程序,构建成功但应用程序错误

go - 输入字节 68 处的非法 base64 数据

go - 拦截 Go 中的错误和 panic

amazon-web-services - 授予 S3 存储桶访问权限的跨账户角色 - 权限被拒绝

amazon-web-services - AWS Amplify Fullstack CI/CD 破坏 API(cors 问题)

amazon-web-services - 具有导出值和 Taskcat 的 CloudFormation 堆栈

ios - 关于 S3 文件传输中的权限