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

Amazon web services 获取s3存储桶上的资源URI,amazon-web-services,go,amazon-s3,aws-sdk,aws-sdk-go,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变量的参数传递它们时,哪个IMHO是坏的。我可以访问aws.Session对象,该对象已使用s3 bucket正确初始化 是否有一种语义正确的方法(可能使用aws sdk API)来生成与虚拟字符串生成器相同的资源URI?来自一个示例。。。 虽然aws sdk go确

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

fmt.Sprintf("https://%s.%s.amazonaws.com/%s/%s", serviceId, region, namespace, filename)
当我通过env变量的参数传递它们时,哪个IMHO是坏的。我可以访问aws.Session对象,该对象已使用s3 bucket正确初始化

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

来自一个示例。。。 虽然
aws sdk go
确实在由
svc.GetObjectRequest
返回的结构中公开了
*http.Request
,但它返回的URL实际上更像是一种“URL格式”,直到您对请求运行类似于
Sign
Presign
的方法

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

2017/08/03 09:47:43网址是

请注意,我使用“get resource uri test”作为我的bucket名称,因为示例中的名称已经在使用中


调整示例 由于这不是您要寻找的输出类型,我已将示例调整为使用
符号
,这样可以使内容更清晰,因为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网址是


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

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


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

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