1[![API Reference](https://img.shields.io/badge/api-reference-blue.svg)](https://docs.aws.amazon.com/sdk-for-go/api) [![Join the chat at https://gitter.im/aws/aws-sdk-go](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/aws/aws-sdk-go?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Build Status](https://img.shields.io/travis/aws/aws-sdk-go.svg)](https://travis-ci.org/aws/aws-sdk-go) [![Apache V2 License](https://img.shields.io/badge/license-Apache%20V2-blue.svg)](https://github.com/aws/aws-sdk-go/blob/master/LICENSE.txt)
2
3# AWS SDK for Go
4
5aws-sdk-go is the official AWS SDK for the Go programming language.
6
7Checkout our [release notes](https://github.com/aws/aws-sdk-go/releases) for
8information about the latest bug fixes, updates, and features added to the SDK.
9
10We [announced](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-2-0-developer-preview/) the Developer Preview for the [v2 AWS SDK for Go](https://github.com/aws/aws-sdk-go-v2). The v2 SDK source is available at https://github.com/aws/aws-sdk-go-v2, and add it to your project with `go get github.com/aws/aws-sdk-go-v2`. Check out the v2 SDK's [changes and updates](https://github.com/aws/aws-sdk-go-v2/blob/master/CHANGELOG.md), and let us know what you think. We want your feedback.
11
12We have a pilot redesign of the [AWS SDK for Go API reference documentation](https://docs.aws.amazon.com/sdk-for-go/v1/api/gosdk-apiref.html). Let us know what you think.
13
14## Installing
15
16Use `go get` to retrieve the SDK to add it to your `GOPATH` workspace, or
17project's Go module dependencies.
18
19	go get github.com/aws/aws-sdk-go
20
21To update the SDK use `go get -u` to retrieve the latest version of the SDK.
22
23	go get -u github.com/aws/aws-sdk-go
24
25### Dependencies
26
27The SDK includes a `vendor` folder containing the runtime dependencies of the
28SDK. The metadata of the SDK's dependencies can be found in the Go module file
29`go.mod` or Dep file `Gopkg.toml`.
30
31### Go Modules
32
33If you are using Go modules, your `go get` will default to the latest tagged
34release version of the SDK. To get a specific release version of the SDK use
35`@<tag>` in your `go get` command.
36
37	go get github.com/aws/aws-sdk-go@v1.15.77
38
39To get the latest SDK repository change use `@latest`.
40
41	go get github.com/aws/aws-sdk-go@latest
42
43### Go 1.5
44
45If you are using Go 1.5 without vendoring enabled, (`GO15VENDOREXPERIMENT=1`),
46you will need to use `...` when retrieving the SDK to get its dependencies.
47
48	go get github.com/aws/aws-sdk-go/...
49
50This will still include the `vendor` folder. The `vendor` folder can be deleted
51if not used by your environment.
52
53    rm -rf $GOPATH/src/github.com/aws/aws-sdk-go/vendor
54
55## Getting Help
56
57Please use these community resources for getting help. We use the GitHub issues
58for tracking bugs and feature requests.
59
60* Ask a question on [StackOverflow](http://stackoverflow.com/) and tag it with the [`aws-sdk-go`](http://stackoverflow.com/questions/tagged/aws-sdk-go) tag.
61* Come join the AWS SDK for Go community chat on [gitter](https://gitter.im/aws/aws-sdk-go).
62* Open a support ticket with [AWS Support](http://docs.aws.amazon.com/awssupport/latest/user/getting-started.html).
63* If you think you may have found a bug, please open an [issue](https://github.com/aws/aws-sdk-go/issues/new).
64
65## Opening Issues
66
67If you encounter a bug with the AWS SDK for Go we would like to hear about it.
68Search the [existing issues](https://github.com/aws/aws-sdk-go/issues) and see
69if others are also experiencing the issue before opening a new issue. Please
70include the version of AWS SDK for Go, Go language, and OS you’re using. Please
71also include reproduction case when appropriate.
72
73The GitHub issues are intended for bug reports and feature requests. For help
74and questions with using AWS SDK for GO please make use of the resources listed
75in the [Getting Help](https://github.com/aws/aws-sdk-go#getting-help) section.
76Keeping the list of open issues lean will help us respond in a timely manner.
77
78## Reference Documentation
79
80[`Getting Started Guide`](https://aws.amazon.com/sdk-for-go/) - This document
81is a general introduction on how to configure and make requests with the SDK.
82If this is your first time using the SDK, this documentation and the API
83documentation will help you get started. This document focuses on the syntax
84and behavior of the SDK. The [Service Developer
85Guide](https://aws.amazon.com/documentation/) will help you get started using
86specific AWS services.
87
88[`SDK API Reference
89Documentation`](https://docs.aws.amazon.com/sdk-for-go/api/) - Use this
90document to look up all API operation input and output parameters for AWS
91services supported by the SDK. The API reference also includes documentation of
92the SDK, and examples how to using the SDK, service client API operations, and
93API operation require parameters.
94
95[`Service Developer Guide`](https://aws.amazon.com/documentation/) - Use this
96documentation to learn how to interface with AWS services. These are great
97guides both, if you're getting started with a service, or looking for more
98information on a service. You should not need this document for coding, though
99in some cases, services may supply helpful samples that you might want to look
100out for.
101
102[`SDK Examples`](https://github.com/aws/aws-sdk-go/tree/master/example) -
103Included in the SDK's repo are several hand crafted examples using the SDK
104features and AWS services.
105
106## Overview of SDK's Packages
107
108The SDK is composed of two main components, SDK core, and service clients.
109The SDK core packages are all available under the aws package at the root of
110the SDK. Each client for a supported AWS service is available within its own
111package under the service folder at the root of the SDK.
112
113  * aws - SDK core, provides common shared types such as Config, Logger,
114    and utilities to make working with API parameters easier.
115
116      * awserr - Provides the error interface that the SDK will use for all
117        errors that occur in the SDK's processing. This includes service API
118        response errors as well. The Error type is made up of a code and message.
119        Cast the SDK's returned error type to awserr.Error and call the Code
120        method to compare returned error to specific error codes. See the package's
121        documentation for additional values that can be extracted such as RequestID.
122
123      * credentials - Provides the types and built in credentials providers
124        the SDK will use to retrieve AWS credentials to make API requests with.
125        Nested under this folder are also additional credentials providers such as
126        stscreds for assuming IAM roles, and ec2rolecreds for EC2 Instance roles.
127
128      * endpoints - Provides the AWS Regions and Endpoints metadata for the SDK.
129        Use this to lookup AWS service endpoint information such as which services
130        are in a region, and what regions a service is in. Constants are also provided
131        for all region identifiers, e.g UsWest2RegionID for "us-west-2".
132
133      * session - Provides initial default configuration, and load
134        configuration from external sources such as environment and shared
135        credentials file.
136
137      * request - Provides the API request sending, and retry logic for the SDK.
138        This package also includes utilities for defining your own request
139        retryer, and configuring how the SDK processes the request.
140
141  * service - Clients for AWS services. All services supported by the SDK are
142    available under this folder.
143
144## How to Use the SDK's AWS Service Clients
145
146The SDK includes the Go types and utilities you can use to make requests to
147AWS service APIs. Within the service folder at the root of the SDK you'll find
148a package for each AWS service the SDK supports. All service clients follow common pattern of creation and usage.
149
150When creating a client for an AWS service you'll first need to have a Session
151value constructed. The Session provides shared configuration that can be shared
152between your service clients. When service clients are created you can pass
153in additional configuration via the aws.Config type to override configuration
154provided by in the Session to create service client instances with custom
155configuration.
156
157Once the service's client is created you can use it to make API requests the
158AWS service. These clients are safe to use concurrently.
159
160## Configuring the SDK
161
162In the AWS SDK for Go, you can configure settings for service clients, such
163as the log level and maximum number of retries. Most settings are optional;
164however, for each service client, you must specify a region and your credentials.
165The SDK uses these values to send requests to the correct AWS region and sign
166requests with the correct credentials. You can specify these values as part
167of a session or as environment variables.
168
169See the SDK's [configuration guide][config_guide] for more information.
170
171See the [session][session_pkg] package documentation for more information on how to use Session
172with the SDK.
173
174See the [Config][config_typ] type in the [aws][aws_pkg] package for more information on configuration
175options.
176
177[config_guide]: https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html
178[session_pkg]: https://docs.aws.amazon.com/sdk-for-go/api/aws/session/
179[config_typ]: https://docs.aws.amazon.com/sdk-for-go/api/aws/#Config
180[aws_pkg]: https://docs.aws.amazon.com/sdk-for-go/api/aws/
181
182### Configuring Credentials
183
184When using the SDK you'll generally need your AWS credentials to authenticate
185with AWS services. The SDK supports multiple methods of supporting these
186credentials. By default the SDK will source credentials automatically from
187its default credential chain. See the session package for more information
188on this chain, and how to configure it. The common items in the credential
189chain are the following:
190
191  * Environment Credentials - Set of environment variables that are useful
192    when sub processes are created for specific roles.
193
194  * Shared Credentials file (~/.aws/credentials) - This file stores your
195    credentials based on a profile name and is useful for local development.
196
197  * EC2 Instance Role Credentials - Use EC2 Instance Role to assign credentials
198    to application running on an EC2 instance. This removes the need to manage
199    credential files in production.
200
201Credentials can be configured in code as well by setting the Config's Credentials
202value to a custom provider or using one of the providers included with the
203SDK to bypass the default credential chain and use a custom one. This is
204helpful when you want to instruct the SDK to only use a specific set of
205credentials or providers.
206
207This example creates a credential provider for assuming an IAM role, "myRoleARN"
208and configures the S3 service client to use that role for API requests.
209
210```go
211  // Initial credentials loaded from SDK's default credential chain. Such as
212  // the environment, shared credentials (~/.aws/credentials), or EC2 Instance
213  // Role. These credentials will be used to to make the STS Assume Role API.
214  sess := session.Must(session.NewSession())
215
216  // Create the credentials from AssumeRoleProvider to assume the role
217  // referenced by the "myRoleARN" ARN.
218  creds := stscreds.NewCredentials(sess, "myRoleArn")
219
220  // Create service client value configured for credentials
221  // from assumed role.
222  svc := s3.New(sess, &aws.Config{Credentials: creds})
223```
224
225See the [credentials][credentials_pkg] package documentation for more information on credential
226providers included with the SDK, and how to customize the SDK's usage of
227credentials.
228
229The SDK has support for the shared configuration file (~/.aws/config). This
230support can be enabled by setting the environment variable, "AWS_SDK_LOAD_CONFIG=1",
231or enabling the feature in code when creating a Session via the
232Option's SharedConfigState parameter.
233
234```go
235  sess := session.Must(session.NewSessionWithOptions(session.Options{
236      SharedConfigState: session.SharedConfigEnable,
237  }))
238```
239
240[credentials_pkg]: https://docs.aws.amazon.com/sdk-for-go/api/aws/credentials
241
242### Configuring AWS Region
243
244In addition to the credentials you'll need to specify the region the SDK
245will use to make AWS API requests to. In the SDK you can specify the region
246either with an environment variable, or directly in code when a Session or
247service client is created. The last value specified in code wins if the region
248is specified multiple ways.
249
250To set the region via the environment variable set the "AWS_REGION" to the
251region you want to the SDK to use. Using this method to set the region will
252allow you to run your application in multiple regions without needing additional
253code in the application to select the region.
254
255    AWS_REGION=us-west-2
256
257The endpoints package includes constants for all regions the SDK knows. The
258values are all suffixed with RegionID. These values are helpful, because they
259reduce the need to type the region string manually.
260
261To set the region on a Session use the aws package's Config struct parameter
262Region to the AWS region you want the service clients created from the session to
263use. This is helpful when you want to create multiple service clients, and
264all of the clients make API requests to the same region.
265
266```go
267  sess := session.Must(session.NewSession(&aws.Config{
268      Region: aws.String(endpoints.UsWest2RegionID),
269  }))
270```
271
272See the [endpoints][endpoints_pkg] package for the AWS Regions and Endpoints metadata.
273
274In addition to setting the region when creating a Session you can also set
275the region on a per service client bases. This overrides the region of a
276Session. This is helpful when you want to create service clients in specific
277regions different from the Session's region.
278
279```go
280  svc := s3.New(sess, &aws.Config{
281      Region: aws.String(endpoints.UsWest2RegionID),
282  })
283```
284
285See the [Config][config_typ] type in the [aws][aws_pkg] package for more information and additional
286options such as setting the Endpoint, and other service client configuration options.
287
288[endpoints_pkg]: https://docs.aws.amazon.com/sdk-for-go/api/aws/endpoints/
289
290## Making API Requests
291
292Once the client is created you can make an API request to the service.
293Each API method takes a input parameter, and returns the service response
294and an error. The SDK provides methods for making the API call in multiple ways.
295
296In this list we'll use the S3 ListObjects API as an example for the different
297ways of making API requests.
298
299  * ListObjects - Base API operation that will make the API request to the service.
300
301  * ListObjectsRequest - API methods suffixed with Request will construct the
302    API request, but not send it. This is also helpful when you want to get a
303    presigned URL for a request, and share the presigned URL instead of your
304    application making the request directly.
305
306  * ListObjectsPages - Same as the base API operation, but uses a callback to
307    automatically handle pagination of the API's response.
308
309  * ListObjectsWithContext - Same as base API operation, but adds support for
310    the Context pattern. This is helpful for controlling the canceling of in
311    flight requests. See the Go standard library context package for more
312    information. This method also takes request package's Option functional
313    options as the variadic argument for modifying how the request will be
314    made, or extracting information from the raw HTTP response.
315
316  * ListObjectsPagesWithContext - same as ListObjectsPages, but adds support for
317    the Context pattern. Similar to ListObjectsWithContext this method also
318    takes the request package's Option function option types as the variadic
319    argument.
320
321In addition to the API operations the SDK also includes several higher level
322methods that abstract checking for and waiting for an AWS resource to be in
323a desired state. In this list we'll use WaitUntilBucketExists to demonstrate
324the different forms of waiters.
325
326  * WaitUntilBucketExists. - Method to make API request to query an AWS service for
327    a resource's state. Will return successfully when that state is accomplished.
328
329  * WaitUntilBucketExistsWithContext - Same as WaitUntilBucketExists, but adds
330    support for the Context pattern. In addition these methods take request
331    package's WaiterOptions to configure the waiter, and how underlying request
332    will be made by the SDK.
333
334The API method will document which error codes the service might return for
335the operation. These errors will also be available as const strings prefixed
336with "ErrCode" in the service client's package. If there are no errors listed
337in the API's SDK documentation you'll need to consult the AWS service's API
338documentation for the errors that could be returned.
339
340```go
341  ctx := context.Background()
342
343  result, err := svc.GetObjectWithContext(ctx, &s3.GetObjectInput{
344      Bucket: aws.String("my-bucket"),
345      Key: aws.String("my-key"),
346  })
347  if err != nil {
348      // Cast err to awserr.Error to handle specific error codes.
349      aerr, ok := err.(awserr.Error)
350      if ok && aerr.Code() == s3.ErrCodeNoSuchKey {
351          // Specific error code handling
352      }
353      return err
354  }
355
356  // Make sure to close the body when done with it for S3 GetObject APIs or
357  // will leak connections.
358  defer result.Body.Close()
359
360  fmt.Println("Object Size:", aws.Int64Value(result.ContentLength))
361```
362
363### API Request Pagination and Resource Waiters
364
365Pagination helper methods are suffixed with "Pages", and provide the
366functionality needed to round trip API page requests. Pagination methods
367take a callback function that will be called for each page of the API's response.
368
369```go
370   objects := []string{}
371   err := svc.ListObjectsPagesWithContext(ctx, &s3.ListObjectsInput{
372       Bucket: aws.String(myBucket),
373   }, func(p *s3.ListObjectsOutput, lastPage bool) bool {
374       for _, o := range p.Contents {
375           objects = append(objects, aws.StringValue(o.Key))
376       }
377       return true // continue paging
378   })
379   if err != nil {
380       panic(fmt.Sprintf("failed to list objects for bucket, %s, %v", myBucket, err))
381   }
382
383   fmt.Println("Objects in bucket:", objects)
384```
385
386Waiter helper methods provide the functionality to wait for an AWS resource
387state. These methods abstract the logic needed to check the state of an
388AWS resource, and wait until that resource is in a desired state. The waiter
389will block until the resource is in the state that is desired, an error occurs,
390or the waiter times out. If a resource times out the error code returned will
391be request.WaiterResourceNotReadyErrorCode.
392
393```go
394  err := svc.WaitUntilBucketExistsWithContext(ctx, &s3.HeadBucketInput{
395      Bucket: aws.String(myBucket),
396  })
397  if err != nil {
398      aerr, ok := err.(awserr.Error)
399      if ok && aerr.Code() == request.WaiterResourceNotReadyErrorCode {
400          fmt.Fprintf(os.Stderr, "timed out while waiting for bucket to exist")
401      }
402      panic(fmt.Errorf("failed to wait for bucket to exist, %v", err))
403  }
404  fmt.Println("Bucket", myBucket, "exists")
405```
406
407## Complete SDK Example
408
409This example shows a complete working Go file which will upload a file to S3
410and use the Context pattern to implement timeout logic that will cancel the
411request if it takes too long. This example highlights how to use sessions,
412create a service client, make a request, handle the error, and process the
413response.
414
415```go
416  package main
417
418  import (
419  	"context"
420  	"flag"
421  	"fmt"
422  	"os"
423  	"time"
424
425  	"github.com/aws/aws-sdk-go/aws"
426  	"github.com/aws/aws-sdk-go/aws/awserr"
427  	"github.com/aws/aws-sdk-go/aws/request"
428  	"github.com/aws/aws-sdk-go/aws/session"
429  	"github.com/aws/aws-sdk-go/service/s3"
430  )
431
432  // Uploads a file to S3 given a bucket and object key. Also takes a duration
433  // value to terminate the update if it doesn't complete within that time.
434  //
435  // The AWS Region needs to be provided in the AWS shared config or on the
436  // environment variable as `AWS_REGION`. Credentials also must be provided
437  // Will default to shared config file, but can load from environment if provided.
438  //
439  // Usage:
440  //   # Upload myfile.txt to myBucket/myKey. Must complete within 10 minutes or will fail
441  //   go run withContext.go -b mybucket -k myKey -d 10m < myfile.txt
442  func main() {
443  	var bucket, key string
444  	var timeout time.Duration
445
446  	flag.StringVar(&bucket, "b", "", "Bucket name.")
447  	flag.StringVar(&key, "k", "", "Object key name.")
448  	flag.DurationVar(&timeout, "d", 0, "Upload timeout.")
449  	flag.Parse()
450
451  	// All clients require a Session. The Session provides the client with
452 	// shared configuration such as region, endpoint, and credentials. A
453 	// Session should be shared where possible to take advantage of
454 	// configuration and credential caching. See the session package for
455 	// more information.
456  	sess := session.Must(session.NewSession())
457
458 	// Create a new instance of the service's client with a Session.
459 	// Optional aws.Config values can also be provided as variadic arguments
460 	// to the New function. This option allows you to provide service
461 	// specific configuration.
462  	svc := s3.New(sess)
463
464  	// Create a context with a timeout that will abort the upload if it takes
465  	// more than the passed in timeout.
466  	ctx := context.Background()
467  	var cancelFn func()
468  	if timeout > 0 {
469  		ctx, cancelFn = context.WithTimeout(ctx, timeout)
470  	}
471  	// Ensure the context is canceled to prevent leaking.
472  	// See context package for more information, https://golang.org/pkg/context/
473	if cancelFn != nil {
474  		defer cancelFn()
475	}
476
477  	// Uploads the object to S3. The Context will interrupt the request if the
478  	// timeout expires.
479  	_, err := svc.PutObjectWithContext(ctx, &s3.PutObjectInput{
480  		Bucket: aws.String(bucket),
481  		Key:    aws.String(key),
482  		Body:   os.Stdin,
483  	})
484  	if err != nil {
485  		if aerr, ok := err.(awserr.Error); ok && aerr.Code() == request.CanceledErrorCode {
486  			// If the SDK can determine the request or retry delay was canceled
487  			// by a context the CanceledErrorCode error code will be returned.
488  			fmt.Fprintf(os.Stderr, "upload canceled due to timeout, %v\n", err)
489  		} else {
490  			fmt.Fprintf(os.Stderr, "failed to upload object, %v\n", err)
491  		}
492  		os.Exit(1)
493  	}
494
495  	fmt.Printf("successfully uploaded file to %s/%s\n", bucket, key)
496  }
497```
498
499## License
500
501This SDK is distributed under the
502[Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0),
503see LICENSE.txt and NOTICE.txt for more information.
504