代码之家  ›  专栏  ›  技术社区  ›  Filip Bartuzi flyingace

获取s3存储桶上的资源URI

  •  1
  • Filip Bartuzi flyingace  · 技术社区  · 8 年前

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

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

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

    1 回复  |  直到 8 年前
        1
  •  1
  •   Jonathan    8 年前

    从一个例子中。。。

    虽然 aws-sdk-go 确实暴露了 *http.Request 在返回的结构中 svc.GetObjectRequest Sign 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


    调整后的示例

    ,这使事情更加干净,因为身份验证信息被放入了头文件/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)
    

    https://get-resource-uri-test.s3-us-west-2.amazonaws.com/myKey


    虽然这个建议确实避免了对S3的任何调用,但我确实对此有复杂的感觉。在某些方面, aws sdk go

    就是这样 真正地 aws sdk go 。如果其他人能够提出更合理的替代方案,我鼓励该人也发布他/她的解决方案。

    svc 在提供的示例中)并重用其 GetObjectRequest 方法,以避免每次需要确定URL时创建新客户端。