在s3存储桶

时间:2017-08-03 11:27:54

标签: 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)

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

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

1 个答案:

答案 0 :(得分:1)

从一个例子......

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

可以找到一些Presign个例子On This Page。 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,这使得事情更加干净,因为auth信息被放入header / etc.而不是在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的正确'认可/祝福'网址吗? 这似乎有点过分,但这是我到目前为止从aws-sdk-go接收格式化URL的唯一方法。如果其他人能够提出更合理的选择,我也鼓励那个人发布他/她的解决方案。

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