Как подключиться к хранилищу объектов IBM Cloud (Cleversafe) из Golang с помощью AWS S3 SDK

Я пытаюсь подключиться к хранилищу объектов 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))
}

2 ответа

Спасибо
Ниже приведен пример рабочего кода:

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

По сути, это происходит потому, что IBM COS и AWS S3 обрабатывают концепцию "региона" несколько по-разному. Эта ошибка возникает из-за того, что AWS Go SDK не знает, какое значение нужно указать для переменной 'region', используемой для вычисления заголовка авторизации. В этом контексте IBM COS не важно, какое значение имеет значение, если оно не равно нулю. Самый простой способ - предоставить переменную окружения через командную строку: export AWS_REGION=foo где foo может быть любой строкой, хотя она также может быть установлена ​​как переменная конфигурации при создании клиента в вашем приложении.

Я бы рекомендовал использовать то, что имеет смысл, например, us или же us-south поскольку IBM COS, вероятно, обеспечит это в какой-то момент в будущем, связав концепцию "регион" с AWS LocationConstraint переменная, которая в настоящее время используется IBM COS для определения класса хранилища сегмента, хотя это различие будет сделано явным в будущем.

Другие вопросы по тегам