【问题标题】:Get resource URI on s3 bucket获取 s3 存储桶上的资源 URI
【发布时间】:2018-01-10 23:32:01
【问题描述】:

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

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

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

是否有一种语义正确的方法(可能使用 aws sdk API)来生成与 dummy 字符串生成器相同的资源 URI?

【问题讨论】:

  • amazonaws => amazonaws.com
  • @jarmod,很好,警长
  • 我不知道有任何 SDK 方法(在我使用的语言中;我不使用 go)来构造 S3 URI。我只是使用 s3.region.amazonaws.com/bucket/key(路径样式)或 bucket.s3.region.amazonaws.com/key(虚拟托管样式)。您也可以将 s3-region 替换为 s3.region。
  • 是的,github.com/aws-sdk-go 会在您初始化服务并形成请求时自动为您执行此操作(服务中设置区域,请求选项中设置存储桶)。您是在询问如何在此时检索 URI,还是此信息回答了您的问题?
  • @Jonathan 是的,我在问如何检索 URI :)

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


【解决方案1】:

举个例子……

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

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

2017/08/03 09:47:43 网址是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,因为身份验证信息已放入标头/等中,这使事情更加简洁。而不是在 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 网址是https://get-resource-uri-test.s3-us-west-2.amazonaws.com/myKey


注意事项

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

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

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

【讨论】:

    猜你喜欢
    • 2021-01-26
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 2021-06-17
    相关资源
    最近更新 更多