aws cli 上传文件到s3命令_一个aws s3 上传命令行工具的落成

本文介绍了如何使用AWS S3的golang SDK v2上传文件,包括下载SDK、授权过程、配置静态凭证以及解决并发量控制问题。通过修改默认配置和使用静态凭证,成功创建客户端并实现文件上传。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本来对golang语言只是有过基本的了解,AWS 的s3文档又博大精神,因此期间遇到了大小问题值的总结一下。AWS S3的golang sdk有两个版本,我无法下载第一个版本的sdk,只能使用v2的sdk(https://github.com/aws/aws-sdk-go-v2)。

官方对于这个SDK给出了两个下载方式:第一种是比较常规的下载方式,第二种是golang 的一种包管理工具。 Golang 的包管理工具很多,我还需一一了解

第一种:

go get -u github.com/aws/aws-sdk-go-v2

第二种:

dep ensure -add github.com/aws/aws-sdk-go-v2

AWS S3 的官方文档不知如何看起,我也只能贴个连接(https://docs.aws.amazon.com/sdk-for-go/api/aws/) 。里面是sdk-v1的文档,v2比v1虽然有稍微的改动,但是大致相同,只能拼凑这看了。

2. sdk-v2如何授权。先看v1版本的授权方式

// The session the S3 Uploader will use

sess := session.Must(session.NewSession())

// Create an uploader with the session and default options

uploader := s3manager.NewUploader(sess)

f, err := os.Open(filename)

if err != nil {

return fmt.Errorf("failed to open file %q, %v", filename, err)

}

// Upload the file to S3.

result, err := uploader.Upload(&s3manager.UploadInput{

Bucket: aws.String(myBucket),

Key: aws.String(myString),

Body: f,

})

if err != nil {

return fmt.Errorf("failed to upload file, %v", err)

}

fmt.Printf("file uploaded to, %s\n", aws.StringValue(result.Location))

咦,上来就直接创建一个session ,我的accessKey 填给谁呀? 翻着文档向上看,发现了configuring the aws sdk for go(https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html). 原来我是有一个共享的credentials 文件,且这个文件就在 ~/.aws/credentials 。文件的内容如下;

[default]

aws_access_key_id =

aws_secret_access_key =

其他的具体配置去看官方文档即可

不过这是v1版本的文档,不太适合我v2版本的,咱再去找找v2版本的,到github的ReadMe就给出了相关文档呀,就不要去乱翻了。

cfg, err := external.LoadDefaultAWSConfig()

if err != nil {

panic("unable to load SDK config, " + err.Error())

}

// Set the AWS Region that the service clients should use

cfg.Region = endpoints.UsWest2RegionID

// Using the Config value, create the DynamoDB client

svc := dynamodb.New(cfg)

// Build the request with its input parameters

req := svc.DescribeTableRequest(&dynamodb.DescribeTableInput{

TableName: aws.String("myTable"),

})

// Send the request, and get the response or error back

resp, err := req.Send()

if err != nil {

panic("failed to describe table, "+err.Error())

}

fmt.Println("Response", resp)

}

依照以往的习惯,我习惯的都是把accessKey 写到程序里面或者配置文件里的,s3的sdk不可能不支持呀?咱们还是再找找吧,找啊找,找朋友。 先去看看LoadDefaultAWSConfig 的源码吧。有一个config.go 的文件,里面有一个 Config 的struct 呢

type Config struct {

// The region to send requests to. This parameter is required and must

// be configured globally or on a per-client basis unless otherwise

// noted. A full list of regions is found in the "Regions and Endpoints"

// document.

//

// See http://docs.aws.amazon.com/general/latest/gr/rande.html for

// information on AWS regions.

Region string

// The credentials object to use when signing requests. Defaults to a

// chain of credential providers to search for credentials in environment

// variables, shared credential file, and EC2 Instance Roles.

Credentials CredentialsProvider

// The resolver to use for looking up endpoints for AWS service clients

// to use based on region.

EndpointResolver EndpointResolver

// The HTTP client to use when sending requests. Defaults to

// `http.DefaultClient`.

HTTPClient *http.Client

// TODO document

Handlers Handlers

// Retryer guides how HTTP requests should be retried in case of

// recoverable failures.

//

// When nil or the value does not implement the request.Retryer interface,

// the client.DefaultRetryer will be used.

//

// When both Retryer and MaxRetries are non-nil, the former is used and

// the latter ignored.

//

// To set the Retryer field in a type-safe manner and with chaining, use

// the request.WithRetryer helper function:

//

// cfg := request.WithRetryer(aws.NewConfig(), myRetryer)

Retryer Retryer

……

}

Credentials 不就是我想要的值吗?对它进行重新赋值就行了。

cfg.Credentials = aws.NewStaticCredentialsProvider("XXXXXXXXXXXXXX", "XXXXXXXXXXXXXXXXXXXXXXXX", "")

这样期望的一个client 就可以了

上传可以了,我可以使用一下go 的go程吗? 当然可以,还可以加上一个等待,和一个并发量的的控制,使用channel 和 sync.WaitGroup控制即可。

3. 不加并发量控制,s3就会报错。虽然是并发量的问题, 但是无从下手,之后缩减了并发量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值