| // Package sdk is the official AWS SDK for the Go programming language. |
| // |
| // The AWS SDK for Go provides APIs and utilities that developers can use to |
| // build Go applications that use AWS services, such as Amazon Elastic Compute |
| // Cloud (Amazon EC2) and Amazon Simple Storage Service (Amazon S3). |
| // |
| // The SDK removes the complexity of coding directly against a web service |
| // interface. It hides a lot of the lower-level plumbing, such as authentication, |
| // request retries, and error handling. |
| // |
| // The SDK also includes helpful utilities on top of the AWS APIs that add additional |
| // capabilities and functionality. For example, the Amazon S3 Download and Upload |
| // Manager will automatically split up large objects into multiple parts and |
| // transfer them concurrently. |
| // |
| // See the s3manager package documentation for more information. |
| // https://docs.aws.amazon.com/sdk-for-go/api/service/s3/s3manager/ |
| // |
| // Getting More Information |
| // |
| // Checkout the Getting Started Guide and API Reference Docs detailed the SDK's |
| // components and details on each AWS client the SDK supports. |
| // |
| // The Getting Started Guide provides examples and detailed description of how |
| // to get setup with the SDK. |
| // https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/welcome.html |
| // |
| // The API Reference Docs include a detailed breakdown of the SDK's components |
| // such as utilities and AWS clients. Use this as a reference of the Go types |
| // included with the SDK, such as AWS clients, API operations, and API parameters. |
| // https://docs.aws.amazon.com/sdk-for-go/api/ |
| // |
| // Overview of SDK's Packages |
| // |
| // The SDK is composed of two main components, SDK core, and service clients. |
| // The SDK core packages are all available under the aws package at the root of |
| // the SDK. Each client for a supported AWS service is available within its own |
| // package under the service folder at the root of the SDK. |
| // |
| // * aws - SDK core, provides common shared types such as Config, Logger, |
| // and utilities to make working with API parameters easier. |
| // |
| // * awserr - Provides the error interface that the SDK will use for all |
| // errors that occur in the SDK's processing. This includes service API |
| // response errors as well. The Error type is made up of a code and message. |
| // Cast the SDK's returned error type to awserr.Error and call the Code |
| // method to compare returned error to specific error codes. See the package's |
| // documentation for additional values that can be extracted such as RequestId. |
| // |
| // * credentials - Provides the types and built in credentials providers |
| // the SDK will use to retrieve AWS credentials to make API requests with. |
| // Nested under this folder are also additional credentials providers such as |
| // stscreds for assuming IAM roles, and ec2rolecreds for EC2 Instance roles. |
| // |
| // * endpoints - Provides the AWS Regions and Endpoints metadata for the SDK. |
| // Use this to lookup AWS service endpoint information such as which services |
| // are in a region, and what regions a service is in. Constants are also provided |
| // for all region identifiers, e.g UsWest2RegionID for "us-west-2". |
| // |
| // * session - Provides initial default configuration, and load |
| // configuration from external sources such as environment and shared |
| // credentials file. |
| // |
| // * request - Provides the API request sending, and retry logic for the SDK. |
| // This package also includes utilities for defining your own request |
| // retryer, and configuring how the SDK processes the request. |
| // |
| // * service - Clients for AWS services. All services supported by the SDK are |
| // available under this folder. |
| // |
| // How to Use the SDK's AWS Service Clients |
| // |
| // The SDK includes the Go types and utilities you can use to make requests to |
| // AWS service APIs. Within the service folder at the root of the SDK you'll find |
| // a package for each AWS service the SDK supports. All service clients follows |
| // a common pattern of creation and usage. |
| // |
| // When creating a client for an AWS service you'll first need to have a Session |
| // value constructed. The Session provides shared configuration that can be shared |
| // between your service clients. When service clients are created you can pass |
| // in additional configuration via the aws.Config type to override configuration |
| // provided by in the Session to create service client instances with custom |
| // configuration. |
| // |
| // Once the service's client is created you can use it to make API requests the |
| // AWS service. These clients are safe to use concurrently. |
| // |
| // Configuring the SDK |
| // |
| // In the AWS SDK for Go, you can configure settings for service clients, such |
| // as the log level and maximum number of retries. Most settings are optional; |
| // however, for each service client, you must specify a region and your credentials. |
| // The SDK uses these values to send requests to the correct AWS region and sign |
| // requests with the correct credentials. You can specify these values as part |
| // of a session or as environment variables. |
| // |
| // See the SDK's configuration guide for more information. |
| // https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html |
| // |
| // See the session package documentation for more information on how to use Session |
| // with the SDK. |
| // https://docs.aws.amazon.com/sdk-for-go/api/aws/session/ |
| // |
| // See the Config type in the aws package for more information on configuration |
| // options. |
| // https://docs.aws.amazon.com/sdk-for-go/api/aws/#Config |
| // |
| // Configuring Credentials |
| // |
| // When using the SDK you'll generally need your AWS credentials to authenticate |
| // with AWS services. The SDK supports multiple methods of supporting these |
| // credentials. By default the SDK will source credentials automatically from |
| // its default credential chain. See the session package for more information |
| // on this chain, and how to configure it. The common items in the credential |
| // chain are the following: |
| // |
| // * Environment Credentials - Set of environment variables that are useful |
| // when sub processes are created for specific roles. |
| // |
| // * Shared Credentials file (~/.aws/credentials) - This file stores your |
| // credentials based on a profile name and is useful for local development. |
| // |
| // * EC2 Instance Role Credentials - Use EC2 Instance Role to assign credentials |
| // to application running on an EC2 instance. This removes the need to manage |
| // credential files in production. |
| // |
| // Credentials can be configured in code as well by setting the Config's Credentials |
| // value to a custom provider or using one of the providers included with the |
| // SDK to bypass the default credential chain and use a custom one. This is |
| // helpful when you want to instruct the SDK to only use a specific set of |
| // credentials or providers. |
| // |
| // This example creates a credential provider for assuming an IAM role, "myRoleARN" |
| // and configures the S3 service client to use that role for API requests. |
| // |
| // // Initial credentials loaded from SDK's default credential chain. Such as |
| // // the environment, shared credentials (~/.aws/credentials), or EC2 Instance |
| // // Role. These credentials will be used to to make the STS Assume Role API. |
| // sess := session.Must(session.NewSession()) |
| // |
| // // Create the credentials from AssumeRoleProvider to assume the role |
| // // referenced by the "myRoleARN" ARN. |
| // creds := stscreds.NewCredentials(sess, "myRoleArn") |
| // |
| // // Create service client value configured for credentials |
| // // from assumed role. |
| // svc := s3.New(sess, &aws.Config{Credentials: creds})/ |
| // |
| // See the credentials package documentation for more information on credential |
| // providers included with the SDK, and how to customize the SDK's usage of |
| // credentials. |
| // https://docs.aws.amazon.com/sdk-for-go/api/aws/credentials |
| // |
| // The SDK has support for the shared configuration file (~/.aws/config). This |
| // support can be enabled by setting the environment variable, "AWS_SDK_LOAD_CONFIG=1", |
| // or enabling the feature in code when creating a Session via the |
| // Option's SharedConfigState parameter. |
| // |
| // sess := session.Must(session.NewSessionWithOptions(session.Options{ |
| // SharedConfigState: session.SharedConfigEnable, |
| // })) |
| // |
| // Configuring AWS Region |
| // |
| // In addition to the credentials you'll need to specify the region the SDK |
| // will use to make AWS API requests to. In the SDK you can specify the region |
| // either with an environment variable, or directly in code when a Session or |
| // service client is created. The last value specified in code wins if the region |
| // is specified multiple ways. |
| // |
| // To set the region via the environment variable set the "AWS_REGION" to the |
| // region you want to the SDK to use. Using this method to set the region will |
| // allow you to run your application in multiple regions without needing additional |
| // code in the application to select the region. |
| // |
| // AWS_REGION=us-west-2 |
| // |
| // The endpoints package includes constants for all regions the SDK knows. The |
| // values are all suffixed with RegionID. These values are helpful, because they |
| // reduce the need to type the region string manually. |
| // |
| // To set the region on a Session use the aws package's Config struct parameter |
| // Region to the AWS region you want the service clients created from the session to |
| // use. This is helpful when you want to create multiple service clients, and |
| // all of the clients make API requests to the same region. |
| // |
| // sess := session.Must(session.NewSession(&aws.Config{ |
| // Region: aws.String(endpoints.UsWest2RegionID), |
| // })) |
| // |
| // See the endpoints package for the AWS Regions and Endpoints metadata. |
| // https://docs.aws.amazon.com/sdk-for-go/api/aws/endpoints/ |
| // |
| // In addition to setting the region when creating a Session you can also set |
| // the region on a per service client bases. This overrides the region of a |
| // Session. This is helpful when you want to create service clients in specific |
| // regions different from the Session's region. |
| // |
| // svc := s3.New(sess, &aws.Config{ |
| // Region: aws.String(endpoints.UsWest2RegionID), |
| // }) |
| // |
| // See the Config type in the aws package for more information and additional |
| // options such as setting the Endpoint, and other service client configuration options. |
| // https://docs.aws.amazon.com/sdk-for-go/api/aws/#Config |
| // |
| // Making API Requests |
| // |
| // Once the client is created you can make an API request to the service. |
| // Each API method takes a input parameter, and returns the service response |
| // and an error. The SDK provides methods for making the API call in multiple ways. |
| // |
| // In this list we'll use the S3 ListObjects API as an example for the different |
| // ways of making API requests. |
| // |
| // * ListObjects - Base API operation that will make the API request to the service. |
| // |
| // * ListObjectsRequest - API methods suffixed with Request will construct the |
| // API request, but not send it. This is also helpful when you want to get a |
| // presigned URL for a request, and share the presigned URL instead of your |
| // application making the request directly. |
| // |
| // * ListObjectsPages - Same as the base API operation, but uses a callback to |
| // automatically handle pagination of the API's response. |
| // |
| // * ListObjectsWithContext - Same as base API operation, but adds support for |
| // the Context pattern. This is helpful for controlling the canceling of in |
| // flight requests. See the Go standard library context package for more |
| // information. This method also takes request package's Option functional |
| // options as the variadic argument for modifying how the request will be |
| // made, or extracting information from the raw HTTP response. |
| // |
| // * ListObjectsPagesWithContext - same as ListObjectsPages, but adds support for |
| // the Context pattern. Similar to ListObjectsWithContext this method also |
| // takes the request package's Option function option types as the variadic |
| // argument. |
| // |
| // In addition to the API operations the SDK also includes several higher level |
| // methods that abstract checking for and waiting for an AWS resource to be in |
| // a desired state. In this list we'll use WaitUntilBucketExists to demonstrate |
| // the different forms of waiters. |
| // |
| // * WaitUntilBucketExists. - Method to make API request to query an AWS service for |
| // a resource's state. Will return successfully when that state is accomplished. |
| // |
| // * WaitUntilBucketExistsWithContext - Same as WaitUntilBucketExists, but adds |
| // support for the Context pattern. In addition these methods take request |
| // package's WaiterOptions to configure the waiter, and how underlying request |
| // will be made by the SDK. |
| // |
| // The API method will document which error codes the service might return for |
| // the operation. These errors will also be available as const strings prefixed |
| // with "ErrCode" in the service client's package. If there are no errors listed |
| // in the API's SDK documentation you'll need to consult the AWS service's API |
| // documentation for the errors that could be returned. |
| // |
| // ctx := context.Background() |
| // |
| // result, err := svc.GetObjectWithContext(ctx, &s3.GetObjectInput{ |
| // Bucket: aws.String("my-bucket"), |
| // Key: aws.String("my-key"), |
| // }) |
| // if err != nil { |
| // // Cast err to awserr.Error to handle specific error codes. |
| // aerr, ok := err.(awserr.Error) |
| // if ok && aerr.Code() == s3.ErrCodeNoSuchKey { |
| // // Specific error code handling |
| // } |
| // return err |
| // } |
| // |
| // // Make sure to close the body when done with it for S3 GetObject APIs or |
| // // will leak connections. |
| // defer result.Body.Close() |
| // |
| // fmt.Println("Object Size:", aws.StringValue(result.ContentLength)) |
| // |
| // API Request Pagination and Resource Waiters |
| // |
| // Pagination helper methods are suffixed with "Pages", and provide the |
| // functionality needed to round trip API page requests. Pagination methods |
| // take a callback function that will be called for each page of the API's response. |
| // |
| // objects := []string{} |
| // err := svc.ListObjectsPagesWithContext(ctx, &s3.ListObjectsInput{ |
| // Bucket: aws.String(myBucket), |
| // }, func(p *s3.ListObjectsOutput, lastPage bool) bool { |
| // for _, o := range p.Contents { |
| // objects = append(objects, aws.StringValue(o.Key)) |
| // } |
| // return true // continue paging |
| // }) |
| // if err != nil { |
| // panic(fmt.Sprintf("failed to list objects for bucket, %s, %v", myBucket, err)) |
| // } |
| // |
| // fmt.Println("Objects in bucket:", objects) |
| // |
| // Waiter helper methods provide the functionality to wait for an AWS resource |
| // state. These methods abstract the logic needed to to check the state of an |
| // AWS resource, and wait until that resource is in a desired state. The waiter |
| // will block until the resource is in the state that is desired, an error occurs, |
| // or the waiter times out. If a resource times out the error code returned will |
| // be request.WaiterResourceNotReadyErrorCode. |
| // |
| // err := svc.WaitUntilBucketExistsWithContext(ctx, &s3.HeadBucketInput{ |
| // Bucket: aws.String(myBucket), |
| // }) |
| // if err != nil { |
| // aerr, ok := err.(awserr.Error) |
| // if ok && aerr.Code() == request.WaiterResourceNotReadyErrorCode { |
| // fmt.Fprintf(os.Stderr, "timed out while waiting for bucket to exist") |
| // } |
| // panic(fmt.Errorf("failed to wait for bucket to exist, %v", err)) |
| // } |
| // fmt.Println("Bucket", myBucket, "exists") |
| // |
| // Complete SDK Example |
| // |
| // This example shows a complete working Go file which will upload a file to S3 |
| // and use the Context pattern to implement timeout logic that will cancel the |
| // request if it takes too long. This example highlights how to use sessions, |
| // create a service client, make a request, handle the error, and process the |
| // response. |
| // |
| // package main |
| // |
| // import ( |
| // "context" |
| // "flag" |
| // "fmt" |
| // "os" |
| // "time" |
| // |
| // "github.com/aws/aws-sdk-go/aws" |
| // "github.com/aws/aws-sdk-go/aws/awserr" |
| // "github.com/aws/aws-sdk-go/aws/request" |
| // "github.com/aws/aws-sdk-go/aws/session" |
| // "github.com/aws/aws-sdk-go/service/s3" |
| // ) |
| // |
| // // Uploads a file to S3 given a bucket and object key. Also takes a duration |
| // // value to terminate the update if it doesn't complete within that time. |
| // // |
| // // The AWS Region needs to be provided in the AWS shared config or on the |
| // // environment variable as `AWS_REGION`. Credentials also must be provided |
| // // Will default to shared config file, but can load from environment if provided. |
| // // |
| // // Usage: |
| // // # Upload myfile.txt to myBucket/myKey. Must complete within 10 minutes or will fail |
| // // go run withContext.go -b mybucket -k myKey -d 10m < myfile.txt |
| // func main() { |
| // var bucket, key string |
| // var timeout time.Duration |
| // |
| // flag.StringVar(&bucket, "b", "", "Bucket name.") |
| // flag.StringVar(&key, "k", "", "Object key name.") |
| // flag.DurationVar(&timeout, "d", 0, "Upload timeout.") |
| // flag.Parse() |
| // |
| // // All clients require a Session. The Session provides the client with |
| // // shared configuration such as region, endpoint, and credentials. A |
| // // Session should be shared where possible to take advantage of |
| // // configuration and credential caching. See the session package for |
| // // more information. |
| // sess := session.Must(session.NewSession()) |
| // |
| // // Create a new instance of the service's client with a Session. |
| // // Optional aws.Config values can also be provided as variadic arguments |
| // // to the New function. This option allows you to provide service |
| // // specific configuration. |
| // svc := s3.New(sess) |
| // |
| // // Create a context with a timeout that will abort the upload if it takes |
| // // more than the passed in timeout. |
| // ctx := context.Background() |
| // var cancelFn func() |
| // if timeout > 0 { |
| // ctx, cancelFn = context.WithTimeout(ctx, timeout) |
| // } |
| // // Ensure the context is canceled to prevent leaking. |
| // // See context package for more information, https://golang.org/pkg/context/ |
| // defer cancelFn() |
| // |
| // // Uploads the object to S3. The Context will interrupt the request if the |
| // // timeout expires. |
| // _, err := svc.PutObjectWithContext(ctx, &s3.PutObjectInput{ |
| // Bucket: aws.String(bucket), |
| // Key: aws.String(key), |
| // Body: os.Stdin, |
| // }) |
| // if err != nil { |
| // if aerr, ok := err.(awserr.Error); ok && aerr.Code() == request.CanceledErrorCode { |
| // // If the SDK can determine the request or retry delay was canceled |
| // // by a context the CanceledErrorCode error code will be returned. |
| // fmt.Fprintf(os.Stderr, "upload canceled due to timeout, %v\n", err) |
| // } else { |
| // fmt.Fprintf(os.Stderr, "failed to upload object, %v\n", err) |
| // } |
| // os.Exit(1) |
| // } |
| // |
| // fmt.Printf("successfully uploaded file to %s/%s\n", bucket, key) |
| // } |
| package sdk |
| |
| import ( |
| "github.com/jmespath/go-jmespath" |
| ) |
| |
| const _ = jmespath.ASTEmpty |