本来对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就会报错。虽然是并发量的问题, 但是无从下手,之后缩减了并发量。