首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用AWS S3 sdk从Golang连接IBM对象存储(Cleversafe)

如何使用AWS S3 sdk从Golang连接IBM对象存储(Cleversafe)
EN

Stack Overflow用户
提问于 2017-06-07 11:06:33
回答 2查看 1K关注 0票数 0

我试图使用以下代码连接到IBM对象存储(Cleversafe),并得到以下错误

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

代码语言:javascript
复制
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))
}
EN

回答 2

Stack Overflow用户

发布于 2017-06-09 11:08:29

谢谢

以下是工作示例代码:

代码语言:javascript
复制
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))
}
票数 1
EN

Stack Overflow用户

发布于 2017-06-07 21:45:24

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

我建议使用一些有意义的东西,比如usus-south,因为IBM可能会在将来的某个时候通过将'region‘的概念链接到AWS LocationConstraint变量来执行这一点,这个变量目前是IBM用来定义桶的存储类的,尽管这种区别在将来的某个时候会变得非常明确。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44410939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档