2017-06-07 103 views
0

我尝试使用下面的代码连接到IBM的云对象存储(Cleversafe的),我得到以下错误如何从Golang使用AWS S3 SDK

连接到IBM的云对象存储(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)) 
} 

回答

0

本质上讲,这是因为IBM COS和AWS S3处理“区域”的概念有所不同。由于AWS Go SDK不知道为用于计算授权标头的'region'变量提供了什么值,因此正在抛出此错误。在这种情况下,IBM COS不在乎什么价值,只要它不为零。最简单的方法是通过命令行提供环境变量:export AWS_REGION=foo其中foo可以是任何字符串,但它也可以在您的应用程序中创建客户端时设置为配置变量。

我建议你使用的东西,通过“区域”的概念链接到AWS LocationConstraint变量,这是目前使用的是有道理的,像usus-south作为IBM COS可能会在某个时候在路上执行本IBM COS定义存储桶的存储类别,但这种区别将在未来的某个时刻明确。

1

由于
下面是工作示例的代码:

包主

进口( “FMT” “OS” “字节” “净/ 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/a WS /会话” )

FUNC主(){

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)) 

}