【问题标题】:How to connect to IBM Cloud object storage (Cleversafe) from Golang using the AWS S3 sdk如何使用 AWS S3 sdk 从 Golang 连接到 IBM Cloud 对象存储 (Cleversafe)
【发布时间】:2018-07-17 06:24:33
【问题描述】:

我正在尝试使用以下代码连接到 IBM Cloud 对象存储 (Cleversafe),但出现以下错误

“错误响应:MissingRegion:找不到区域配置”

package main

import (
    "fmt"
    "os"
    "bytes"
    "net/http"
    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/awsutil"
    "github.com/aws/aws-sdk-go/aws/credentials"
    "github.com/aws/aws-sdk-go/service/s3"
    "github.com/aws/aws-sdk-go/aws/session"
)

func main() {

    fmt.Printf("Starting ...")

    aws_access_key_id := "some id"
    aws_secret_access_key := "some key"
    token := ""
    creds := credentials.NewStaticCredentials(aws_access_key_id, aws_secret_access_key, token)

    fmt.Printf("creds: ", creds)

    _, err := creds.Get()
    if err != nil {
        fmt.Printf("bad credentials: %s", err)
    }
    //EndpointResolver endpoints.Resolver
    cfg := aws.NewConfig().WithEndpoint("dal.ibmselect.objstor.com").WithCredentials(creds)

    fmt.Printf("cfg: %+v \n", cfg)

    //cfg := aws.NewConfig().WithEndpointResolver()
    //cfg := aws.NewConfig().WithCredentials(creds)

    svc := s3.New(session.New(), cfg)

    fmt.Printf("svc: %+v \n", svc)

    file, err := os.Open("./test.jpg")
    if err != nil {
        fmt.Printf("err opening file: %s", err)
    }
    defer file.Close()
    fileInfo, _ := file.Stat()
    size := fileInfo.Size()
    buffer := make([]byte, size) // read file content to buffer

    file.Read(buffer)
    fileBytes := bytes.NewReader(buffer)
    fileType := http.DetectContentType(buffer)
    path := file.Name()
    params := &s3.PutObjectInput{
        Bucket:        aws.String("cosv1-jlnab"),
        Key:           aws.String(path),
        Body:          fileBytes,
        ContentLength: aws.Int64(size),
        ContentType:   aws.String(fileType),
    }
    resp, err := svc.PutObject(params)
    if err != nil {
        fmt.Printf("bad response: %s \n", err)
    }
    fmt.Printf("response %s", awsutil.StringValue(resp))
}

【问题讨论】:

    标签: object-storage ibm-cloud-storage


    【解决方案1】:

    谢谢
    以下是一个工作示例代码:

    package main
    
    import (
        "fmt"
        "os"
        "bytes"
        "net/http"
        "github.com/aws/aws-sdk-go/aws"
        "github.com/aws/aws-sdk-go/aws/awsutil"
        "github.com/aws/aws-sdk-go/aws/credentials"
        "github.com/aws/aws-sdk-go/service/s3"
        "github.com/aws/aws-sdk-go/aws/session"
    )
    
    
    
    func main() {
    
        fmt.Printf("Starting ...")
    
        aws_access_key_id := "Access key from Bluemix credentials"
        aws_secret_access_key := "Secret key from Bluemix credentials"
        token := ""
        creds := credentials.NewStaticCredentials(aws_access_key_id, aws_secret_access_key, token)
    
        fmt.Printf("creds: ", creds)
    
        _, err := creds.Get()
        if err != nil {
            fmt.Printf("bad credentials: %s", err)
        }
        //EndpointResolver endpoints.Resolver
        cfg := aws.NewConfig().WithRegion("cleversafe").WithEndpoint("s3-api.us-geo.objectstorage.softlayer.net").WithCredentials(creds)
    
        fmt.Printf("cfg: %+v \n", cfg)
    
        svc := s3.New(session.New(), cfg)
    
        fmt.Printf("svc: %+v \n", svc)
    
        file, err := os.Open("./test.jpg")
        if err != nil {
            fmt.Printf("err opening file: %s", err)
        }
        defer file.Close()
        fileInfo, _ := file.Stat()
        size := fileInfo.Size()
        buffer := make([]byte, size) // read file content to buffer
    
        file.Read(buffer)
        fileBytes := bytes.NewReader(buffer)
        fileType := http.DetectContentType(buffer)
        path := file.Name()
        params := &s3.PutObjectInput{
            Bucket:        aws.String("test-ophir"),
            Key:           aws.String(path),
            Body:          fileBytes,
            ContentLength: aws.Int64(size),
            ContentType:   aws.String(fileType),
        }
        resp, err := svc.PutObject(params)
        if err != nil {
            fmt.Printf("bad response: %s \n", err)
        }
        fmt.Printf("response %s", awsutil.StringValue(resp))
    }
    

    【讨论】:

      【解决方案2】:

      这基本上是因为 IBM COS 和 AWS S3 处理“区域”概念的方式略有不同。引发此错误是因为 AWS Go 开发工具包不知道为用于计算授权标头的“区域”变量提供什么值。在这种情况下,IBM COS 不关心什么值,只要它不为空即可。最简单的方法是通过命令行提供一个环境变量:export AWS_REGION=foo 其中foo 可以是任何字符串,尽管它也可以在您的应用程序中创建客户端时设置为配置变量。

      我建议使用一些有意义的东西,例如 usus-south,因为 IBM COS 可能会在未来某个时候通过将“区域”的概念与 AWS LocationConstraint 变量相关联来强制执行此操作, IBM COS 目前使用它来定义存储桶的存储类,尽管这种区别将在未来的某个时候明确说明。

      【讨论】:

        猜你喜欢
        • 2018-07-30
        • 1970-01-01
        • 1970-01-01
        • 2017-03-06
        • 2018-08-19
        • 1970-01-01
        • 2021-09-21
        • 2015-09-12
        • 1970-01-01
        相关资源
        最近更新 更多