amazon-web-services - 使用 s3manager 上传文件

标签 amazon-web-services go amazon-s3

我正在尝试从我的网站下载一些文件并将它们上传到 amazons3。

这是我的代码:

import (
    "log"
    "net/http"

    "github.com/aws/aws-sdk-go/aws"
    "github.com/aws/aws-sdk-go/aws/credentials"
    "github.com/aws/aws-sdk-go/aws/session"
    "github.com/aws/aws-sdk-go/service/s3/s3manager"
)

func main() {
    // Make a GET request to an image to be downloaded and uploaded to s3
    resp, err := http.Get("http://my-site.com/image.jpg")
    if err != nil {
        log.Fatal(err)
    }

    // Get the AWS credentials
    creds := credentials.NewSharedCredentials("/Users/name/.aws/credentials", "default")

    // Set up config
    config := &aws.Config{
        Region:      aws.String("US Standard"),
        Credentials: creds,
    }

    // Set up a new AWS session
    sess := session.New(config)

    // Set up a new s3manager client
    uploader := s3manager.NewUploader(sess)

    result, err := uploader.Upload(&s3manager.UploadInput{
        Body:   resp.Body,
        Bucket: aws.String("mimi-movies"),
        Key:    aws.String("mimi.jpg"),
    })
    if err != nil {
        log.Fatalln("Failed to upload", err)
    }

    log.Println("Successfully uploaded to", result.Location)
}

我一直收到 nil 指针取消引用的运行时错误,该错误没有太大帮助,但出于某种原因,我认为它可能与 ssl 有关,但这是整个错误:

panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0x0 pc=0x236ffe]

goroutine 1 [running]:
panic(0x4743c0, 0xc82000a0e0)
    /usr/local/Cellar/go/1.6/libexec/src/runtime/panic.go:464 +0x3e6
github.com/aws/aws-sdk-go/service/s3.validateSSERequiresSSL(0xc820066380)
    /Users/name/work/src/github.com/aws/aws-sdk-go/service/s3/sse.go:15 +0x17e
github.com/aws/aws-sdk-go/aws/request.(*HandlerList).Run(0xc820066478, 0xc820066380)
    /Users/name/work/src/github.com/aws/aws-sdk-go/aws/request/handlers.go:136 +0xc3
github.com/aws/aws-sdk-go/aws/request.(*Request).Build(0xc820066380, 0x0, 0x0)
    /Users/name/work/src/github.com/aws/aws-sdk-go/aws/request/request.go:189 +0x69
github.com/aws/aws-sdk-go/aws/request.(*Request).Sign(0xc820066380, 0x0, 0x0)
    /Users/name/work/src/github.com/aws/aws-sdk-go/aws/request/request.go:210 +0x31
github.com/aws/aws-sdk-go/aws/request.(*Request).Send(0xc820066380, 0x0, 0x0)
    /Users/name/work/src/github.com/aws/aws-sdk-go/aws/request/request.go:261 +0x6f4
github.com/aws/aws-sdk-go/service/s3/s3manager.(*uploader).singlePart(0xc8201520f0, 0x8bb980, 0xc82014a030, 0xc82000a140, 0x0, 0x0)
    /Users/name/work/src/github.com/aws/aws-sdk-go/service/s3/s3manager/upload.go:449 +0x1fc
github.com/aws/aws-sdk-go/service/s3/s3manager.(*uploader).upload(0xc8201520f0, 0xc8201520f0, 0x0, 0x0)
    /Users/name/work/src/github.com/aws/aws-sdk-go/service/s3/s3manager/upload.go:355 +0x563
github.com/aws/aws-sdk-go/service/s3/s3manager.Uploader.Upload(0x500000, 0x5, 0x0, 0x2710, 0xe00240, 0xc820156018, 0xc82016e000, 0x0, 0x0, 0x0, ...)
    /Users/name/work/src/github.com/aws/aws-sdk-go/service/s3/s3manager/upload.go:329 +0x15a
main.main()
    /Users/name/work/src/gitlab.com/user/project/test/main.go:39 +0x59f
exit status 2

最佳答案

正如@user3666882 提到的 aws-go-sdk 中存在错误,您可能应该检查您的区域。

在您的代码中,您编写了获取 AWS 凭证的代码。

// Get the AWS credentials
    creds := credentials.NewSharedCredentials("/Users/name/.aws/credentials", "default")

您可以在您的终端中尝试这个:

aws configure

并配置您的 aws-sdk。

否则你可以使用 Minio。但是您必须将您的 ACCESS_KEY_ID 和 SECRET_ACCESS_KEY 放在您的代码中,这对于生产使用来说非常不利。

 s3Client, err := minio.New("s3.amazonaws.com", "YOUR-ACCESSKEYID", "YOUR-SECRETACCESSKEY", false)

此外,您还可以使用外部 API Viper隐藏这些键。但我建议您使用官方的 AWS SDK for Go。

关于amazon-web-services - 使用 s3manager 上传文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36224477/

相关文章:

python - 使用 boto + Python 上传 Amazon S3 失败

ruby-on-rails - ActiveRecord::StatementInvalid: PG::InsufficientPrivilege: 错误:关系 schema_migrations 的权限被拒绝

package - 子包中的可见性

javascript - AWS与nodejs失败,错误BucketAlreadyOwnedByYou

amazon-web-services - 将特定 AWS API Gateway 阶段连接到 CloudFormation 模板中的特定 Lambda 别名

python - AWS Elastic Beanstalk Django - 部署到 EB 时首先发生什么,pip install -r requirements.txt 或配置文件中的命令

go - 为什么这个版本标签会导致错误?

concurrency - 维护打开的 websocket 连接列表的最佳方法是什么?

php - 直接流式上传到 Amazon S3 时无 HTTP 响应

amazon-web-services - 使用 aws s3 mv 时的未知选项