mirror of
https://github.com/ceph/ceph-csi.git
synced 2024-11-10 00:10:20 +00:00
rebase: vendor pkgs for Amazon KMS support
Signed-off-by: Niels de Vos <ndevos@redhat.com>
This commit is contained in:
parent
1c1683ba20
commit
78cb7af46f
1
go.mod
1
go.mod
@ -3,6 +3,7 @@ module github.com/ceph/ceph-csi
|
|||||||
go 1.13
|
go 1.13
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
github.com/aws/aws-sdk-go v1.38.8
|
||||||
github.com/ceph/go-ceph v0.8.0
|
github.com/ceph/go-ceph v0.8.0
|
||||||
github.com/container-storage-interface/spec v1.3.0
|
github.com/container-storage-interface/spec v1.3.0
|
||||||
github.com/go-logr/logr v0.2.1 // indirect
|
github.com/go-logr/logr v0.2.1 // indirect
|
||||||
|
2
go.sum
2
go.sum
@ -156,6 +156,8 @@ github.com/aws/aws-sdk-go v1.28.2/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN
|
|||||||
github.com/aws/aws-sdk-go v1.30.27/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0=
|
github.com/aws/aws-sdk-go v1.30.27/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0=
|
||||||
github.com/aws/aws-sdk-go v1.35.24 h1:U3GNTg8+7xSM6OAJ8zksiSM4bRqxBWmVwwehvOSNG3A=
|
github.com/aws/aws-sdk-go v1.35.24 h1:U3GNTg8+7xSM6OAJ8zksiSM4bRqxBWmVwwehvOSNG3A=
|
||||||
github.com/aws/aws-sdk-go v1.35.24/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k=
|
github.com/aws/aws-sdk-go v1.35.24/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k=
|
||||||
|
github.com/aws/aws-sdk-go v1.38.8 h1:rQz2XmTYIdO7FUvLF2Nd1+a7nqzAhnm0bphbhlgDdGw=
|
||||||
|
github.com/aws/aws-sdk-go v1.38.8/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
|
||||||
github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc=
|
github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc=
|
||||||
github.com/bazelbuild/bazel-gazelle v0.18.2/go.mod h1:D0ehMSbS+vesFsLGiD6JXu3mVEzOlfUl8wNnq+x/9p0=
|
github.com/bazelbuild/bazel-gazelle v0.18.2/go.mod h1:D0ehMSbS+vesFsLGiD6JXu3mVEzOlfUl8wNnq+x/9p0=
|
||||||
github.com/bazelbuild/bazel-gazelle v0.19.1-0.20191105222053-70208cbdc798/go.mod h1:rPwzNHUqEzngx1iVBfO/2X2npKaT3tqPqqHW6rVsn/A=
|
github.com/bazelbuild/bazel-gazelle v0.19.1-0.20191105222053-70208cbdc798/go.mod h1:rPwzNHUqEzngx1iVBfO/2X2npKaT3tqPqqHW6rVsn/A=
|
||||||
|
4
vendor/github.com/aws/aws-sdk-go/aws/client/client.go
generated
vendored
4
vendor/github.com/aws/aws-sdk-go/aws/client/client.go
generated
vendored
@ -88,10 +88,6 @@ func (c *Client) NewRequest(operation *request.Operation, params interface{}, da
|
|||||||
// AddDebugHandlers injects debug logging handlers into the service to log request
|
// AddDebugHandlers injects debug logging handlers into the service to log request
|
||||||
// debug information.
|
// debug information.
|
||||||
func (c *Client) AddDebugHandlers() {
|
func (c *Client) AddDebugHandlers() {
|
||||||
if !c.Config.LogLevel.AtLeast(aws.LogDebug) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
c.Handlers.Send.PushFrontNamed(LogHTTPRequestHandler)
|
c.Handlers.Send.PushFrontNamed(LogHTTPRequestHandler)
|
||||||
c.Handlers.Send.PushBackNamed(LogHTTPResponseHandler)
|
c.Handlers.Send.PushBackNamed(LogHTTPResponseHandler)
|
||||||
}
|
}
|
||||||
|
8
vendor/github.com/aws/aws-sdk-go/aws/client/logger.go
generated
vendored
8
vendor/github.com/aws/aws-sdk-go/aws/client/logger.go
generated
vendored
@ -53,6 +53,10 @@ var LogHTTPRequestHandler = request.NamedHandler{
|
|||||||
}
|
}
|
||||||
|
|
||||||
func logRequest(r *request.Request) {
|
func logRequest(r *request.Request) {
|
||||||
|
if !r.Config.LogLevel.AtLeast(aws.LogDebug) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
logBody := r.Config.LogLevel.Matches(aws.LogDebugWithHTTPBody)
|
logBody := r.Config.LogLevel.Matches(aws.LogDebugWithHTTPBody)
|
||||||
bodySeekable := aws.IsReaderSeekable(r.Body)
|
bodySeekable := aws.IsReaderSeekable(r.Body)
|
||||||
|
|
||||||
@ -120,6 +124,10 @@ var LogHTTPResponseHandler = request.NamedHandler{
|
|||||||
}
|
}
|
||||||
|
|
||||||
func logResponse(r *request.Request) {
|
func logResponse(r *request.Request) {
|
||||||
|
if !r.Config.LogLevel.AtLeast(aws.LogDebug) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
lw := &logWriter{r.Config.Logger, bytes.NewBuffer(nil)}
|
lw := &logWriter{r.Config.Logger, bytes.NewBuffer(nil)}
|
||||||
|
|
||||||
if r.HTTPResponse == nil {
|
if r.HTTPResponse == nil {
|
||||||
|
32
vendor/github.com/aws/aws-sdk-go/aws/config.go
generated
vendored
32
vendor/github.com/aws/aws-sdk-go/aws/config.go
generated
vendored
@ -438,13 +438,6 @@ func (c *Config) WithDisableEndpointHostPrefix(t bool) *Config {
|
|||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
// MergeIn merges the passed in configs into the existing config object.
|
|
||||||
func (c *Config) MergeIn(cfgs ...*Config) {
|
|
||||||
for _, other := range cfgs {
|
|
||||||
mergeInConfig(c, other)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithSTSRegionalEndpoint will set whether or not to use regional endpoint flag
|
// WithSTSRegionalEndpoint will set whether or not to use regional endpoint flag
|
||||||
// when resolving the endpoint for a service
|
// when resolving the endpoint for a service
|
||||||
func (c *Config) WithSTSRegionalEndpoint(sre endpoints.STSRegionalEndpoint) *Config {
|
func (c *Config) WithSTSRegionalEndpoint(sre endpoints.STSRegionalEndpoint) *Config {
|
||||||
@ -459,6 +452,27 @@ func (c *Config) WithS3UsEast1RegionalEndpoint(sre endpoints.S3UsEast1RegionalEn
|
|||||||
return c
|
return c
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WithLowerCaseHeaderMaps sets a config LowerCaseHeaderMaps value
|
||||||
|
// returning a Config pointer for chaining.
|
||||||
|
func (c *Config) WithLowerCaseHeaderMaps(t bool) *Config {
|
||||||
|
c.LowerCaseHeaderMaps = &t
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithDisableRestProtocolURICleaning sets a config DisableRestProtocolURICleaning value
|
||||||
|
// returning a Config pointer for chaining.
|
||||||
|
func (c *Config) WithDisableRestProtocolURICleaning(t bool) *Config {
|
||||||
|
c.DisableRestProtocolURICleaning = &t
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
// MergeIn merges the passed in configs into the existing config object.
|
||||||
|
func (c *Config) MergeIn(cfgs ...*Config) {
|
||||||
|
for _, other := range cfgs {
|
||||||
|
mergeInConfig(c, other)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func mergeInConfig(dst *Config, other *Config) {
|
func mergeInConfig(dst *Config, other *Config) {
|
||||||
if other == nil {
|
if other == nil {
|
||||||
return
|
return
|
||||||
@ -571,6 +585,10 @@ func mergeInConfig(dst *Config, other *Config) {
|
|||||||
if other.S3UsEast1RegionalEndpoint != endpoints.UnsetS3UsEast1Endpoint {
|
if other.S3UsEast1RegionalEndpoint != endpoints.UnsetS3UsEast1Endpoint {
|
||||||
dst.S3UsEast1RegionalEndpoint = other.S3UsEast1RegionalEndpoint
|
dst.S3UsEast1RegionalEndpoint = other.S3UsEast1RegionalEndpoint
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if other.LowerCaseHeaderMaps != nil {
|
||||||
|
dst.LowerCaseHeaderMaps = other.LowerCaseHeaderMaps
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy will return a shallow copy of the Config object. If any additional
|
// Copy will return a shallow copy of the Config object. If any additional
|
||||||
|
232
vendor/github.com/aws/aws-sdk-go/aws/corehandlers/handlers.go
generated
vendored
Normal file
232
vendor/github.com/aws/aws-sdk-go/aws/corehandlers/handlers.go
generated
vendored
Normal file
@ -0,0 +1,232 @@
|
|||||||
|
package corehandlers
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"regexp"
|
||||||
|
"strconv"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/credentials"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/request"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Interface for matching types which also have a Len method.
|
||||||
|
type lener interface {
|
||||||
|
Len() int
|
||||||
|
}
|
||||||
|
|
||||||
|
// BuildContentLengthHandler builds the content length of a request based on the body,
|
||||||
|
// or will use the HTTPRequest.Header's "Content-Length" if defined. If unable
|
||||||
|
// to determine request body length and no "Content-Length" was specified it will panic.
|
||||||
|
//
|
||||||
|
// The Content-Length will only be added to the request if the length of the body
|
||||||
|
// is greater than 0. If the body is empty or the current `Content-Length`
|
||||||
|
// header is <= 0, the header will also be stripped.
|
||||||
|
var BuildContentLengthHandler = request.NamedHandler{Name: "core.BuildContentLengthHandler", Fn: func(r *request.Request) {
|
||||||
|
var length int64
|
||||||
|
|
||||||
|
if slength := r.HTTPRequest.Header.Get("Content-Length"); slength != "" {
|
||||||
|
length, _ = strconv.ParseInt(slength, 10, 64)
|
||||||
|
} else {
|
||||||
|
if r.Body != nil {
|
||||||
|
var err error
|
||||||
|
length, err = aws.SeekerLen(r.Body)
|
||||||
|
if err != nil {
|
||||||
|
r.Error = awserr.New(request.ErrCodeSerialization, "failed to get request body's length", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if length > 0 {
|
||||||
|
r.HTTPRequest.ContentLength = length
|
||||||
|
r.HTTPRequest.Header.Set("Content-Length", fmt.Sprintf("%d", length))
|
||||||
|
} else {
|
||||||
|
r.HTTPRequest.ContentLength = 0
|
||||||
|
r.HTTPRequest.Header.Del("Content-Length")
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
|
||||||
|
var reStatusCode = regexp.MustCompile(`^(\d{3})`)
|
||||||
|
|
||||||
|
// ValidateReqSigHandler is a request handler to ensure that the request's
|
||||||
|
// signature doesn't expire before it is sent. This can happen when a request
|
||||||
|
// is built and signed significantly before it is sent. Or significant delays
|
||||||
|
// occur when retrying requests that would cause the signature to expire.
|
||||||
|
var ValidateReqSigHandler = request.NamedHandler{
|
||||||
|
Name: "core.ValidateReqSigHandler",
|
||||||
|
Fn: func(r *request.Request) {
|
||||||
|
// Unsigned requests are not signed
|
||||||
|
if r.Config.Credentials == credentials.AnonymousCredentials {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
signedTime := r.Time
|
||||||
|
if !r.LastSignedAt.IsZero() {
|
||||||
|
signedTime = r.LastSignedAt
|
||||||
|
}
|
||||||
|
|
||||||
|
// 5 minutes to allow for some clock skew/delays in transmission.
|
||||||
|
// Would be improved with aws/aws-sdk-go#423
|
||||||
|
if signedTime.Add(5 * time.Minute).After(time.Now()) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("request expired, resigning")
|
||||||
|
r.Sign()
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
// SendHandler is a request handler to send service request using HTTP client.
|
||||||
|
var SendHandler = request.NamedHandler{
|
||||||
|
Name: "core.SendHandler",
|
||||||
|
Fn: func(r *request.Request) {
|
||||||
|
sender := sendFollowRedirects
|
||||||
|
if r.DisableFollowRedirects {
|
||||||
|
sender = sendWithoutFollowRedirects
|
||||||
|
}
|
||||||
|
|
||||||
|
if request.NoBody == r.HTTPRequest.Body {
|
||||||
|
// Strip off the request body if the NoBody reader was used as a
|
||||||
|
// place holder for a request body. This prevents the SDK from
|
||||||
|
// making requests with a request body when it would be invalid
|
||||||
|
// to do so.
|
||||||
|
//
|
||||||
|
// Use a shallow copy of the http.Request to ensure the race condition
|
||||||
|
// of transport on Body will not trigger
|
||||||
|
reqOrig, reqCopy := r.HTTPRequest, *r.HTTPRequest
|
||||||
|
reqCopy.Body = nil
|
||||||
|
r.HTTPRequest = &reqCopy
|
||||||
|
defer func() {
|
||||||
|
r.HTTPRequest = reqOrig
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
var err error
|
||||||
|
r.HTTPResponse, err = sender(r)
|
||||||
|
if err != nil {
|
||||||
|
handleSendError(r, err)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
func sendFollowRedirects(r *request.Request) (*http.Response, error) {
|
||||||
|
return r.Config.HTTPClient.Do(r.HTTPRequest)
|
||||||
|
}
|
||||||
|
|
||||||
|
func sendWithoutFollowRedirects(r *request.Request) (*http.Response, error) {
|
||||||
|
transport := r.Config.HTTPClient.Transport
|
||||||
|
if transport == nil {
|
||||||
|
transport = http.DefaultTransport
|
||||||
|
}
|
||||||
|
|
||||||
|
return transport.RoundTrip(r.HTTPRequest)
|
||||||
|
}
|
||||||
|
|
||||||
|
func handleSendError(r *request.Request, err error) {
|
||||||
|
// Prevent leaking if an HTTPResponse was returned. Clean up
|
||||||
|
// the body.
|
||||||
|
if r.HTTPResponse != nil {
|
||||||
|
r.HTTPResponse.Body.Close()
|
||||||
|
}
|
||||||
|
// Capture the case where url.Error is returned for error processing
|
||||||
|
// response. e.g. 301 without location header comes back as string
|
||||||
|
// error and r.HTTPResponse is nil. Other URL redirect errors will
|
||||||
|
// comeback in a similar method.
|
||||||
|
if e, ok := err.(*url.Error); ok && e.Err != nil {
|
||||||
|
if s := reStatusCode.FindStringSubmatch(e.Err.Error()); s != nil {
|
||||||
|
code, _ := strconv.ParseInt(s[1], 10, 64)
|
||||||
|
r.HTTPResponse = &http.Response{
|
||||||
|
StatusCode: int(code),
|
||||||
|
Status: http.StatusText(int(code)),
|
||||||
|
Body: ioutil.NopCloser(bytes.NewReader([]byte{})),
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if r.HTTPResponse == nil {
|
||||||
|
// Add a dummy request response object to ensure the HTTPResponse
|
||||||
|
// value is consistent.
|
||||||
|
r.HTTPResponse = &http.Response{
|
||||||
|
StatusCode: int(0),
|
||||||
|
Status: http.StatusText(int(0)),
|
||||||
|
Body: ioutil.NopCloser(bytes.NewReader([]byte{})),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Catch all request errors, and let the default retrier determine
|
||||||
|
// if the error is retryable.
|
||||||
|
r.Error = awserr.New(request.ErrCodeRequestError, "send request failed", err)
|
||||||
|
|
||||||
|
// Override the error with a context canceled error, if that was canceled.
|
||||||
|
ctx := r.Context()
|
||||||
|
select {
|
||||||
|
case <-ctx.Done():
|
||||||
|
r.Error = awserr.New(request.CanceledErrorCode,
|
||||||
|
"request context canceled", ctx.Err())
|
||||||
|
r.Retryable = aws.Bool(false)
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ValidateResponseHandler is a request handler to validate service response.
|
||||||
|
var ValidateResponseHandler = request.NamedHandler{Name: "core.ValidateResponseHandler", Fn: func(r *request.Request) {
|
||||||
|
if r.HTTPResponse.StatusCode == 0 || r.HTTPResponse.StatusCode >= 300 {
|
||||||
|
// this may be replaced by an UnmarshalError handler
|
||||||
|
r.Error = awserr.New("UnknownError", "unknown error", nil)
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
|
||||||
|
// AfterRetryHandler performs final checks to determine if the request should
|
||||||
|
// be retried and how long to delay.
|
||||||
|
var AfterRetryHandler = request.NamedHandler{
|
||||||
|
Name: "core.AfterRetryHandler",
|
||||||
|
Fn: func(r *request.Request) {
|
||||||
|
// If one of the other handlers already set the retry state
|
||||||
|
// we don't want to override it based on the service's state
|
||||||
|
if r.Retryable == nil || aws.BoolValue(r.Config.EnforceShouldRetryCheck) {
|
||||||
|
r.Retryable = aws.Bool(r.ShouldRetry(r))
|
||||||
|
}
|
||||||
|
|
||||||
|
if r.WillRetry() {
|
||||||
|
r.RetryDelay = r.RetryRules(r)
|
||||||
|
|
||||||
|
if sleepFn := r.Config.SleepDelay; sleepFn != nil {
|
||||||
|
// Support SleepDelay for backwards compatibility and testing
|
||||||
|
sleepFn(r.RetryDelay)
|
||||||
|
} else if err := aws.SleepWithContext(r.Context(), r.RetryDelay); err != nil {
|
||||||
|
r.Error = awserr.New(request.CanceledErrorCode,
|
||||||
|
"request context canceled", err)
|
||||||
|
r.Retryable = aws.Bool(false)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// when the expired token exception occurs the credentials
|
||||||
|
// need to be expired locally so that the next request to
|
||||||
|
// get credentials will trigger a credentials refresh.
|
||||||
|
if r.IsErrorExpired() {
|
||||||
|
r.Config.Credentials.Expire()
|
||||||
|
}
|
||||||
|
|
||||||
|
r.RetryCount++
|
||||||
|
r.Error = nil
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
|
||||||
|
// ValidateEndpointHandler is a request handler to validate a request had the
|
||||||
|
// appropriate Region and Endpoint set. Will set r.Error if the endpoint or
|
||||||
|
// region is not valid.
|
||||||
|
var ValidateEndpointHandler = request.NamedHandler{Name: "core.ValidateEndpointHandler", Fn: func(r *request.Request) {
|
||||||
|
if r.ClientInfo.SigningRegion == "" && aws.StringValue(r.Config.Region) == "" {
|
||||||
|
r.Error = aws.ErrMissingRegion
|
||||||
|
} else if r.ClientInfo.Endpoint == "" {
|
||||||
|
// Was any endpoint provided by the user, or one was derived by the
|
||||||
|
// SDK's endpoint resolver?
|
||||||
|
r.Error = aws.ErrMissingEndpoint
|
||||||
|
}
|
||||||
|
}}
|
17
vendor/github.com/aws/aws-sdk-go/aws/corehandlers/param_validator.go
generated
vendored
Normal file
17
vendor/github.com/aws/aws-sdk-go/aws/corehandlers/param_validator.go
generated
vendored
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
package corehandlers
|
||||||
|
|
||||||
|
import "github.com/aws/aws-sdk-go/aws/request"
|
||||||
|
|
||||||
|
// ValidateParametersHandler is a request handler to validate the input parameters.
|
||||||
|
// Validating parameters only has meaning if done prior to the request being sent.
|
||||||
|
var ValidateParametersHandler = request.NamedHandler{Name: "core.ValidateParametersHandler", Fn: func(r *request.Request) {
|
||||||
|
if !r.ParamsFilled() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if v, ok := r.Params.(request.Validator); ok {
|
||||||
|
if err := v.Validate(); err != nil {
|
||||||
|
r.Error = err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}}
|
37
vendor/github.com/aws/aws-sdk-go/aws/corehandlers/user_agent.go
generated
vendored
Normal file
37
vendor/github.com/aws/aws-sdk-go/aws/corehandlers/user_agent.go
generated
vendored
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
package corehandlers
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
"runtime"
|
||||||
|
|
||||||
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/request"
|
||||||
|
)
|
||||||
|
|
||||||
|
// SDKVersionUserAgentHandler is a request handler for adding the SDK Version
|
||||||
|
// to the user agent.
|
||||||
|
var SDKVersionUserAgentHandler = request.NamedHandler{
|
||||||
|
Name: "core.SDKVersionUserAgentHandler",
|
||||||
|
Fn: request.MakeAddToUserAgentHandler(aws.SDKName, aws.SDKVersion,
|
||||||
|
runtime.Version(), runtime.GOOS, runtime.GOARCH),
|
||||||
|
}
|
||||||
|
|
||||||
|
const execEnvVar = `AWS_EXECUTION_ENV`
|
||||||
|
const execEnvUAKey = `exec-env`
|
||||||
|
|
||||||
|
// AddHostExecEnvUserAgentHander is a request handler appending the SDK's
|
||||||
|
// execution environment to the user agent.
|
||||||
|
//
|
||||||
|
// If the environment variable AWS_EXECUTION_ENV is set, its value will be
|
||||||
|
// appended to the user agent string.
|
||||||
|
var AddHostExecEnvUserAgentHander = request.NamedHandler{
|
||||||
|
Name: "core.AddHostExecEnvUserAgentHander",
|
||||||
|
Fn: func(r *request.Request) {
|
||||||
|
v := os.Getenv(execEnvVar)
|
||||||
|
if len(v) == 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
request.AddToUserAgent(r, execEnvUAKey+"/"+v)
|
||||||
|
},
|
||||||
|
}
|
188
vendor/github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds/ec2_role_provider.go
generated
vendored
Normal file
188
vendor/github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds/ec2_role_provider.go
generated
vendored
Normal file
@ -0,0 +1,188 @@
|
|||||||
|
package ec2rolecreds
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/client"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/credentials"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/ec2metadata"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/request"
|
||||||
|
"github.com/aws/aws-sdk-go/internal/sdkuri"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ProviderName provides a name of EC2Role provider
|
||||||
|
const ProviderName = "EC2RoleProvider"
|
||||||
|
|
||||||
|
// A EC2RoleProvider retrieves credentials from the EC2 service, and keeps track if
|
||||||
|
// those credentials are expired.
|
||||||
|
//
|
||||||
|
// Example how to configure the EC2RoleProvider with custom http Client, Endpoint
|
||||||
|
// or ExpiryWindow
|
||||||
|
//
|
||||||
|
// p := &ec2rolecreds.EC2RoleProvider{
|
||||||
|
// // Pass in a custom timeout to be used when requesting
|
||||||
|
// // IAM EC2 Role credentials.
|
||||||
|
// Client: ec2metadata.New(sess, aws.Config{
|
||||||
|
// HTTPClient: &http.Client{Timeout: 10 * time.Second},
|
||||||
|
// }),
|
||||||
|
//
|
||||||
|
// // Do not use early expiry of credentials. If a non zero value is
|
||||||
|
// // specified the credentials will be expired early
|
||||||
|
// ExpiryWindow: 0,
|
||||||
|
// }
|
||||||
|
type EC2RoleProvider struct {
|
||||||
|
credentials.Expiry
|
||||||
|
|
||||||
|
// Required EC2Metadata client to use when connecting to EC2 metadata service.
|
||||||
|
Client *ec2metadata.EC2Metadata
|
||||||
|
|
||||||
|
// ExpiryWindow will allow the credentials to trigger refreshing prior to
|
||||||
|
// the credentials actually expiring. This is beneficial so race conditions
|
||||||
|
// with expiring credentials do not cause request to fail unexpectedly
|
||||||
|
// due to ExpiredTokenException exceptions.
|
||||||
|
//
|
||||||
|
// So a ExpiryWindow of 10s would cause calls to IsExpired() to return true
|
||||||
|
// 10 seconds before the credentials are actually expired.
|
||||||
|
//
|
||||||
|
// If ExpiryWindow is 0 or less it will be ignored.
|
||||||
|
ExpiryWindow time.Duration
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewCredentials returns a pointer to a new Credentials object wrapping
|
||||||
|
// the EC2RoleProvider. Takes a ConfigProvider to create a EC2Metadata client.
|
||||||
|
// The ConfigProvider is satisfied by the session.Session type.
|
||||||
|
func NewCredentials(c client.ConfigProvider, options ...func(*EC2RoleProvider)) *credentials.Credentials {
|
||||||
|
p := &EC2RoleProvider{
|
||||||
|
Client: ec2metadata.New(c),
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, option := range options {
|
||||||
|
option(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
return credentials.NewCredentials(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewCredentialsWithClient returns a pointer to a new Credentials object wrapping
|
||||||
|
// the EC2RoleProvider. Takes a EC2Metadata client to use when connecting to EC2
|
||||||
|
// metadata service.
|
||||||
|
func NewCredentialsWithClient(client *ec2metadata.EC2Metadata, options ...func(*EC2RoleProvider)) *credentials.Credentials {
|
||||||
|
p := &EC2RoleProvider{
|
||||||
|
Client: client,
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, option := range options {
|
||||||
|
option(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
return credentials.NewCredentials(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Retrieve retrieves credentials from the EC2 service.
|
||||||
|
// Error will be returned if the request fails, or unable to extract
|
||||||
|
// the desired credentials.
|
||||||
|
func (m *EC2RoleProvider) Retrieve() (credentials.Value, error) {
|
||||||
|
return m.RetrieveWithContext(aws.BackgroundContext())
|
||||||
|
}
|
||||||
|
|
||||||
|
// RetrieveWithContext retrieves credentials from the EC2 service.
|
||||||
|
// Error will be returned if the request fails, or unable to extract
|
||||||
|
// the desired credentials.
|
||||||
|
func (m *EC2RoleProvider) RetrieveWithContext(ctx credentials.Context) (credentials.Value, error) {
|
||||||
|
credsList, err := requestCredList(ctx, m.Client)
|
||||||
|
if err != nil {
|
||||||
|
return credentials.Value{ProviderName: ProviderName}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(credsList) == 0 {
|
||||||
|
return credentials.Value{ProviderName: ProviderName}, awserr.New("EmptyEC2RoleList", "empty EC2 Role list", nil)
|
||||||
|
}
|
||||||
|
credsName := credsList[0]
|
||||||
|
|
||||||
|
roleCreds, err := requestCred(ctx, m.Client, credsName)
|
||||||
|
if err != nil {
|
||||||
|
return credentials.Value{ProviderName: ProviderName}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
m.SetExpiration(roleCreds.Expiration, m.ExpiryWindow)
|
||||||
|
|
||||||
|
return credentials.Value{
|
||||||
|
AccessKeyID: roleCreds.AccessKeyID,
|
||||||
|
SecretAccessKey: roleCreds.SecretAccessKey,
|
||||||
|
SessionToken: roleCreds.Token,
|
||||||
|
ProviderName: ProviderName,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// A ec2RoleCredRespBody provides the shape for unmarshaling credential
|
||||||
|
// request responses.
|
||||||
|
type ec2RoleCredRespBody struct {
|
||||||
|
// Success State
|
||||||
|
Expiration time.Time
|
||||||
|
AccessKeyID string
|
||||||
|
SecretAccessKey string
|
||||||
|
Token string
|
||||||
|
|
||||||
|
// Error state
|
||||||
|
Code string
|
||||||
|
Message string
|
||||||
|
}
|
||||||
|
|
||||||
|
const iamSecurityCredsPath = "iam/security-credentials/"
|
||||||
|
|
||||||
|
// requestCredList requests a list of credentials from the EC2 service.
|
||||||
|
// If there are no credentials, or there is an error making or receiving the request
|
||||||
|
func requestCredList(ctx aws.Context, client *ec2metadata.EC2Metadata) ([]string, error) {
|
||||||
|
resp, err := client.GetMetadataWithContext(ctx, iamSecurityCredsPath)
|
||||||
|
if err != nil {
|
||||||
|
return nil, awserr.New("EC2RoleRequestError", "no EC2 instance role found", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
credsList := []string{}
|
||||||
|
s := bufio.NewScanner(strings.NewReader(resp))
|
||||||
|
for s.Scan() {
|
||||||
|
credsList = append(credsList, s.Text())
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := s.Err(); err != nil {
|
||||||
|
return nil, awserr.New(request.ErrCodeSerialization,
|
||||||
|
"failed to read EC2 instance role from metadata service", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return credsList, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// requestCred requests the credentials for a specific credentials from the EC2 service.
|
||||||
|
//
|
||||||
|
// If the credentials cannot be found, or there is an error reading the response
|
||||||
|
// and error will be returned.
|
||||||
|
func requestCred(ctx aws.Context, client *ec2metadata.EC2Metadata, credsName string) (ec2RoleCredRespBody, error) {
|
||||||
|
resp, err := client.GetMetadataWithContext(ctx, sdkuri.PathJoin(iamSecurityCredsPath, credsName))
|
||||||
|
if err != nil {
|
||||||
|
return ec2RoleCredRespBody{},
|
||||||
|
awserr.New("EC2RoleRequestError",
|
||||||
|
fmt.Sprintf("failed to get %s EC2 instance role credentials", credsName),
|
||||||
|
err)
|
||||||
|
}
|
||||||
|
|
||||||
|
respCreds := ec2RoleCredRespBody{}
|
||||||
|
if err := json.NewDecoder(strings.NewReader(resp)).Decode(&respCreds); err != nil {
|
||||||
|
return ec2RoleCredRespBody{},
|
||||||
|
awserr.New(request.ErrCodeSerialization,
|
||||||
|
fmt.Sprintf("failed to decode %s EC2 instance role credentials", credsName),
|
||||||
|
err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if respCreds.Code != "Success" {
|
||||||
|
// If an error code was returned something failed requesting the role.
|
||||||
|
return ec2RoleCredRespBody{}, awserr.New(respCreds.Code, respCreds.Message, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
return respCreds, nil
|
||||||
|
}
|
210
vendor/github.com/aws/aws-sdk-go/aws/credentials/endpointcreds/provider.go
generated
vendored
Normal file
210
vendor/github.com/aws/aws-sdk-go/aws/credentials/endpointcreds/provider.go
generated
vendored
Normal file
@ -0,0 +1,210 @@
|
|||||||
|
// Package endpointcreds provides support for retrieving credentials from an
|
||||||
|
// arbitrary HTTP endpoint.
|
||||||
|
//
|
||||||
|
// The credentials endpoint Provider can receive both static and refreshable
|
||||||
|
// credentials that will expire. Credentials are static when an "Expiration"
|
||||||
|
// value is not provided in the endpoint's response.
|
||||||
|
//
|
||||||
|
// Static credentials will never expire once they have been retrieved. The format
|
||||||
|
// of the static credentials response:
|
||||||
|
// {
|
||||||
|
// "AccessKeyId" : "MUA...",
|
||||||
|
// "SecretAccessKey" : "/7PC5om....",
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// Refreshable credentials will expire within the "ExpiryWindow" of the Expiration
|
||||||
|
// value in the response. The format of the refreshable credentials response:
|
||||||
|
// {
|
||||||
|
// "AccessKeyId" : "MUA...",
|
||||||
|
// "SecretAccessKey" : "/7PC5om....",
|
||||||
|
// "Token" : "AQoDY....=",
|
||||||
|
// "Expiration" : "2016-02-25T06:03:31Z"
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// Errors should be returned in the following format and only returned with 400
|
||||||
|
// or 500 HTTP status codes.
|
||||||
|
// {
|
||||||
|
// "code": "ErrorCode",
|
||||||
|
// "message": "Helpful error message."
|
||||||
|
// }
|
||||||
|
package endpointcreds
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/client"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/client/metadata"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/credentials"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/request"
|
||||||
|
"github.com/aws/aws-sdk-go/private/protocol/json/jsonutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ProviderName is the name of the credentials provider.
|
||||||
|
const ProviderName = `CredentialsEndpointProvider`
|
||||||
|
|
||||||
|
// Provider satisfies the credentials.Provider interface, and is a client to
|
||||||
|
// retrieve credentials from an arbitrary endpoint.
|
||||||
|
type Provider struct {
|
||||||
|
staticCreds bool
|
||||||
|
credentials.Expiry
|
||||||
|
|
||||||
|
// Requires a AWS Client to make HTTP requests to the endpoint with.
|
||||||
|
// the Endpoint the request will be made to is provided by the aws.Config's
|
||||||
|
// Endpoint value.
|
||||||
|
Client *client.Client
|
||||||
|
|
||||||
|
// ExpiryWindow will allow the credentials to trigger refreshing prior to
|
||||||
|
// the credentials actually expiring. This is beneficial so race conditions
|
||||||
|
// with expiring credentials do not cause request to fail unexpectedly
|
||||||
|
// due to ExpiredTokenException exceptions.
|
||||||
|
//
|
||||||
|
// So a ExpiryWindow of 10s would cause calls to IsExpired() to return true
|
||||||
|
// 10 seconds before the credentials are actually expired.
|
||||||
|
//
|
||||||
|
// If ExpiryWindow is 0 or less it will be ignored.
|
||||||
|
ExpiryWindow time.Duration
|
||||||
|
|
||||||
|
// Optional authorization token value if set will be used as the value of
|
||||||
|
// the Authorization header of the endpoint credential request.
|
||||||
|
AuthorizationToken string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewProviderClient returns a credentials Provider for retrieving AWS credentials
|
||||||
|
// from arbitrary endpoint.
|
||||||
|
func NewProviderClient(cfg aws.Config, handlers request.Handlers, endpoint string, options ...func(*Provider)) credentials.Provider {
|
||||||
|
p := &Provider{
|
||||||
|
Client: client.New(
|
||||||
|
cfg,
|
||||||
|
metadata.ClientInfo{
|
||||||
|
ServiceName: "CredentialsEndpoint",
|
||||||
|
Endpoint: endpoint,
|
||||||
|
},
|
||||||
|
handlers,
|
||||||
|
),
|
||||||
|
}
|
||||||
|
|
||||||
|
p.Client.Handlers.Unmarshal.PushBack(unmarshalHandler)
|
||||||
|
p.Client.Handlers.UnmarshalError.PushBack(unmarshalError)
|
||||||
|
p.Client.Handlers.Validate.Clear()
|
||||||
|
p.Client.Handlers.Validate.PushBack(validateEndpointHandler)
|
||||||
|
|
||||||
|
for _, option := range options {
|
||||||
|
option(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewCredentialsClient returns a pointer to a new Credentials object
|
||||||
|
// wrapping the endpoint credentials Provider.
|
||||||
|
func NewCredentialsClient(cfg aws.Config, handlers request.Handlers, endpoint string, options ...func(*Provider)) *credentials.Credentials {
|
||||||
|
return credentials.NewCredentials(NewProviderClient(cfg, handlers, endpoint, options...))
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsExpired returns true if the credentials retrieved are expired, or not yet
|
||||||
|
// retrieved.
|
||||||
|
func (p *Provider) IsExpired() bool {
|
||||||
|
if p.staticCreds {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return p.Expiry.IsExpired()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Retrieve will attempt to request the credentials from the endpoint the Provider
|
||||||
|
// was configured for. And error will be returned if the retrieval fails.
|
||||||
|
func (p *Provider) Retrieve() (credentials.Value, error) {
|
||||||
|
return p.RetrieveWithContext(aws.BackgroundContext())
|
||||||
|
}
|
||||||
|
|
||||||
|
// RetrieveWithContext will attempt to request the credentials from the endpoint the Provider
|
||||||
|
// was configured for. And error will be returned if the retrieval fails.
|
||||||
|
func (p *Provider) RetrieveWithContext(ctx credentials.Context) (credentials.Value, error) {
|
||||||
|
resp, err := p.getCredentials(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return credentials.Value{ProviderName: ProviderName},
|
||||||
|
awserr.New("CredentialsEndpointError", "failed to load credentials", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if resp.Expiration != nil {
|
||||||
|
p.SetExpiration(*resp.Expiration, p.ExpiryWindow)
|
||||||
|
} else {
|
||||||
|
p.staticCreds = true
|
||||||
|
}
|
||||||
|
|
||||||
|
return credentials.Value{
|
||||||
|
AccessKeyID: resp.AccessKeyID,
|
||||||
|
SecretAccessKey: resp.SecretAccessKey,
|
||||||
|
SessionToken: resp.Token,
|
||||||
|
ProviderName: ProviderName,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type getCredentialsOutput struct {
|
||||||
|
Expiration *time.Time
|
||||||
|
AccessKeyID string
|
||||||
|
SecretAccessKey string
|
||||||
|
Token string
|
||||||
|
}
|
||||||
|
|
||||||
|
type errorOutput struct {
|
||||||
|
Code string `json:"code"`
|
||||||
|
Message string `json:"message"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Provider) getCredentials(ctx aws.Context) (*getCredentialsOutput, error) {
|
||||||
|
op := &request.Operation{
|
||||||
|
Name: "GetCredentials",
|
||||||
|
HTTPMethod: "GET",
|
||||||
|
}
|
||||||
|
|
||||||
|
out := &getCredentialsOutput{}
|
||||||
|
req := p.Client.NewRequest(op, nil, out)
|
||||||
|
req.SetContext(ctx)
|
||||||
|
req.HTTPRequest.Header.Set("Accept", "application/json")
|
||||||
|
if authToken := p.AuthorizationToken; len(authToken) != 0 {
|
||||||
|
req.HTTPRequest.Header.Set("Authorization", authToken)
|
||||||
|
}
|
||||||
|
|
||||||
|
return out, req.Send()
|
||||||
|
}
|
||||||
|
|
||||||
|
func validateEndpointHandler(r *request.Request) {
|
||||||
|
if len(r.ClientInfo.Endpoint) == 0 {
|
||||||
|
r.Error = aws.ErrMissingEndpoint
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func unmarshalHandler(r *request.Request) {
|
||||||
|
defer r.HTTPResponse.Body.Close()
|
||||||
|
|
||||||
|
out := r.Data.(*getCredentialsOutput)
|
||||||
|
if err := json.NewDecoder(r.HTTPResponse.Body).Decode(&out); err != nil {
|
||||||
|
r.Error = awserr.New(request.ErrCodeSerialization,
|
||||||
|
"failed to decode endpoint credentials",
|
||||||
|
err,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func unmarshalError(r *request.Request) {
|
||||||
|
defer r.HTTPResponse.Body.Close()
|
||||||
|
|
||||||
|
var errOut errorOutput
|
||||||
|
err := jsonutil.UnmarshalJSONError(&errOut, r.HTTPResponse.Body)
|
||||||
|
if err != nil {
|
||||||
|
r.Error = awserr.NewRequestFailure(
|
||||||
|
awserr.New(request.ErrCodeSerialization,
|
||||||
|
"failed to decode error message", err),
|
||||||
|
r.HTTPResponse.StatusCode,
|
||||||
|
r.RequestID,
|
||||||
|
)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Response body format is not consistent between metadata endpoints.
|
||||||
|
// Grab the error message as a string and include that as the source error
|
||||||
|
r.Error = awserr.New(errOut.Code, errOut.Message, nil)
|
||||||
|
}
|
426
vendor/github.com/aws/aws-sdk-go/aws/credentials/processcreds/provider.go
generated
vendored
Normal file
426
vendor/github.com/aws/aws-sdk-go/aws/credentials/processcreds/provider.go
generated
vendored
Normal file
@ -0,0 +1,426 @@
|
|||||||
|
/*
|
||||||
|
Package processcreds is a credential Provider to retrieve `credential_process`
|
||||||
|
credentials.
|
||||||
|
|
||||||
|
WARNING: The following describes a method of sourcing credentials from an external
|
||||||
|
process. This can potentially be dangerous, so proceed with caution. Other
|
||||||
|
credential providers should be preferred if at all possible. If using this
|
||||||
|
option, you should make sure that the config file is as locked down as possible
|
||||||
|
using security best practices for your operating system.
|
||||||
|
|
||||||
|
You can use credentials from a `credential_process` in a variety of ways.
|
||||||
|
|
||||||
|
One way is to setup your shared config file, located in the default
|
||||||
|
location, with the `credential_process` key and the command you want to be
|
||||||
|
called. You also need to set the AWS_SDK_LOAD_CONFIG environment variable
|
||||||
|
(e.g., `export AWS_SDK_LOAD_CONFIG=1`) to use the shared config file.
|
||||||
|
|
||||||
|
[default]
|
||||||
|
credential_process = /command/to/call
|
||||||
|
|
||||||
|
Creating a new session will use the credential process to retrieve credentials.
|
||||||
|
NOTE: If there are credentials in the profile you are using, the credential
|
||||||
|
process will not be used.
|
||||||
|
|
||||||
|
// Initialize a session to load credentials.
|
||||||
|
sess, _ := session.NewSession(&aws.Config{
|
||||||
|
Region: aws.String("us-east-1")},
|
||||||
|
)
|
||||||
|
|
||||||
|
// Create S3 service client to use the credentials.
|
||||||
|
svc := s3.New(sess)
|
||||||
|
|
||||||
|
Another way to use the `credential_process` method is by using
|
||||||
|
`credentials.NewCredentials()` and providing a command to be executed to
|
||||||
|
retrieve credentials:
|
||||||
|
|
||||||
|
// Create credentials using the ProcessProvider.
|
||||||
|
creds := processcreds.NewCredentials("/path/to/command")
|
||||||
|
|
||||||
|
// Create service client value configured for credentials.
|
||||||
|
svc := s3.New(sess, &aws.Config{Credentials: creds})
|
||||||
|
|
||||||
|
You can set a non-default timeout for the `credential_process` with another
|
||||||
|
constructor, `credentials.NewCredentialsTimeout()`, providing the timeout. To
|
||||||
|
set a one minute timeout:
|
||||||
|
|
||||||
|
// Create credentials using the ProcessProvider.
|
||||||
|
creds := processcreds.NewCredentialsTimeout(
|
||||||
|
"/path/to/command",
|
||||||
|
time.Duration(500) * time.Millisecond)
|
||||||
|
|
||||||
|
If you need more control, you can set any configurable options in the
|
||||||
|
credentials using one or more option functions. For example, you can set a two
|
||||||
|
minute timeout, a credential duration of 60 minutes, and a maximum stdout
|
||||||
|
buffer size of 2k.
|
||||||
|
|
||||||
|
creds := processcreds.NewCredentials(
|
||||||
|
"/path/to/command",
|
||||||
|
func(opt *ProcessProvider) {
|
||||||
|
opt.Timeout = time.Duration(2) * time.Minute
|
||||||
|
opt.Duration = time.Duration(60) * time.Minute
|
||||||
|
opt.MaxBufSize = 2048
|
||||||
|
})
|
||||||
|
|
||||||
|
You can also use your own `exec.Cmd`:
|
||||||
|
|
||||||
|
// Create an exec.Cmd
|
||||||
|
myCommand := exec.Command("/path/to/command")
|
||||||
|
|
||||||
|
// Create credentials using your exec.Cmd and custom timeout
|
||||||
|
creds := processcreds.NewCredentialsCommand(
|
||||||
|
myCommand,
|
||||||
|
func(opt *processcreds.ProcessProvider) {
|
||||||
|
opt.Timeout = time.Duration(1) * time.Second
|
||||||
|
})
|
||||||
|
*/
|
||||||
|
package processcreds
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"runtime"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/credentials"
|
||||||
|
"github.com/aws/aws-sdk-go/internal/sdkio"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// ProviderName is the name this credentials provider will label any
|
||||||
|
// returned credentials Value with.
|
||||||
|
ProviderName = `ProcessProvider`
|
||||||
|
|
||||||
|
// ErrCodeProcessProviderParse error parsing process output
|
||||||
|
ErrCodeProcessProviderParse = "ProcessProviderParseError"
|
||||||
|
|
||||||
|
// ErrCodeProcessProviderVersion version error in output
|
||||||
|
ErrCodeProcessProviderVersion = "ProcessProviderVersionError"
|
||||||
|
|
||||||
|
// ErrCodeProcessProviderRequired required attribute missing in output
|
||||||
|
ErrCodeProcessProviderRequired = "ProcessProviderRequiredError"
|
||||||
|
|
||||||
|
// ErrCodeProcessProviderExecution execution of command failed
|
||||||
|
ErrCodeProcessProviderExecution = "ProcessProviderExecutionError"
|
||||||
|
|
||||||
|
// errMsgProcessProviderTimeout process took longer than allowed
|
||||||
|
errMsgProcessProviderTimeout = "credential process timed out"
|
||||||
|
|
||||||
|
// errMsgProcessProviderProcess process error
|
||||||
|
errMsgProcessProviderProcess = "error in credential_process"
|
||||||
|
|
||||||
|
// errMsgProcessProviderParse problem parsing output
|
||||||
|
errMsgProcessProviderParse = "parse failed of credential_process output"
|
||||||
|
|
||||||
|
// errMsgProcessProviderVersion version error in output
|
||||||
|
errMsgProcessProviderVersion = "wrong version in process output (not 1)"
|
||||||
|
|
||||||
|
// errMsgProcessProviderMissKey missing access key id in output
|
||||||
|
errMsgProcessProviderMissKey = "missing AccessKeyId in process output"
|
||||||
|
|
||||||
|
// errMsgProcessProviderMissSecret missing secret acess key in output
|
||||||
|
errMsgProcessProviderMissSecret = "missing SecretAccessKey in process output"
|
||||||
|
|
||||||
|
// errMsgProcessProviderPrepareCmd prepare of command failed
|
||||||
|
errMsgProcessProviderPrepareCmd = "failed to prepare command"
|
||||||
|
|
||||||
|
// errMsgProcessProviderEmptyCmd command must not be empty
|
||||||
|
errMsgProcessProviderEmptyCmd = "command must not be empty"
|
||||||
|
|
||||||
|
// errMsgProcessProviderPipe failed to initialize pipe
|
||||||
|
errMsgProcessProviderPipe = "failed to initialize pipe"
|
||||||
|
|
||||||
|
// DefaultDuration is the default amount of time in minutes that the
|
||||||
|
// credentials will be valid for.
|
||||||
|
DefaultDuration = time.Duration(15) * time.Minute
|
||||||
|
|
||||||
|
// DefaultBufSize limits buffer size from growing to an enormous
|
||||||
|
// amount due to a faulty process.
|
||||||
|
DefaultBufSize = int(8 * sdkio.KibiByte)
|
||||||
|
|
||||||
|
// DefaultTimeout default limit on time a process can run.
|
||||||
|
DefaultTimeout = time.Duration(1) * time.Minute
|
||||||
|
)
|
||||||
|
|
||||||
|
// ProcessProvider satisfies the credentials.Provider interface, and is a
|
||||||
|
// client to retrieve credentials from a process.
|
||||||
|
type ProcessProvider struct {
|
||||||
|
staticCreds bool
|
||||||
|
credentials.Expiry
|
||||||
|
originalCommand []string
|
||||||
|
|
||||||
|
// Expiry duration of the credentials. Defaults to 15 minutes if not set.
|
||||||
|
Duration time.Duration
|
||||||
|
|
||||||
|
// ExpiryWindow will allow the credentials to trigger refreshing prior to
|
||||||
|
// the credentials actually expiring. This is beneficial so race conditions
|
||||||
|
// with expiring credentials do not cause request to fail unexpectedly
|
||||||
|
// due to ExpiredTokenException exceptions.
|
||||||
|
//
|
||||||
|
// So a ExpiryWindow of 10s would cause calls to IsExpired() to return true
|
||||||
|
// 10 seconds before the credentials are actually expired.
|
||||||
|
//
|
||||||
|
// If ExpiryWindow is 0 or less it will be ignored.
|
||||||
|
ExpiryWindow time.Duration
|
||||||
|
|
||||||
|
// A string representing an os command that should return a JSON with
|
||||||
|
// credential information.
|
||||||
|
command *exec.Cmd
|
||||||
|
|
||||||
|
// MaxBufSize limits memory usage from growing to an enormous
|
||||||
|
// amount due to a faulty process.
|
||||||
|
MaxBufSize int
|
||||||
|
|
||||||
|
// Timeout limits the time a process can run.
|
||||||
|
Timeout time.Duration
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewCredentials returns a pointer to a new Credentials object wrapping the
|
||||||
|
// ProcessProvider. The credentials will expire every 15 minutes by default.
|
||||||
|
func NewCredentials(command string, options ...func(*ProcessProvider)) *credentials.Credentials {
|
||||||
|
p := &ProcessProvider{
|
||||||
|
command: exec.Command(command),
|
||||||
|
Duration: DefaultDuration,
|
||||||
|
Timeout: DefaultTimeout,
|
||||||
|
MaxBufSize: DefaultBufSize,
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, option := range options {
|
||||||
|
option(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
return credentials.NewCredentials(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewCredentialsTimeout returns a pointer to a new Credentials object with
|
||||||
|
// the specified command and timeout, and default duration and max buffer size.
|
||||||
|
func NewCredentialsTimeout(command string, timeout time.Duration) *credentials.Credentials {
|
||||||
|
p := NewCredentials(command, func(opt *ProcessProvider) {
|
||||||
|
opt.Timeout = timeout
|
||||||
|
})
|
||||||
|
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewCredentialsCommand returns a pointer to a new Credentials object with
|
||||||
|
// the specified command, and default timeout, duration and max buffer size.
|
||||||
|
func NewCredentialsCommand(command *exec.Cmd, options ...func(*ProcessProvider)) *credentials.Credentials {
|
||||||
|
p := &ProcessProvider{
|
||||||
|
command: command,
|
||||||
|
Duration: DefaultDuration,
|
||||||
|
Timeout: DefaultTimeout,
|
||||||
|
MaxBufSize: DefaultBufSize,
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, option := range options {
|
||||||
|
option(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
return credentials.NewCredentials(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
type credentialProcessResponse struct {
|
||||||
|
Version int
|
||||||
|
AccessKeyID string `json:"AccessKeyId"`
|
||||||
|
SecretAccessKey string
|
||||||
|
SessionToken string
|
||||||
|
Expiration *time.Time
|
||||||
|
}
|
||||||
|
|
||||||
|
// Retrieve executes the 'credential_process' and returns the credentials.
|
||||||
|
func (p *ProcessProvider) Retrieve() (credentials.Value, error) {
|
||||||
|
out, err := p.executeCredentialProcess()
|
||||||
|
if err != nil {
|
||||||
|
return credentials.Value{ProviderName: ProviderName}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Serialize and validate response
|
||||||
|
resp := &credentialProcessResponse{}
|
||||||
|
if err = json.Unmarshal(out, resp); err != nil {
|
||||||
|
return credentials.Value{ProviderName: ProviderName}, awserr.New(
|
||||||
|
ErrCodeProcessProviderParse,
|
||||||
|
fmt.Sprintf("%s: %s", errMsgProcessProviderParse, string(out)),
|
||||||
|
err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if resp.Version != 1 {
|
||||||
|
return credentials.Value{ProviderName: ProviderName}, awserr.New(
|
||||||
|
ErrCodeProcessProviderVersion,
|
||||||
|
errMsgProcessProviderVersion,
|
||||||
|
nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(resp.AccessKeyID) == 0 {
|
||||||
|
return credentials.Value{ProviderName: ProviderName}, awserr.New(
|
||||||
|
ErrCodeProcessProviderRequired,
|
||||||
|
errMsgProcessProviderMissKey,
|
||||||
|
nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(resp.SecretAccessKey) == 0 {
|
||||||
|
return credentials.Value{ProviderName: ProviderName}, awserr.New(
|
||||||
|
ErrCodeProcessProviderRequired,
|
||||||
|
errMsgProcessProviderMissSecret,
|
||||||
|
nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle expiration
|
||||||
|
p.staticCreds = resp.Expiration == nil
|
||||||
|
if resp.Expiration != nil {
|
||||||
|
p.SetExpiration(*resp.Expiration, p.ExpiryWindow)
|
||||||
|
}
|
||||||
|
|
||||||
|
return credentials.Value{
|
||||||
|
ProviderName: ProviderName,
|
||||||
|
AccessKeyID: resp.AccessKeyID,
|
||||||
|
SecretAccessKey: resp.SecretAccessKey,
|
||||||
|
SessionToken: resp.SessionToken,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsExpired returns true if the credentials retrieved are expired, or not yet
|
||||||
|
// retrieved.
|
||||||
|
func (p *ProcessProvider) IsExpired() bool {
|
||||||
|
if p.staticCreds {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return p.Expiry.IsExpired()
|
||||||
|
}
|
||||||
|
|
||||||
|
// prepareCommand prepares the command to be executed.
|
||||||
|
func (p *ProcessProvider) prepareCommand() error {
|
||||||
|
|
||||||
|
var cmdArgs []string
|
||||||
|
if runtime.GOOS == "windows" {
|
||||||
|
cmdArgs = []string{"cmd.exe", "/C"}
|
||||||
|
} else {
|
||||||
|
cmdArgs = []string{"sh", "-c"}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(p.originalCommand) == 0 {
|
||||||
|
p.originalCommand = make([]string, len(p.command.Args))
|
||||||
|
copy(p.originalCommand, p.command.Args)
|
||||||
|
|
||||||
|
// check for empty command because it succeeds
|
||||||
|
if len(strings.TrimSpace(p.originalCommand[0])) < 1 {
|
||||||
|
return awserr.New(
|
||||||
|
ErrCodeProcessProviderExecution,
|
||||||
|
fmt.Sprintf(
|
||||||
|
"%s: %s",
|
||||||
|
errMsgProcessProviderPrepareCmd,
|
||||||
|
errMsgProcessProviderEmptyCmd),
|
||||||
|
nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cmdArgs = append(cmdArgs, p.originalCommand...)
|
||||||
|
p.command = exec.Command(cmdArgs[0], cmdArgs[1:]...)
|
||||||
|
p.command.Env = os.Environ()
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// executeCredentialProcess starts the credential process on the OS and
|
||||||
|
// returns the results or an error.
|
||||||
|
func (p *ProcessProvider) executeCredentialProcess() ([]byte, error) {
|
||||||
|
|
||||||
|
if err := p.prepareCommand(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setup the pipes
|
||||||
|
outReadPipe, outWritePipe, err := os.Pipe()
|
||||||
|
if err != nil {
|
||||||
|
return nil, awserr.New(
|
||||||
|
ErrCodeProcessProviderExecution,
|
||||||
|
errMsgProcessProviderPipe,
|
||||||
|
err)
|
||||||
|
}
|
||||||
|
|
||||||
|
p.command.Stderr = os.Stderr // display stderr on console for MFA
|
||||||
|
p.command.Stdout = outWritePipe // get creds json on process's stdout
|
||||||
|
p.command.Stdin = os.Stdin // enable stdin for MFA
|
||||||
|
|
||||||
|
output := bytes.NewBuffer(make([]byte, 0, p.MaxBufSize))
|
||||||
|
|
||||||
|
stdoutCh := make(chan error, 1)
|
||||||
|
go readInput(
|
||||||
|
io.LimitReader(outReadPipe, int64(p.MaxBufSize)),
|
||||||
|
output,
|
||||||
|
stdoutCh)
|
||||||
|
|
||||||
|
execCh := make(chan error, 1)
|
||||||
|
go executeCommand(*p.command, execCh)
|
||||||
|
|
||||||
|
finished := false
|
||||||
|
var errors []error
|
||||||
|
for !finished {
|
||||||
|
select {
|
||||||
|
case readError := <-stdoutCh:
|
||||||
|
errors = appendError(errors, readError)
|
||||||
|
finished = true
|
||||||
|
case execError := <-execCh:
|
||||||
|
err := outWritePipe.Close()
|
||||||
|
errors = appendError(errors, err)
|
||||||
|
errors = appendError(errors, execError)
|
||||||
|
if errors != nil {
|
||||||
|
return output.Bytes(), awserr.NewBatchError(
|
||||||
|
ErrCodeProcessProviderExecution,
|
||||||
|
errMsgProcessProviderProcess,
|
||||||
|
errors)
|
||||||
|
}
|
||||||
|
case <-time.After(p.Timeout):
|
||||||
|
finished = true
|
||||||
|
return output.Bytes(), awserr.NewBatchError(
|
||||||
|
ErrCodeProcessProviderExecution,
|
||||||
|
errMsgProcessProviderTimeout,
|
||||||
|
errors) // errors can be nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
out := output.Bytes()
|
||||||
|
|
||||||
|
if runtime.GOOS == "windows" {
|
||||||
|
// windows adds slashes to quotes
|
||||||
|
out = []byte(strings.Replace(string(out), `\"`, `"`, -1))
|
||||||
|
}
|
||||||
|
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// appendError conveniently checks for nil before appending slice
|
||||||
|
func appendError(errors []error, err error) []error {
|
||||||
|
if err != nil {
|
||||||
|
return append(errors, err)
|
||||||
|
}
|
||||||
|
return errors
|
||||||
|
}
|
||||||
|
|
||||||
|
func executeCommand(cmd exec.Cmd, exec chan error) {
|
||||||
|
// Start the command
|
||||||
|
err := cmd.Start()
|
||||||
|
if err == nil {
|
||||||
|
err = cmd.Wait()
|
||||||
|
}
|
||||||
|
|
||||||
|
exec <- err
|
||||||
|
}
|
||||||
|
|
||||||
|
func readInput(r io.Reader, w io.Writer, read chan error) {
|
||||||
|
tee := io.TeeReader(r, w)
|
||||||
|
|
||||||
|
_, err := ioutil.ReadAll(tee)
|
||||||
|
|
||||||
|
if err == io.EOF {
|
||||||
|
err = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
read <- err // will only arrive here when write end of pipe is closed
|
||||||
|
}
|
60
vendor/github.com/aws/aws-sdk-go/aws/credentials/ssocreds/doc.go
generated
vendored
Normal file
60
vendor/github.com/aws/aws-sdk-go/aws/credentials/ssocreds/doc.go
generated
vendored
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
// Package ssocreds provides a credential provider for retrieving temporary AWS credentials using an SSO access token.
|
||||||
|
//
|
||||||
|
// IMPORTANT: The provider in this package does not initiate or perform the AWS SSO login flow. The SDK provider
|
||||||
|
// expects that you have already performed the SSO login flow using AWS CLI using the "aws sso login" command, or by
|
||||||
|
// some other mechanism. The provider must find a valid non-expired access token for the AWS SSO user portal URL in
|
||||||
|
// ~/.aws/sso/cache. If a cached token is not found, it is expired, or the file is malformed an error will be returned.
|
||||||
|
//
|
||||||
|
// Loading AWS SSO credentials with the AWS shared configuration file
|
||||||
|
//
|
||||||
|
// You can use configure AWS SSO credentials from the AWS shared configuration file by
|
||||||
|
// providing the specifying the required keys in the profile:
|
||||||
|
//
|
||||||
|
// sso_account_id
|
||||||
|
// sso_region
|
||||||
|
// sso_role_name
|
||||||
|
// sso_start_url
|
||||||
|
//
|
||||||
|
// For example, the following defines a profile "devsso" and specifies the AWS SSO parameters that defines the target
|
||||||
|
// account, role, sign-on portal, and the region where the user portal is located. Note: all SSO arguments must be
|
||||||
|
// provided, or an error will be returned.
|
||||||
|
//
|
||||||
|
// [profile devsso]
|
||||||
|
// sso_start_url = https://my-sso-portal.awsapps.com/start
|
||||||
|
// sso_role_name = SSOReadOnlyRole
|
||||||
|
// sso_region = us-east-1
|
||||||
|
// sso_account_id = 123456789012
|
||||||
|
//
|
||||||
|
// Using the config module, you can load the AWS SDK shared configuration, and specify that this profile be used to
|
||||||
|
// retrieve credentials. For example:
|
||||||
|
//
|
||||||
|
// sess, err := session.NewSessionWithOptions(session.Options{
|
||||||
|
// SharedConfigState: session.SharedConfigEnable,
|
||||||
|
// Profile: "devsso",
|
||||||
|
// })
|
||||||
|
// if err != nil {
|
||||||
|
// return err
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// Programmatically loading AWS SSO credentials directly
|
||||||
|
//
|
||||||
|
// You can programmatically construct the AWS SSO Provider in your application, and provide the necessary information
|
||||||
|
// to load and retrieve temporary credentials using an access token from ~/.aws/sso/cache.
|
||||||
|
//
|
||||||
|
// svc := sso.New(sess, &aws.Config{
|
||||||
|
// Region: aws.String("us-west-2"), // Client Region must correspond to the AWS SSO user portal region
|
||||||
|
// })
|
||||||
|
//
|
||||||
|
// provider := ssocreds.NewCredentialsWithClient(svc, "123456789012", "SSOReadOnlyRole", "https://my-sso-portal.awsapps.com/start")
|
||||||
|
//
|
||||||
|
// credentials, err := provider.Get()
|
||||||
|
// if err != nil {
|
||||||
|
// return err
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// Additional Resources
|
||||||
|
//
|
||||||
|
// Configuring the AWS CLI to use AWS Single Sign-On: https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sso.html
|
||||||
|
//
|
||||||
|
// AWS Single Sign-On User Guide: https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html
|
||||||
|
package ssocreds
|
9
vendor/github.com/aws/aws-sdk-go/aws/credentials/ssocreds/os.go
generated
vendored
Normal file
9
vendor/github.com/aws/aws-sdk-go/aws/credentials/ssocreds/os.go
generated
vendored
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
// +build !windows
|
||||||
|
|
||||||
|
package ssocreds
|
||||||
|
|
||||||
|
import "os"
|
||||||
|
|
||||||
|
func getHomeDirectory() string {
|
||||||
|
return os.Getenv("HOME")
|
||||||
|
}
|
7
vendor/github.com/aws/aws-sdk-go/aws/credentials/ssocreds/os_windows.go
generated
vendored
Normal file
7
vendor/github.com/aws/aws-sdk-go/aws/credentials/ssocreds/os_windows.go
generated
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
package ssocreds
|
||||||
|
|
||||||
|
import "os"
|
||||||
|
|
||||||
|
func getHomeDirectory() string {
|
||||||
|
return os.Getenv("USERPROFILE")
|
||||||
|
}
|
180
vendor/github.com/aws/aws-sdk-go/aws/credentials/ssocreds/provider.go
generated
vendored
Normal file
180
vendor/github.com/aws/aws-sdk-go/aws/credentials/ssocreds/provider.go
generated
vendored
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
package ssocreds
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/sha1"
|
||||||
|
"encoding/hex"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/client"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/credentials"
|
||||||
|
"github.com/aws/aws-sdk-go/service/sso"
|
||||||
|
"github.com/aws/aws-sdk-go/service/sso/ssoiface"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ErrCodeSSOProviderInvalidToken is the code type that is returned if loaded token has expired or is otherwise invalid.
|
||||||
|
// To refresh the SSO session run aws sso login with the corresponding profile.
|
||||||
|
const ErrCodeSSOProviderInvalidToken = "SSOProviderInvalidToken"
|
||||||
|
|
||||||
|
const invalidTokenMessage = "the SSO session has expired or is invalid"
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
nowTime = time.Now
|
||||||
|
defaultCacheLocation = defaultCacheLocationImpl
|
||||||
|
}
|
||||||
|
|
||||||
|
var nowTime func() time.Time
|
||||||
|
|
||||||
|
// ProviderName is the name of the provider used to specify the source of credentials.
|
||||||
|
const ProviderName = "SSOProvider"
|
||||||
|
|
||||||
|
var defaultCacheLocation func() string
|
||||||
|
|
||||||
|
func defaultCacheLocationImpl() string {
|
||||||
|
return filepath.Join(getHomeDirectory(), ".aws", "sso", "cache")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Provider is an AWS credential provider that retrieves temporary AWS credentials by exchanging an SSO login token.
|
||||||
|
type Provider struct {
|
||||||
|
credentials.Expiry
|
||||||
|
|
||||||
|
// The Client which is configured for the AWS Region where the AWS SSO user portal is located.
|
||||||
|
Client ssoiface.SSOAPI
|
||||||
|
|
||||||
|
// The AWS account that is assigned to the user.
|
||||||
|
AccountID string
|
||||||
|
|
||||||
|
// The role name that is assigned to the user.
|
||||||
|
RoleName string
|
||||||
|
|
||||||
|
// The URL that points to the organization's AWS Single Sign-On (AWS SSO) user portal.
|
||||||
|
StartURL string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewCredentials returns a new AWS Single Sign-On (AWS SSO) credential provider. The ConfigProvider is expected to be configured
|
||||||
|
// for the AWS Region where the AWS SSO user portal is located.
|
||||||
|
func NewCredentials(configProvider client.ConfigProvider, accountID, roleName, startURL string, optFns ...func(provider *Provider)) *credentials.Credentials {
|
||||||
|
return NewCredentialsWithClient(sso.New(configProvider), accountID, roleName, startURL, optFns...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewCredentialsWithClient returns a new AWS Single Sign-On (AWS SSO) credential provider. The provided client is expected to be configured
|
||||||
|
// for the AWS Region where the AWS SSO user portal is located.
|
||||||
|
func NewCredentialsWithClient(client ssoiface.SSOAPI, accountID, roleName, startURL string, optFns ...func(provider *Provider)) *credentials.Credentials {
|
||||||
|
p := &Provider{
|
||||||
|
Client: client,
|
||||||
|
AccountID: accountID,
|
||||||
|
RoleName: roleName,
|
||||||
|
StartURL: startURL,
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, fn := range optFns {
|
||||||
|
fn(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
return credentials.NewCredentials(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Retrieve retrieves temporary AWS credentials from the configured Amazon Single Sign-On (AWS SSO) user portal
|
||||||
|
// by exchanging the accessToken present in ~/.aws/sso/cache.
|
||||||
|
func (p *Provider) Retrieve() (credentials.Value, error) {
|
||||||
|
return p.RetrieveWithContext(aws.BackgroundContext())
|
||||||
|
}
|
||||||
|
|
||||||
|
// RetrieveWithContext retrieves temporary AWS credentials from the configured Amazon Single Sign-On (AWS SSO) user portal
|
||||||
|
// by exchanging the accessToken present in ~/.aws/sso/cache.
|
||||||
|
func (p *Provider) RetrieveWithContext(ctx credentials.Context) (credentials.Value, error) {
|
||||||
|
tokenFile, err := loadTokenFile(p.StartURL)
|
||||||
|
if err != nil {
|
||||||
|
return credentials.Value{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
output, err := p.Client.GetRoleCredentialsWithContext(ctx, &sso.GetRoleCredentialsInput{
|
||||||
|
AccessToken: &tokenFile.AccessToken,
|
||||||
|
AccountId: &p.AccountID,
|
||||||
|
RoleName: &p.RoleName,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return credentials.Value{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
expireTime := time.Unix(0, aws.Int64Value(output.RoleCredentials.Expiration)*int64(time.Millisecond)).UTC()
|
||||||
|
p.SetExpiration(expireTime, 0)
|
||||||
|
|
||||||
|
return credentials.Value{
|
||||||
|
AccessKeyID: aws.StringValue(output.RoleCredentials.AccessKeyId),
|
||||||
|
SecretAccessKey: aws.StringValue(output.RoleCredentials.SecretAccessKey),
|
||||||
|
SessionToken: aws.StringValue(output.RoleCredentials.SessionToken),
|
||||||
|
ProviderName: ProviderName,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getCacheFileName(url string) (string, error) {
|
||||||
|
hash := sha1.New()
|
||||||
|
_, err := hash.Write([]byte(url))
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return strings.ToLower(hex.EncodeToString(hash.Sum(nil))) + ".json", nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type rfc3339 time.Time
|
||||||
|
|
||||||
|
func (r *rfc3339) UnmarshalJSON(bytes []byte) error {
|
||||||
|
var value string
|
||||||
|
|
||||||
|
if err := json.Unmarshal(bytes, &value); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
parse, err := time.Parse(time.RFC3339, value)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("expected RFC3339 timestamp: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
*r = rfc3339(parse)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type token struct {
|
||||||
|
AccessToken string `json:"accessToken"`
|
||||||
|
ExpiresAt rfc3339 `json:"expiresAt"`
|
||||||
|
Region string `json:"region,omitempty"`
|
||||||
|
StartURL string `json:"startUrl,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t token) Expired() bool {
|
||||||
|
return nowTime().Round(0).After(time.Time(t.ExpiresAt))
|
||||||
|
}
|
||||||
|
|
||||||
|
func loadTokenFile(startURL string) (t token, err error) {
|
||||||
|
key, err := getCacheFileName(startURL)
|
||||||
|
if err != nil {
|
||||||
|
return token{}, awserr.New(ErrCodeSSOProviderInvalidToken, invalidTokenMessage, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fileBytes, err := ioutil.ReadFile(filepath.Join(defaultCacheLocation(), key))
|
||||||
|
if err != nil {
|
||||||
|
return token{}, awserr.New(ErrCodeSSOProviderInvalidToken, invalidTokenMessage, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := json.Unmarshal(fileBytes, &t); err != nil {
|
||||||
|
return token{}, awserr.New(ErrCodeSSOProviderInvalidToken, invalidTokenMessage, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(t.AccessToken) == 0 {
|
||||||
|
return token{}, awserr.New(ErrCodeSSOProviderInvalidToken, invalidTokenMessage, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
if t.Expired() {
|
||||||
|
return token{}, awserr.New(ErrCodeSSOProviderInvalidToken, invalidTokenMessage, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
return t, nil
|
||||||
|
}
|
367
vendor/github.com/aws/aws-sdk-go/aws/credentials/stscreds/assume_role_provider.go
generated
vendored
Normal file
367
vendor/github.com/aws/aws-sdk-go/aws/credentials/stscreds/assume_role_provider.go
generated
vendored
Normal file
@ -0,0 +1,367 @@
|
|||||||
|
/*
|
||||||
|
Package stscreds are credential Providers to retrieve STS AWS credentials.
|
||||||
|
|
||||||
|
STS provides multiple ways to retrieve credentials which can be used when making
|
||||||
|
future AWS service API operation calls.
|
||||||
|
|
||||||
|
The SDK will ensure that per instance of credentials.Credentials all requests
|
||||||
|
to refresh the credentials will be synchronized. But, the SDK is unable to
|
||||||
|
ensure synchronous usage of the AssumeRoleProvider if the value is shared
|
||||||
|
between multiple Credentials, Sessions or service clients.
|
||||||
|
|
||||||
|
Assume Role
|
||||||
|
|
||||||
|
To assume an IAM role using STS with the SDK you can create a new Credentials
|
||||||
|
with the SDKs's stscreds package.
|
||||||
|
|
||||||
|
// 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})
|
||||||
|
|
||||||
|
Assume Role with static MFA Token
|
||||||
|
|
||||||
|
To assume an IAM role with a MFA token you can either specify a MFA token code
|
||||||
|
directly or provide a function to prompt the user each time the credentials
|
||||||
|
need to refresh the role's credentials. Specifying the TokenCode should be used
|
||||||
|
for short lived operations that will not need to be refreshed, and when you do
|
||||||
|
not want to have direct control over the user provides their MFA token.
|
||||||
|
|
||||||
|
With TokenCode the AssumeRoleProvider will be not be able to refresh the role's
|
||||||
|
credentials.
|
||||||
|
|
||||||
|
// Create the credentials from AssumeRoleProvider to assume the role
|
||||||
|
// referenced by the "myRoleARN" ARN using the MFA token code provided.
|
||||||
|
creds := stscreds.NewCredentials(sess, "myRoleArn", func(p *stscreds.AssumeRoleProvider) {
|
||||||
|
p.SerialNumber = aws.String("myTokenSerialNumber")
|
||||||
|
p.TokenCode = aws.String("00000000")
|
||||||
|
})
|
||||||
|
|
||||||
|
// Create service client value configured for credentials
|
||||||
|
// from assumed role.
|
||||||
|
svc := s3.New(sess, &aws.Config{Credentials: creds})
|
||||||
|
|
||||||
|
Assume Role with MFA Token Provider
|
||||||
|
|
||||||
|
To assume an IAM role with MFA for longer running tasks where the credentials
|
||||||
|
may need to be refreshed setting the TokenProvider field of AssumeRoleProvider
|
||||||
|
will allow the credential provider to prompt for new MFA token code when the
|
||||||
|
role's credentials need to be refreshed.
|
||||||
|
|
||||||
|
The StdinTokenProvider function is available to prompt on stdin to retrieve
|
||||||
|
the MFA token code from the user. You can also implement custom prompts by
|
||||||
|
satisfing the TokenProvider function signature.
|
||||||
|
|
||||||
|
Using StdinTokenProvider with multiple AssumeRoleProviders, or Credentials will
|
||||||
|
have undesirable results as the StdinTokenProvider will not be synchronized. A
|
||||||
|
single Credentials with an AssumeRoleProvider can be shared safely.
|
||||||
|
|
||||||
|
// Create the credentials from AssumeRoleProvider to assume the role
|
||||||
|
// referenced by the "myRoleARN" ARN. Prompting for MFA token from stdin.
|
||||||
|
creds := stscreds.NewCredentials(sess, "myRoleArn", func(p *stscreds.AssumeRoleProvider) {
|
||||||
|
p.SerialNumber = aws.String("myTokenSerialNumber")
|
||||||
|
p.TokenProvider = stscreds.StdinTokenProvider
|
||||||
|
})
|
||||||
|
|
||||||
|
// Create service client value configured for credentials
|
||||||
|
// from assumed role.
|
||||||
|
svc := s3.New(sess, &aws.Config{Credentials: creds})
|
||||||
|
|
||||||
|
*/
|
||||||
|
package stscreds
|
||||||
|
|
||||||
|
import (
|
||||||
|
"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/client"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/credentials"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/request"
|
||||||
|
"github.com/aws/aws-sdk-go/internal/sdkrand"
|
||||||
|
"github.com/aws/aws-sdk-go/service/sts"
|
||||||
|
)
|
||||||
|
|
||||||
|
// StdinTokenProvider will prompt on stderr and read from stdin for a string value.
|
||||||
|
// An error is returned if reading from stdin fails.
|
||||||
|
//
|
||||||
|
// Use this function to read MFA tokens from stdin. The function makes no attempt
|
||||||
|
// to make atomic prompts from stdin across multiple gorouties.
|
||||||
|
//
|
||||||
|
// Using StdinTokenProvider with multiple AssumeRoleProviders, or Credentials will
|
||||||
|
// have undesirable results as the StdinTokenProvider will not be synchronized. A
|
||||||
|
// single Credentials with an AssumeRoleProvider can be shared safely
|
||||||
|
//
|
||||||
|
// Will wait forever until something is provided on the stdin.
|
||||||
|
func StdinTokenProvider() (string, error) {
|
||||||
|
var v string
|
||||||
|
fmt.Fprintf(os.Stderr, "Assume Role MFA token code: ")
|
||||||
|
_, err := fmt.Scanln(&v)
|
||||||
|
|
||||||
|
return v, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ProviderName provides a name of AssumeRole provider
|
||||||
|
const ProviderName = "AssumeRoleProvider"
|
||||||
|
|
||||||
|
// AssumeRoler represents the minimal subset of the STS client API used by this provider.
|
||||||
|
type AssumeRoler interface {
|
||||||
|
AssumeRole(input *sts.AssumeRoleInput) (*sts.AssumeRoleOutput, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type assumeRolerWithContext interface {
|
||||||
|
AssumeRoleWithContext(aws.Context, *sts.AssumeRoleInput, ...request.Option) (*sts.AssumeRoleOutput, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// DefaultDuration is the default amount of time in minutes that the credentials
|
||||||
|
// will be valid for.
|
||||||
|
var DefaultDuration = time.Duration(15) * time.Minute
|
||||||
|
|
||||||
|
// AssumeRoleProvider retrieves temporary credentials from the STS service, and
|
||||||
|
// keeps track of their expiration time.
|
||||||
|
//
|
||||||
|
// This credential provider will be used by the SDKs default credential change
|
||||||
|
// when shared configuration is enabled, and the shared config or shared credentials
|
||||||
|
// file configure assume role. See Session docs for how to do this.
|
||||||
|
//
|
||||||
|
// AssumeRoleProvider does not provide any synchronization and it is not safe
|
||||||
|
// to share this value across multiple Credentials, Sessions, or service clients
|
||||||
|
// without also sharing the same Credentials instance.
|
||||||
|
type AssumeRoleProvider struct {
|
||||||
|
credentials.Expiry
|
||||||
|
|
||||||
|
// STS client to make assume role request with.
|
||||||
|
Client AssumeRoler
|
||||||
|
|
||||||
|
// Role to be assumed.
|
||||||
|
RoleARN string
|
||||||
|
|
||||||
|
// Session name, if you wish to reuse the credentials elsewhere.
|
||||||
|
RoleSessionName string
|
||||||
|
|
||||||
|
// Optional, you can pass tag key-value pairs to your session. These tags are called session tags.
|
||||||
|
Tags []*sts.Tag
|
||||||
|
|
||||||
|
// A list of keys for session tags that you want to set as transitive.
|
||||||
|
// If you set a tag key as transitive, the corresponding key and value passes to subsequent sessions in a role chain.
|
||||||
|
TransitiveTagKeys []*string
|
||||||
|
|
||||||
|
// Expiry duration of the STS credentials. Defaults to 15 minutes if not set.
|
||||||
|
Duration time.Duration
|
||||||
|
|
||||||
|
// Optional ExternalID to pass along, defaults to nil if not set.
|
||||||
|
ExternalID *string
|
||||||
|
|
||||||
|
// The policy plain text must be 2048 bytes or shorter. However, an internal
|
||||||
|
// conversion compresses it into a packed binary format with a separate limit.
|
||||||
|
// The PackedPolicySize response element indicates by percentage how close to
|
||||||
|
// the upper size limit the policy is, with 100% equaling the maximum allowed
|
||||||
|
// size.
|
||||||
|
Policy *string
|
||||||
|
|
||||||
|
// The ARNs of IAM managed policies you want to use as managed session policies.
|
||||||
|
// The policies must exist in the same account as the role.
|
||||||
|
//
|
||||||
|
// This parameter is optional. You can provide up to 10 managed policy ARNs.
|
||||||
|
// However, the plain text that you use for both inline and managed session
|
||||||
|
// policies can't exceed 2,048 characters.
|
||||||
|
//
|
||||||
|
// An AWS conversion compresses the passed session policies and session tags
|
||||||
|
// into a packed binary format that has a separate limit. Your request can fail
|
||||||
|
// for this limit even if your plain text meets the other requirements. The
|
||||||
|
// PackedPolicySize response element indicates by percentage how close the policies
|
||||||
|
// and tags for your request are to the upper size limit.
|
||||||
|
//
|
||||||
|
// Passing policies to this operation returns new temporary credentials. The
|
||||||
|
// resulting session's permissions are the intersection of the role's identity-based
|
||||||
|
// policy and the session policies. You can use the role's temporary credentials
|
||||||
|
// in subsequent AWS API calls to access resources in the account that owns
|
||||||
|
// the role. You cannot use session policies to grant more permissions than
|
||||||
|
// those allowed by the identity-based policy of the role that is being assumed.
|
||||||
|
// For more information, see Session Policies (https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session)
|
||||||
|
// in the IAM User Guide.
|
||||||
|
PolicyArns []*sts.PolicyDescriptorType
|
||||||
|
|
||||||
|
// The identification number of the MFA device that is associated with the user
|
||||||
|
// who is making the AssumeRole call. Specify this value if the trust policy
|
||||||
|
// of the role being assumed includes a condition that requires MFA authentication.
|
||||||
|
// The value is either the serial number for a hardware device (such as GAHT12345678)
|
||||||
|
// or an Amazon Resource Name (ARN) for a virtual device (such as arn:aws:iam::123456789012:mfa/user).
|
||||||
|
SerialNumber *string
|
||||||
|
|
||||||
|
// The value provided by the MFA device, if the trust policy of the role being
|
||||||
|
// assumed requires MFA (that is, if the policy includes a condition that tests
|
||||||
|
// for MFA). If the role being assumed requires MFA and if the TokenCode value
|
||||||
|
// is missing or expired, the AssumeRole call returns an "access denied" error.
|
||||||
|
//
|
||||||
|
// If SerialNumber is set and neither TokenCode nor TokenProvider are also
|
||||||
|
// set an error will be returned.
|
||||||
|
TokenCode *string
|
||||||
|
|
||||||
|
// Async method of providing MFA token code for assuming an IAM role with MFA.
|
||||||
|
// The value returned by the function will be used as the TokenCode in the Retrieve
|
||||||
|
// call. See StdinTokenProvider for a provider that prompts and reads from stdin.
|
||||||
|
//
|
||||||
|
// This token provider will be called when ever the assumed role's
|
||||||
|
// credentials need to be refreshed when SerialNumber is also set and
|
||||||
|
// TokenCode is not set.
|
||||||
|
//
|
||||||
|
// If both TokenCode and TokenProvider is set, TokenProvider will be used and
|
||||||
|
// TokenCode is ignored.
|
||||||
|
TokenProvider func() (string, error)
|
||||||
|
|
||||||
|
// ExpiryWindow will allow the credentials to trigger refreshing prior to
|
||||||
|
// the credentials actually expiring. This is beneficial so race conditions
|
||||||
|
// with expiring credentials do not cause request to fail unexpectedly
|
||||||
|
// due to ExpiredTokenException exceptions.
|
||||||
|
//
|
||||||
|
// So a ExpiryWindow of 10s would cause calls to IsExpired() to return true
|
||||||
|
// 10 seconds before the credentials are actually expired.
|
||||||
|
//
|
||||||
|
// If ExpiryWindow is 0 or less it will be ignored.
|
||||||
|
ExpiryWindow time.Duration
|
||||||
|
|
||||||
|
// MaxJitterFrac reduces the effective Duration of each credential requested
|
||||||
|
// by a random percentage between 0 and MaxJitterFraction. MaxJitterFrac must
|
||||||
|
// have a value between 0 and 1. Any other value may lead to expected behavior.
|
||||||
|
// With a MaxJitterFrac value of 0, default) will no jitter will be used.
|
||||||
|
//
|
||||||
|
// For example, with a Duration of 30m and a MaxJitterFrac of 0.1, the
|
||||||
|
// AssumeRole call will be made with an arbitrary Duration between 27m and
|
||||||
|
// 30m.
|
||||||
|
//
|
||||||
|
// MaxJitterFrac should not be negative.
|
||||||
|
MaxJitterFrac float64
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewCredentials returns a pointer to a new Credentials value wrapping the
|
||||||
|
// AssumeRoleProvider. The credentials will expire every 15 minutes and the
|
||||||
|
// role will be named after a nanosecond timestamp of this operation. The
|
||||||
|
// Credentials value will attempt to refresh the credentials using the provider
|
||||||
|
// when Credentials.Get is called, if the cached credentials are expiring.
|
||||||
|
//
|
||||||
|
// Takes a Config provider to create the STS client. The ConfigProvider is
|
||||||
|
// satisfied by the session.Session type.
|
||||||
|
//
|
||||||
|
// It is safe to share the returned Credentials with multiple Sessions and
|
||||||
|
// service clients. All access to the credentials and refreshing them
|
||||||
|
// will be synchronized.
|
||||||
|
func NewCredentials(c client.ConfigProvider, roleARN string, options ...func(*AssumeRoleProvider)) *credentials.Credentials {
|
||||||
|
p := &AssumeRoleProvider{
|
||||||
|
Client: sts.New(c),
|
||||||
|
RoleARN: roleARN,
|
||||||
|
Duration: DefaultDuration,
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, option := range options {
|
||||||
|
option(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
return credentials.NewCredentials(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewCredentialsWithClient returns a pointer to a new Credentials value wrapping the
|
||||||
|
// AssumeRoleProvider. The credentials will expire every 15 minutes and the
|
||||||
|
// role will be named after a nanosecond timestamp of this operation. The
|
||||||
|
// Credentials value will attempt to refresh the credentials using the provider
|
||||||
|
// when Credentials.Get is called, if the cached credentials are expiring.
|
||||||
|
//
|
||||||
|
// Takes an AssumeRoler which can be satisfied by the STS client.
|
||||||
|
//
|
||||||
|
// It is safe to share the returned Credentials with multiple Sessions and
|
||||||
|
// service clients. All access to the credentials and refreshing them
|
||||||
|
// will be synchronized.
|
||||||
|
func NewCredentialsWithClient(svc AssumeRoler, roleARN string, options ...func(*AssumeRoleProvider)) *credentials.Credentials {
|
||||||
|
p := &AssumeRoleProvider{
|
||||||
|
Client: svc,
|
||||||
|
RoleARN: roleARN,
|
||||||
|
Duration: DefaultDuration,
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, option := range options {
|
||||||
|
option(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
return credentials.NewCredentials(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Retrieve generates a new set of temporary credentials using STS.
|
||||||
|
func (p *AssumeRoleProvider) Retrieve() (credentials.Value, error) {
|
||||||
|
return p.RetrieveWithContext(aws.BackgroundContext())
|
||||||
|
}
|
||||||
|
|
||||||
|
// RetrieveWithContext generates a new set of temporary credentials using STS.
|
||||||
|
func (p *AssumeRoleProvider) RetrieveWithContext(ctx credentials.Context) (credentials.Value, error) {
|
||||||
|
// Apply defaults where parameters are not set.
|
||||||
|
if p.RoleSessionName == "" {
|
||||||
|
// Try to work out a role name that will hopefully end up unique.
|
||||||
|
p.RoleSessionName = fmt.Sprintf("%d", time.Now().UTC().UnixNano())
|
||||||
|
}
|
||||||
|
if p.Duration == 0 {
|
||||||
|
// Expire as often as AWS permits.
|
||||||
|
p.Duration = DefaultDuration
|
||||||
|
}
|
||||||
|
jitter := time.Duration(sdkrand.SeededRand.Float64() * p.MaxJitterFrac * float64(p.Duration))
|
||||||
|
input := &sts.AssumeRoleInput{
|
||||||
|
DurationSeconds: aws.Int64(int64((p.Duration - jitter) / time.Second)),
|
||||||
|
RoleArn: aws.String(p.RoleARN),
|
||||||
|
RoleSessionName: aws.String(p.RoleSessionName),
|
||||||
|
ExternalId: p.ExternalID,
|
||||||
|
Tags: p.Tags,
|
||||||
|
PolicyArns: p.PolicyArns,
|
||||||
|
TransitiveTagKeys: p.TransitiveTagKeys,
|
||||||
|
}
|
||||||
|
if p.Policy != nil {
|
||||||
|
input.Policy = p.Policy
|
||||||
|
}
|
||||||
|
if p.SerialNumber != nil {
|
||||||
|
if p.TokenCode != nil {
|
||||||
|
input.SerialNumber = p.SerialNumber
|
||||||
|
input.TokenCode = p.TokenCode
|
||||||
|
} else if p.TokenProvider != nil {
|
||||||
|
input.SerialNumber = p.SerialNumber
|
||||||
|
code, err := p.TokenProvider()
|
||||||
|
if err != nil {
|
||||||
|
return credentials.Value{ProviderName: ProviderName}, err
|
||||||
|
}
|
||||||
|
input.TokenCode = aws.String(code)
|
||||||
|
} else {
|
||||||
|
return credentials.Value{ProviderName: ProviderName},
|
||||||
|
awserr.New("AssumeRoleTokenNotAvailable",
|
||||||
|
"assume role with MFA enabled, but neither TokenCode nor TokenProvider are set", nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var roleOutput *sts.AssumeRoleOutput
|
||||||
|
var err error
|
||||||
|
|
||||||
|
if c, ok := p.Client.(assumeRolerWithContext); ok {
|
||||||
|
roleOutput, err = c.AssumeRoleWithContext(ctx, input)
|
||||||
|
} else {
|
||||||
|
roleOutput, err = p.Client.AssumeRole(input)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return credentials.Value{ProviderName: ProviderName}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// We will proactively generate new credentials before they expire.
|
||||||
|
p.SetExpiration(*roleOutput.Credentials.Expiration, p.ExpiryWindow)
|
||||||
|
|
||||||
|
return credentials.Value{
|
||||||
|
AccessKeyID: *roleOutput.Credentials.AccessKeyId,
|
||||||
|
SecretAccessKey: *roleOutput.Credentials.SecretAccessKey,
|
||||||
|
SessionToken: *roleOutput.Credentials.SessionToken,
|
||||||
|
ProviderName: ProviderName,
|
||||||
|
}, nil
|
||||||
|
}
|
154
vendor/github.com/aws/aws-sdk-go/aws/credentials/stscreds/web_identity_provider.go
generated
vendored
Normal file
154
vendor/github.com/aws/aws-sdk-go/aws/credentials/stscreds/web_identity_provider.go
generated
vendored
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
package stscreds
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"strconv"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/client"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/credentials"
|
||||||
|
"github.com/aws/aws-sdk-go/service/sts"
|
||||||
|
"github.com/aws/aws-sdk-go/service/sts/stsiface"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// ErrCodeWebIdentity will be used as an error code when constructing
|
||||||
|
// a new error to be returned during session creation or retrieval.
|
||||||
|
ErrCodeWebIdentity = "WebIdentityErr"
|
||||||
|
|
||||||
|
// WebIdentityProviderName is the web identity provider name
|
||||||
|
WebIdentityProviderName = "WebIdentityCredentials"
|
||||||
|
)
|
||||||
|
|
||||||
|
// now is used to return a time.Time object representing
|
||||||
|
// the current time. This can be used to easily test and
|
||||||
|
// compare test values.
|
||||||
|
var now = time.Now
|
||||||
|
|
||||||
|
// TokenFetcher shuold return WebIdentity token bytes or an error
|
||||||
|
type TokenFetcher interface {
|
||||||
|
FetchToken(credentials.Context) ([]byte, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// FetchTokenPath is a path to a WebIdentity token file
|
||||||
|
type FetchTokenPath string
|
||||||
|
|
||||||
|
// FetchToken returns a token by reading from the filesystem
|
||||||
|
func (f FetchTokenPath) FetchToken(ctx credentials.Context) ([]byte, error) {
|
||||||
|
data, err := ioutil.ReadFile(string(f))
|
||||||
|
if err != nil {
|
||||||
|
errMsg := fmt.Sprintf("unable to read file at %s", f)
|
||||||
|
return nil, awserr.New(ErrCodeWebIdentity, errMsg, err)
|
||||||
|
}
|
||||||
|
return data, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// WebIdentityRoleProvider is used to retrieve credentials using
|
||||||
|
// an OIDC token.
|
||||||
|
type WebIdentityRoleProvider struct {
|
||||||
|
credentials.Expiry
|
||||||
|
PolicyArns []*sts.PolicyDescriptorType
|
||||||
|
|
||||||
|
// Duration the STS credentials will be valid for. Truncated to seconds.
|
||||||
|
// If unset, the assumed role will use AssumeRoleWithWebIdentity's default
|
||||||
|
// expiry duration. See
|
||||||
|
// https://docs.aws.amazon.com/sdk-for-go/api/service/sts/#STS.AssumeRoleWithWebIdentity
|
||||||
|
// for more information.
|
||||||
|
Duration time.Duration
|
||||||
|
|
||||||
|
// The amount of time the credentials will be refreshed before they expire.
|
||||||
|
// This is useful refresh credentials before they expire to reduce risk of
|
||||||
|
// using credentials as they expire. If unset, will default to no expiry
|
||||||
|
// window.
|
||||||
|
ExpiryWindow time.Duration
|
||||||
|
|
||||||
|
client stsiface.STSAPI
|
||||||
|
|
||||||
|
tokenFetcher TokenFetcher
|
||||||
|
roleARN string
|
||||||
|
roleSessionName string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewWebIdentityCredentials will return a new set of credentials with a given
|
||||||
|
// configuration, role arn, and token file path.
|
||||||
|
func NewWebIdentityCredentials(c client.ConfigProvider, roleARN, roleSessionName, path string) *credentials.Credentials {
|
||||||
|
svc := sts.New(c)
|
||||||
|
p := NewWebIdentityRoleProvider(svc, roleARN, roleSessionName, path)
|
||||||
|
return credentials.NewCredentials(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewWebIdentityRoleProvider will return a new WebIdentityRoleProvider with the
|
||||||
|
// provided stsiface.STSAPI
|
||||||
|
func NewWebIdentityRoleProvider(svc stsiface.STSAPI, roleARN, roleSessionName, path string) *WebIdentityRoleProvider {
|
||||||
|
return NewWebIdentityRoleProviderWithToken(svc, roleARN, roleSessionName, FetchTokenPath(path))
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewWebIdentityRoleProviderWithToken will return a new WebIdentityRoleProvider with the
|
||||||
|
// provided stsiface.STSAPI and a TokenFetcher
|
||||||
|
func NewWebIdentityRoleProviderWithToken(svc stsiface.STSAPI, roleARN, roleSessionName string, tokenFetcher TokenFetcher) *WebIdentityRoleProvider {
|
||||||
|
return &WebIdentityRoleProvider{
|
||||||
|
client: svc,
|
||||||
|
tokenFetcher: tokenFetcher,
|
||||||
|
roleARN: roleARN,
|
||||||
|
roleSessionName: roleSessionName,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Retrieve will attempt to assume a role from a token which is located at
|
||||||
|
// 'WebIdentityTokenFilePath' specified destination and if that is empty an
|
||||||
|
// error will be returned.
|
||||||
|
func (p *WebIdentityRoleProvider) Retrieve() (credentials.Value, error) {
|
||||||
|
return p.RetrieveWithContext(aws.BackgroundContext())
|
||||||
|
}
|
||||||
|
|
||||||
|
// RetrieveWithContext will attempt to assume a role from a token which is located at
|
||||||
|
// 'WebIdentityTokenFilePath' specified destination and if that is empty an
|
||||||
|
// error will be returned.
|
||||||
|
func (p *WebIdentityRoleProvider) RetrieveWithContext(ctx credentials.Context) (credentials.Value, error) {
|
||||||
|
b, err := p.tokenFetcher.FetchToken(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return credentials.Value{}, awserr.New(ErrCodeWebIdentity, "failed fetching WebIdentity token: ", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
sessionName := p.roleSessionName
|
||||||
|
if len(sessionName) == 0 {
|
||||||
|
// session name is used to uniquely identify a session. This simply
|
||||||
|
// uses unix time in nanoseconds to uniquely identify sessions.
|
||||||
|
sessionName = strconv.FormatInt(now().UnixNano(), 10)
|
||||||
|
}
|
||||||
|
|
||||||
|
var duration *int64
|
||||||
|
if p.Duration != 0 {
|
||||||
|
duration = aws.Int64(int64(p.Duration / time.Second))
|
||||||
|
}
|
||||||
|
|
||||||
|
req, resp := p.client.AssumeRoleWithWebIdentityRequest(&sts.AssumeRoleWithWebIdentityInput{
|
||||||
|
PolicyArns: p.PolicyArns,
|
||||||
|
RoleArn: &p.roleARN,
|
||||||
|
RoleSessionName: &sessionName,
|
||||||
|
WebIdentityToken: aws.String(string(b)),
|
||||||
|
DurationSeconds: duration,
|
||||||
|
})
|
||||||
|
|
||||||
|
req.SetContext(ctx)
|
||||||
|
|
||||||
|
// InvalidIdentityToken error is a temporary error that can occur
|
||||||
|
// when assuming an Role with a JWT web identity token.
|
||||||
|
req.RetryErrorCodes = append(req.RetryErrorCodes, sts.ErrCodeInvalidIdentityTokenException)
|
||||||
|
if err := req.Send(); err != nil {
|
||||||
|
return credentials.Value{}, awserr.New(ErrCodeWebIdentity, "failed to retrieve credentials", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
p.SetExpiration(aws.TimeValue(resp.Credentials.Expiration), p.ExpiryWindow)
|
||||||
|
|
||||||
|
value := credentials.Value{
|
||||||
|
AccessKeyID: aws.StringValue(resp.Credentials.AccessKeyId),
|
||||||
|
SecretAccessKey: aws.StringValue(resp.Credentials.SecretAccessKey),
|
||||||
|
SessionToken: aws.StringValue(resp.Credentials.SessionToken),
|
||||||
|
ProviderName: WebIdentityProviderName,
|
||||||
|
}
|
||||||
|
return value, nil
|
||||||
|
}
|
69
vendor/github.com/aws/aws-sdk-go/aws/csm/doc.go
generated
vendored
Normal file
69
vendor/github.com/aws/aws-sdk-go/aws/csm/doc.go
generated
vendored
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
// Package csm provides the Client Side Monitoring (CSM) client which enables
|
||||||
|
// sending metrics via UDP connection to the CSM agent. This package provides
|
||||||
|
// control options, and configuration for the CSM client. The client can be
|
||||||
|
// controlled manually, or automatically via the SDK's Session configuration.
|
||||||
|
//
|
||||||
|
// Enabling CSM client via SDK's Session configuration
|
||||||
|
//
|
||||||
|
// The CSM client can be enabled automatically via SDK's Session configuration.
|
||||||
|
// The SDK's session configuration enables the CSM client if the AWS_CSM_PORT
|
||||||
|
// environment variable is set to a non-empty value.
|
||||||
|
//
|
||||||
|
// The configuration options for the CSM client via the SDK's session
|
||||||
|
// configuration are:
|
||||||
|
//
|
||||||
|
// * AWS_CSM_PORT=<port number>
|
||||||
|
// The port number the CSM agent will receive metrics on.
|
||||||
|
//
|
||||||
|
// * AWS_CSM_HOST=<hostname or ip>
|
||||||
|
// The hostname, or IP address the CSM agent will receive metrics on.
|
||||||
|
// Without port number.
|
||||||
|
//
|
||||||
|
// Manually enabling the CSM client
|
||||||
|
//
|
||||||
|
// The CSM client can be started, paused, and resumed manually. The Start
|
||||||
|
// function will enable the CSM client to publish metrics to the CSM agent. It
|
||||||
|
// is safe to call Start concurrently, but if Start is called additional times
|
||||||
|
// with different ClientID or address it will panic.
|
||||||
|
//
|
||||||
|
// r, err := csm.Start("clientID", ":31000")
|
||||||
|
// if err != nil {
|
||||||
|
// panic(fmt.Errorf("failed starting CSM: %v", err))
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// When controlling the CSM client manually, you must also inject its request
|
||||||
|
// handlers into the SDK's Session configuration for the SDK's API clients to
|
||||||
|
// publish metrics.
|
||||||
|
//
|
||||||
|
// sess, err := session.NewSession(&aws.Config{})
|
||||||
|
// if err != nil {
|
||||||
|
// panic(fmt.Errorf("failed loading session: %v", err))
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// // Add CSM client's metric publishing request handlers to the SDK's
|
||||||
|
// // Session Configuration.
|
||||||
|
// r.InjectHandlers(&sess.Handlers)
|
||||||
|
//
|
||||||
|
// Controlling CSM client
|
||||||
|
//
|
||||||
|
// Once the CSM client has been enabled the Get function will return a Reporter
|
||||||
|
// value that you can use to pause and resume the metrics published to the CSM
|
||||||
|
// agent. If Get function is called before the reporter is enabled with the
|
||||||
|
// Start function or via SDK's Session configuration nil will be returned.
|
||||||
|
//
|
||||||
|
// The Pause method can be called to stop the CSM client publishing metrics to
|
||||||
|
// the CSM agent. The Continue method will resume metric publishing.
|
||||||
|
//
|
||||||
|
// // Get the CSM client Reporter.
|
||||||
|
// r := csm.Get()
|
||||||
|
//
|
||||||
|
// // Will pause monitoring
|
||||||
|
// r.Pause()
|
||||||
|
// resp, err = client.GetObject(&s3.GetObjectInput{
|
||||||
|
// Bucket: aws.String("bucket"),
|
||||||
|
// Key: aws.String("key"),
|
||||||
|
// })
|
||||||
|
//
|
||||||
|
// // Resume monitoring
|
||||||
|
// r.Continue()
|
||||||
|
package csm
|
89
vendor/github.com/aws/aws-sdk-go/aws/csm/enable.go
generated
vendored
Normal file
89
vendor/github.com/aws/aws-sdk-go/aws/csm/enable.go
generated
vendored
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
package csm
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
lock sync.Mutex
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// DefaultPort is used when no port is specified.
|
||||||
|
DefaultPort = "31000"
|
||||||
|
|
||||||
|
// DefaultHost is the host that will be used when none is specified.
|
||||||
|
DefaultHost = "127.0.0.1"
|
||||||
|
)
|
||||||
|
|
||||||
|
// AddressWithDefaults returns a CSM address built from the host and port
|
||||||
|
// values. If the host or port is not set, default values will be used
|
||||||
|
// instead. If host is "localhost" it will be replaced with "127.0.0.1".
|
||||||
|
func AddressWithDefaults(host, port string) string {
|
||||||
|
if len(host) == 0 || strings.EqualFold(host, "localhost") {
|
||||||
|
host = DefaultHost
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(port) == 0 {
|
||||||
|
port = DefaultPort
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only IP6 host can contain a colon
|
||||||
|
if strings.Contains(host, ":") {
|
||||||
|
return "[" + host + "]:" + port
|
||||||
|
}
|
||||||
|
|
||||||
|
return host + ":" + port
|
||||||
|
}
|
||||||
|
|
||||||
|
// Start will start a long running go routine to capture
|
||||||
|
// client side metrics. Calling start multiple time will only
|
||||||
|
// start the metric listener once and will panic if a different
|
||||||
|
// client ID or port is passed in.
|
||||||
|
//
|
||||||
|
// r, err := csm.Start("clientID", "127.0.0.1:31000")
|
||||||
|
// if err != nil {
|
||||||
|
// panic(fmt.Errorf("expected no error, but received %v", err))
|
||||||
|
// }
|
||||||
|
// sess := session.NewSession()
|
||||||
|
// r.InjectHandlers(sess.Handlers)
|
||||||
|
//
|
||||||
|
// svc := s3.New(sess)
|
||||||
|
// out, err := svc.GetObject(&s3.GetObjectInput{
|
||||||
|
// Bucket: aws.String("bucket"),
|
||||||
|
// Key: aws.String("key"),
|
||||||
|
// })
|
||||||
|
func Start(clientID string, url string) (*Reporter, error) {
|
||||||
|
lock.Lock()
|
||||||
|
defer lock.Unlock()
|
||||||
|
|
||||||
|
if sender == nil {
|
||||||
|
sender = newReporter(clientID, url)
|
||||||
|
} else {
|
||||||
|
if sender.clientID != clientID {
|
||||||
|
panic(fmt.Errorf("inconsistent client IDs. %q was expected, but received %q", sender.clientID, clientID))
|
||||||
|
}
|
||||||
|
|
||||||
|
if sender.url != url {
|
||||||
|
panic(fmt.Errorf("inconsistent URLs. %q was expected, but received %q", sender.url, url))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := connect(url); err != nil {
|
||||||
|
sender = nil
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return sender, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get will return a reporter if one exists, if one does not exist, nil will
|
||||||
|
// be returned.
|
||||||
|
func Get() *Reporter {
|
||||||
|
lock.Lock()
|
||||||
|
defer lock.Unlock()
|
||||||
|
|
||||||
|
return sender
|
||||||
|
}
|
109
vendor/github.com/aws/aws-sdk-go/aws/csm/metric.go
generated
vendored
Normal file
109
vendor/github.com/aws/aws-sdk-go/aws/csm/metric.go
generated
vendored
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
package csm
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strconv"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
|
)
|
||||||
|
|
||||||
|
type metricTime time.Time
|
||||||
|
|
||||||
|
func (t metricTime) MarshalJSON() ([]byte, error) {
|
||||||
|
ns := time.Duration(time.Time(t).UnixNano())
|
||||||
|
return []byte(strconv.FormatInt(int64(ns/time.Millisecond), 10)), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type metric struct {
|
||||||
|
ClientID *string `json:"ClientId,omitempty"`
|
||||||
|
API *string `json:"Api,omitempty"`
|
||||||
|
Service *string `json:"Service,omitempty"`
|
||||||
|
Timestamp *metricTime `json:"Timestamp,omitempty"`
|
||||||
|
Type *string `json:"Type,omitempty"`
|
||||||
|
Version *int `json:"Version,omitempty"`
|
||||||
|
|
||||||
|
AttemptCount *int `json:"AttemptCount,omitempty"`
|
||||||
|
Latency *int `json:"Latency,omitempty"`
|
||||||
|
|
||||||
|
Fqdn *string `json:"Fqdn,omitempty"`
|
||||||
|
UserAgent *string `json:"UserAgent,omitempty"`
|
||||||
|
AttemptLatency *int `json:"AttemptLatency,omitempty"`
|
||||||
|
|
||||||
|
SessionToken *string `json:"SessionToken,omitempty"`
|
||||||
|
Region *string `json:"Region,omitempty"`
|
||||||
|
AccessKey *string `json:"AccessKey,omitempty"`
|
||||||
|
HTTPStatusCode *int `json:"HttpStatusCode,omitempty"`
|
||||||
|
XAmzID2 *string `json:"XAmzId2,omitempty"`
|
||||||
|
XAmzRequestID *string `json:"XAmznRequestId,omitempty"`
|
||||||
|
|
||||||
|
AWSException *string `json:"AwsException,omitempty"`
|
||||||
|
AWSExceptionMessage *string `json:"AwsExceptionMessage,omitempty"`
|
||||||
|
SDKException *string `json:"SdkException,omitempty"`
|
||||||
|
SDKExceptionMessage *string `json:"SdkExceptionMessage,omitempty"`
|
||||||
|
|
||||||
|
FinalHTTPStatusCode *int `json:"FinalHttpStatusCode,omitempty"`
|
||||||
|
FinalAWSException *string `json:"FinalAwsException,omitempty"`
|
||||||
|
FinalAWSExceptionMessage *string `json:"FinalAwsExceptionMessage,omitempty"`
|
||||||
|
FinalSDKException *string `json:"FinalSdkException,omitempty"`
|
||||||
|
FinalSDKExceptionMessage *string `json:"FinalSdkExceptionMessage,omitempty"`
|
||||||
|
|
||||||
|
DestinationIP *string `json:"DestinationIp,omitempty"`
|
||||||
|
ConnectionReused *int `json:"ConnectionReused,omitempty"`
|
||||||
|
|
||||||
|
AcquireConnectionLatency *int `json:"AcquireConnectionLatency,omitempty"`
|
||||||
|
ConnectLatency *int `json:"ConnectLatency,omitempty"`
|
||||||
|
RequestLatency *int `json:"RequestLatency,omitempty"`
|
||||||
|
DNSLatency *int `json:"DnsLatency,omitempty"`
|
||||||
|
TCPLatency *int `json:"TcpLatency,omitempty"`
|
||||||
|
SSLLatency *int `json:"SslLatency,omitempty"`
|
||||||
|
|
||||||
|
MaxRetriesExceeded *int `json:"MaxRetriesExceeded,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *metric) TruncateFields() {
|
||||||
|
m.ClientID = truncateString(m.ClientID, 255)
|
||||||
|
m.UserAgent = truncateString(m.UserAgent, 256)
|
||||||
|
|
||||||
|
m.AWSException = truncateString(m.AWSException, 128)
|
||||||
|
m.AWSExceptionMessage = truncateString(m.AWSExceptionMessage, 512)
|
||||||
|
|
||||||
|
m.SDKException = truncateString(m.SDKException, 128)
|
||||||
|
m.SDKExceptionMessage = truncateString(m.SDKExceptionMessage, 512)
|
||||||
|
|
||||||
|
m.FinalAWSException = truncateString(m.FinalAWSException, 128)
|
||||||
|
m.FinalAWSExceptionMessage = truncateString(m.FinalAWSExceptionMessage, 512)
|
||||||
|
|
||||||
|
m.FinalSDKException = truncateString(m.FinalSDKException, 128)
|
||||||
|
m.FinalSDKExceptionMessage = truncateString(m.FinalSDKExceptionMessage, 512)
|
||||||
|
}
|
||||||
|
|
||||||
|
func truncateString(v *string, l int) *string {
|
||||||
|
if v != nil && len(*v) > l {
|
||||||
|
nv := (*v)[:l]
|
||||||
|
return &nv
|
||||||
|
}
|
||||||
|
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *metric) SetException(e metricException) {
|
||||||
|
switch te := e.(type) {
|
||||||
|
case awsException:
|
||||||
|
m.AWSException = aws.String(te.exception)
|
||||||
|
m.AWSExceptionMessage = aws.String(te.message)
|
||||||
|
case sdkException:
|
||||||
|
m.SDKException = aws.String(te.exception)
|
||||||
|
m.SDKExceptionMessage = aws.String(te.message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *metric) SetFinalException(e metricException) {
|
||||||
|
switch te := e.(type) {
|
||||||
|
case awsException:
|
||||||
|
m.FinalAWSException = aws.String(te.exception)
|
||||||
|
m.FinalAWSExceptionMessage = aws.String(te.message)
|
||||||
|
case sdkException:
|
||||||
|
m.FinalSDKException = aws.String(te.exception)
|
||||||
|
m.FinalSDKExceptionMessage = aws.String(te.message)
|
||||||
|
}
|
||||||
|
}
|
55
vendor/github.com/aws/aws-sdk-go/aws/csm/metric_chan.go
generated
vendored
Normal file
55
vendor/github.com/aws/aws-sdk-go/aws/csm/metric_chan.go
generated
vendored
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
package csm
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sync/atomic"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
runningEnum = iota
|
||||||
|
pausedEnum
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// MetricsChannelSize of metrics to hold in the channel
|
||||||
|
MetricsChannelSize = 100
|
||||||
|
)
|
||||||
|
|
||||||
|
type metricChan struct {
|
||||||
|
ch chan metric
|
||||||
|
paused *int64
|
||||||
|
}
|
||||||
|
|
||||||
|
func newMetricChan(size int) metricChan {
|
||||||
|
return metricChan{
|
||||||
|
ch: make(chan metric, size),
|
||||||
|
paused: new(int64),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ch *metricChan) Pause() {
|
||||||
|
atomic.StoreInt64(ch.paused, pausedEnum)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ch *metricChan) Continue() {
|
||||||
|
atomic.StoreInt64(ch.paused, runningEnum)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ch *metricChan) IsPaused() bool {
|
||||||
|
v := atomic.LoadInt64(ch.paused)
|
||||||
|
return v == pausedEnum
|
||||||
|
}
|
||||||
|
|
||||||
|
// Push will push metrics to the metric channel if the channel
|
||||||
|
// is not paused
|
||||||
|
func (ch *metricChan) Push(m metric) bool {
|
||||||
|
if ch.IsPaused() {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
select {
|
||||||
|
case ch.ch <- m:
|
||||||
|
return true
|
||||||
|
default:
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
26
vendor/github.com/aws/aws-sdk-go/aws/csm/metric_exception.go
generated
vendored
Normal file
26
vendor/github.com/aws/aws-sdk-go/aws/csm/metric_exception.go
generated
vendored
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
package csm
|
||||||
|
|
||||||
|
type metricException interface {
|
||||||
|
Exception() string
|
||||||
|
Message() string
|
||||||
|
}
|
||||||
|
|
||||||
|
type requestException struct {
|
||||||
|
exception string
|
||||||
|
message string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e requestException) Exception() string {
|
||||||
|
return e.exception
|
||||||
|
}
|
||||||
|
func (e requestException) Message() string {
|
||||||
|
return e.message
|
||||||
|
}
|
||||||
|
|
||||||
|
type awsException struct {
|
||||||
|
requestException
|
||||||
|
}
|
||||||
|
|
||||||
|
type sdkException struct {
|
||||||
|
requestException
|
||||||
|
}
|
264
vendor/github.com/aws/aws-sdk-go/aws/csm/reporter.go
generated
vendored
Normal file
264
vendor/github.com/aws/aws-sdk-go/aws/csm/reporter.go
generated
vendored
Normal file
@ -0,0 +1,264 @@
|
|||||||
|
package csm
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"net"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/request"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Reporter will gather metrics of API requests made and
|
||||||
|
// send those metrics to the CSM endpoint.
|
||||||
|
type Reporter struct {
|
||||||
|
clientID string
|
||||||
|
url string
|
||||||
|
conn net.Conn
|
||||||
|
metricsCh metricChan
|
||||||
|
done chan struct{}
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
sender *Reporter
|
||||||
|
)
|
||||||
|
|
||||||
|
func connect(url string) error {
|
||||||
|
const network = "udp"
|
||||||
|
if err := sender.connect(network, url); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if sender.done == nil {
|
||||||
|
sender.done = make(chan struct{})
|
||||||
|
go sender.start()
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func newReporter(clientID, url string) *Reporter {
|
||||||
|
return &Reporter{
|
||||||
|
clientID: clientID,
|
||||||
|
url: url,
|
||||||
|
metricsCh: newMetricChan(MetricsChannelSize),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rep *Reporter) sendAPICallAttemptMetric(r *request.Request) {
|
||||||
|
if rep == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
now := time.Now()
|
||||||
|
creds, _ := r.Config.Credentials.Get()
|
||||||
|
|
||||||
|
m := metric{
|
||||||
|
ClientID: aws.String(rep.clientID),
|
||||||
|
API: aws.String(r.Operation.Name),
|
||||||
|
Service: aws.String(r.ClientInfo.ServiceID),
|
||||||
|
Timestamp: (*metricTime)(&now),
|
||||||
|
UserAgent: aws.String(r.HTTPRequest.Header.Get("User-Agent")),
|
||||||
|
Region: r.Config.Region,
|
||||||
|
Type: aws.String("ApiCallAttempt"),
|
||||||
|
Version: aws.Int(1),
|
||||||
|
|
||||||
|
XAmzRequestID: aws.String(r.RequestID),
|
||||||
|
|
||||||
|
AttemptLatency: aws.Int(int(now.Sub(r.AttemptTime).Nanoseconds() / int64(time.Millisecond))),
|
||||||
|
AccessKey: aws.String(creds.AccessKeyID),
|
||||||
|
}
|
||||||
|
|
||||||
|
if r.HTTPResponse != nil {
|
||||||
|
m.HTTPStatusCode = aws.Int(r.HTTPResponse.StatusCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
if r.Error != nil {
|
||||||
|
if awserr, ok := r.Error.(awserr.Error); ok {
|
||||||
|
m.SetException(getMetricException(awserr))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m.TruncateFields()
|
||||||
|
rep.metricsCh.Push(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
func getMetricException(err awserr.Error) metricException {
|
||||||
|
msg := err.Error()
|
||||||
|
code := err.Code()
|
||||||
|
|
||||||
|
switch code {
|
||||||
|
case request.ErrCodeRequestError,
|
||||||
|
request.ErrCodeSerialization,
|
||||||
|
request.CanceledErrorCode:
|
||||||
|
return sdkException{
|
||||||
|
requestException{exception: code, message: msg},
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return awsException{
|
||||||
|
requestException{exception: code, message: msg},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rep *Reporter) sendAPICallMetric(r *request.Request) {
|
||||||
|
if rep == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
now := time.Now()
|
||||||
|
m := metric{
|
||||||
|
ClientID: aws.String(rep.clientID),
|
||||||
|
API: aws.String(r.Operation.Name),
|
||||||
|
Service: aws.String(r.ClientInfo.ServiceID),
|
||||||
|
Timestamp: (*metricTime)(&now),
|
||||||
|
UserAgent: aws.String(r.HTTPRequest.Header.Get("User-Agent")),
|
||||||
|
Type: aws.String("ApiCall"),
|
||||||
|
AttemptCount: aws.Int(r.RetryCount + 1),
|
||||||
|
Region: r.Config.Region,
|
||||||
|
Latency: aws.Int(int(time.Since(r.Time) / time.Millisecond)),
|
||||||
|
XAmzRequestID: aws.String(r.RequestID),
|
||||||
|
MaxRetriesExceeded: aws.Int(boolIntValue(r.RetryCount >= r.MaxRetries())),
|
||||||
|
}
|
||||||
|
|
||||||
|
if r.HTTPResponse != nil {
|
||||||
|
m.FinalHTTPStatusCode = aws.Int(r.HTTPResponse.StatusCode)
|
||||||
|
}
|
||||||
|
|
||||||
|
if r.Error != nil {
|
||||||
|
if awserr, ok := r.Error.(awserr.Error); ok {
|
||||||
|
m.SetFinalException(getMetricException(awserr))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m.TruncateFields()
|
||||||
|
|
||||||
|
// TODO: Probably want to figure something out for logging dropped
|
||||||
|
// metrics
|
||||||
|
rep.metricsCh.Push(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rep *Reporter) connect(network, url string) error {
|
||||||
|
if rep.conn != nil {
|
||||||
|
rep.conn.Close()
|
||||||
|
}
|
||||||
|
|
||||||
|
conn, err := net.Dial(network, url)
|
||||||
|
if err != nil {
|
||||||
|
return awserr.New("UDPError", "Could not connect", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
rep.conn = conn
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rep *Reporter) close() {
|
||||||
|
if rep.done != nil {
|
||||||
|
close(rep.done)
|
||||||
|
}
|
||||||
|
|
||||||
|
rep.metricsCh.Pause()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rep *Reporter) start() {
|
||||||
|
defer func() {
|
||||||
|
rep.metricsCh.Pause()
|
||||||
|
}()
|
||||||
|
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case <-rep.done:
|
||||||
|
rep.done = nil
|
||||||
|
return
|
||||||
|
case m := <-rep.metricsCh.ch:
|
||||||
|
// TODO: What to do with this error? Probably should just log
|
||||||
|
b, err := json.Marshal(m)
|
||||||
|
if err != nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
rep.conn.Write(b)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pause will pause the metric channel preventing any new metrics from being
|
||||||
|
// added. It is safe to call concurrently with other calls to Pause, but if
|
||||||
|
// called concurently with Continue can lead to unexpected state.
|
||||||
|
func (rep *Reporter) Pause() {
|
||||||
|
lock.Lock()
|
||||||
|
defer lock.Unlock()
|
||||||
|
|
||||||
|
if rep == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
rep.close()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Continue will reopen the metric channel and allow for monitoring to be
|
||||||
|
// resumed. It is safe to call concurrently with other calls to Continue, but
|
||||||
|
// if called concurently with Pause can lead to unexpected state.
|
||||||
|
func (rep *Reporter) Continue() {
|
||||||
|
lock.Lock()
|
||||||
|
defer lock.Unlock()
|
||||||
|
if rep == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if !rep.metricsCh.IsPaused() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
rep.metricsCh.Continue()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Client side metric handler names
|
||||||
|
const (
|
||||||
|
APICallMetricHandlerName = "awscsm.SendAPICallMetric"
|
||||||
|
APICallAttemptMetricHandlerName = "awscsm.SendAPICallAttemptMetric"
|
||||||
|
)
|
||||||
|
|
||||||
|
// InjectHandlers will will enable client side metrics and inject the proper
|
||||||
|
// handlers to handle how metrics are sent.
|
||||||
|
//
|
||||||
|
// InjectHandlers is NOT safe to call concurrently. Calling InjectHandlers
|
||||||
|
// multiple times may lead to unexpected behavior, (e.g. duplicate metrics).
|
||||||
|
//
|
||||||
|
// // Start must be called in order to inject the correct handlers
|
||||||
|
// r, err := csm.Start("clientID", "127.0.0.1:8094")
|
||||||
|
// if err != nil {
|
||||||
|
// panic(fmt.Errorf("expected no error, but received %v", err))
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// sess := session.NewSession()
|
||||||
|
// r.InjectHandlers(&sess.Handlers)
|
||||||
|
//
|
||||||
|
// // create a new service client with our client side metric session
|
||||||
|
// svc := s3.New(sess)
|
||||||
|
func (rep *Reporter) InjectHandlers(handlers *request.Handlers) {
|
||||||
|
if rep == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
handlers.Complete.PushFrontNamed(request.NamedHandler{
|
||||||
|
Name: APICallMetricHandlerName,
|
||||||
|
Fn: rep.sendAPICallMetric,
|
||||||
|
})
|
||||||
|
|
||||||
|
handlers.CompleteAttempt.PushFrontNamed(request.NamedHandler{
|
||||||
|
Name: APICallAttemptMetricHandlerName,
|
||||||
|
Fn: rep.sendAPICallAttemptMetric,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// boolIntValue return 1 for true and 0 for false.
|
||||||
|
func boolIntValue(b bool) int {
|
||||||
|
if b {
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0
|
||||||
|
}
|
207
vendor/github.com/aws/aws-sdk-go/aws/defaults/defaults.go
generated
vendored
Normal file
207
vendor/github.com/aws/aws-sdk-go/aws/defaults/defaults.go
generated
vendored
Normal file
@ -0,0 +1,207 @@
|
|||||||
|
// Package defaults is a collection of helpers to retrieve the SDK's default
|
||||||
|
// configuration and handlers.
|
||||||
|
//
|
||||||
|
// Generally this package shouldn't be used directly, but session.Session
|
||||||
|
// instead. This package is useful when you need to reset the defaults
|
||||||
|
// of a session or service client to the SDK defaults before setting
|
||||||
|
// additional parameters.
|
||||||
|
package defaults
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"os"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/corehandlers"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/credentials"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/credentials/endpointcreds"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/ec2metadata"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/endpoints"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/request"
|
||||||
|
"github.com/aws/aws-sdk-go/internal/shareddefaults"
|
||||||
|
)
|
||||||
|
|
||||||
|
// A Defaults provides a collection of default values for SDK clients.
|
||||||
|
type Defaults struct {
|
||||||
|
Config *aws.Config
|
||||||
|
Handlers request.Handlers
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get returns the SDK's default values with Config and handlers pre-configured.
|
||||||
|
func Get() Defaults {
|
||||||
|
cfg := Config()
|
||||||
|
handlers := Handlers()
|
||||||
|
cfg.Credentials = CredChain(cfg, handlers)
|
||||||
|
|
||||||
|
return Defaults{
|
||||||
|
Config: cfg,
|
||||||
|
Handlers: handlers,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Config returns the default configuration without credentials.
|
||||||
|
// To retrieve a config with credentials also included use
|
||||||
|
// `defaults.Get().Config` instead.
|
||||||
|
//
|
||||||
|
// Generally you shouldn't need to use this method directly, but
|
||||||
|
// is available if you need to reset the configuration of an
|
||||||
|
// existing service client or session.
|
||||||
|
func Config() *aws.Config {
|
||||||
|
return aws.NewConfig().
|
||||||
|
WithCredentials(credentials.AnonymousCredentials).
|
||||||
|
WithRegion(os.Getenv("AWS_REGION")).
|
||||||
|
WithHTTPClient(http.DefaultClient).
|
||||||
|
WithMaxRetries(aws.UseServiceDefaultRetries).
|
||||||
|
WithLogger(aws.NewDefaultLogger()).
|
||||||
|
WithLogLevel(aws.LogOff).
|
||||||
|
WithEndpointResolver(endpoints.DefaultResolver())
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handlers returns the default request handlers.
|
||||||
|
//
|
||||||
|
// Generally you shouldn't need to use this method directly, but
|
||||||
|
// is available if you need to reset the request handlers of an
|
||||||
|
// existing service client or session.
|
||||||
|
func Handlers() request.Handlers {
|
||||||
|
var handlers request.Handlers
|
||||||
|
|
||||||
|
handlers.Validate.PushBackNamed(corehandlers.ValidateEndpointHandler)
|
||||||
|
handlers.Validate.AfterEachFn = request.HandlerListStopOnError
|
||||||
|
handlers.Build.PushBackNamed(corehandlers.SDKVersionUserAgentHandler)
|
||||||
|
handlers.Build.PushBackNamed(corehandlers.AddHostExecEnvUserAgentHander)
|
||||||
|
handlers.Build.AfterEachFn = request.HandlerListStopOnError
|
||||||
|
handlers.Sign.PushBackNamed(corehandlers.BuildContentLengthHandler)
|
||||||
|
handlers.Send.PushBackNamed(corehandlers.ValidateReqSigHandler)
|
||||||
|
handlers.Send.PushBackNamed(corehandlers.SendHandler)
|
||||||
|
handlers.AfterRetry.PushBackNamed(corehandlers.AfterRetryHandler)
|
||||||
|
handlers.ValidateResponse.PushBackNamed(corehandlers.ValidateResponseHandler)
|
||||||
|
|
||||||
|
return handlers
|
||||||
|
}
|
||||||
|
|
||||||
|
// CredChain returns the default credential chain.
|
||||||
|
//
|
||||||
|
// Generally you shouldn't need to use this method directly, but
|
||||||
|
// is available if you need to reset the credentials of an
|
||||||
|
// existing service client or session's Config.
|
||||||
|
func CredChain(cfg *aws.Config, handlers request.Handlers) *credentials.Credentials {
|
||||||
|
return credentials.NewCredentials(&credentials.ChainProvider{
|
||||||
|
VerboseErrors: aws.BoolValue(cfg.CredentialsChainVerboseErrors),
|
||||||
|
Providers: CredProviders(cfg, handlers),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// CredProviders returns the slice of providers used in
|
||||||
|
// the default credential chain.
|
||||||
|
//
|
||||||
|
// For applications that need to use some other provider (for example use
|
||||||
|
// different environment variables for legacy reasons) but still fall back
|
||||||
|
// on the default chain of providers. This allows that default chaint to be
|
||||||
|
// automatically updated
|
||||||
|
func CredProviders(cfg *aws.Config, handlers request.Handlers) []credentials.Provider {
|
||||||
|
return []credentials.Provider{
|
||||||
|
&credentials.EnvProvider{},
|
||||||
|
&credentials.SharedCredentialsProvider{Filename: "", Profile: ""},
|
||||||
|
RemoteCredProvider(*cfg, handlers),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
httpProviderAuthorizationEnvVar = "AWS_CONTAINER_AUTHORIZATION_TOKEN"
|
||||||
|
httpProviderEnvVar = "AWS_CONTAINER_CREDENTIALS_FULL_URI"
|
||||||
|
)
|
||||||
|
|
||||||
|
// RemoteCredProvider returns a credentials provider for the default remote
|
||||||
|
// endpoints such as EC2 or ECS Roles.
|
||||||
|
func RemoteCredProvider(cfg aws.Config, handlers request.Handlers) credentials.Provider {
|
||||||
|
if u := os.Getenv(httpProviderEnvVar); len(u) > 0 {
|
||||||
|
return localHTTPCredProvider(cfg, handlers, u)
|
||||||
|
}
|
||||||
|
|
||||||
|
if uri := os.Getenv(shareddefaults.ECSCredsProviderEnvVar); len(uri) > 0 {
|
||||||
|
u := fmt.Sprintf("%s%s", shareddefaults.ECSContainerCredentialsURI, uri)
|
||||||
|
return httpCredProvider(cfg, handlers, u)
|
||||||
|
}
|
||||||
|
|
||||||
|
return ec2RoleProvider(cfg, handlers)
|
||||||
|
}
|
||||||
|
|
||||||
|
var lookupHostFn = net.LookupHost
|
||||||
|
|
||||||
|
func isLoopbackHost(host string) (bool, error) {
|
||||||
|
ip := net.ParseIP(host)
|
||||||
|
if ip != nil {
|
||||||
|
return ip.IsLoopback(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Host is not an ip, perform lookup
|
||||||
|
addrs, err := lookupHostFn(host)
|
||||||
|
if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
for _, addr := range addrs {
|
||||||
|
if !net.ParseIP(addr).IsLoopback() {
|
||||||
|
return false, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func localHTTPCredProvider(cfg aws.Config, handlers request.Handlers, u string) credentials.Provider {
|
||||||
|
var errMsg string
|
||||||
|
|
||||||
|
parsed, err := url.Parse(u)
|
||||||
|
if err != nil {
|
||||||
|
errMsg = fmt.Sprintf("invalid URL, %v", err)
|
||||||
|
} else {
|
||||||
|
host := aws.URLHostname(parsed)
|
||||||
|
if len(host) == 0 {
|
||||||
|
errMsg = "unable to parse host from local HTTP cred provider URL"
|
||||||
|
} else if isLoopback, loopbackErr := isLoopbackHost(host); loopbackErr != nil {
|
||||||
|
errMsg = fmt.Sprintf("failed to resolve host %q, %v", host, loopbackErr)
|
||||||
|
} else if !isLoopback {
|
||||||
|
errMsg = fmt.Sprintf("invalid endpoint host, %q, only loopback hosts are allowed.", host)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(errMsg) > 0 {
|
||||||
|
if cfg.Logger != nil {
|
||||||
|
cfg.Logger.Log("Ignoring, HTTP credential provider", errMsg, err)
|
||||||
|
}
|
||||||
|
return credentials.ErrorProvider{
|
||||||
|
Err: awserr.New("CredentialsEndpointError", errMsg, err),
|
||||||
|
ProviderName: endpointcreds.ProviderName,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return httpCredProvider(cfg, handlers, u)
|
||||||
|
}
|
||||||
|
|
||||||
|
func httpCredProvider(cfg aws.Config, handlers request.Handlers, u string) credentials.Provider {
|
||||||
|
return endpointcreds.NewProviderClient(cfg, handlers, u,
|
||||||
|
func(p *endpointcreds.Provider) {
|
||||||
|
p.ExpiryWindow = 5 * time.Minute
|
||||||
|
p.AuthorizationToken = os.Getenv(httpProviderAuthorizationEnvVar)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func ec2RoleProvider(cfg aws.Config, handlers request.Handlers) credentials.Provider {
|
||||||
|
resolver := cfg.EndpointResolver
|
||||||
|
if resolver == nil {
|
||||||
|
resolver = endpoints.DefaultResolver()
|
||||||
|
}
|
||||||
|
|
||||||
|
e, _ := resolver.EndpointFor(endpoints.Ec2metadataServiceID, "")
|
||||||
|
return &ec2rolecreds.EC2RoleProvider{
|
||||||
|
Client: ec2metadata.NewClient(cfg, handlers, e.URL, e.SigningRegion),
|
||||||
|
ExpiryWindow: 5 * time.Minute,
|
||||||
|
}
|
||||||
|
}
|
27
vendor/github.com/aws/aws-sdk-go/aws/defaults/shared_config.go
generated
vendored
Normal file
27
vendor/github.com/aws/aws-sdk-go/aws/defaults/shared_config.go
generated
vendored
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
package defaults
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/aws/aws-sdk-go/internal/shareddefaults"
|
||||||
|
)
|
||||||
|
|
||||||
|
// SharedCredentialsFilename returns the SDK's default file path
|
||||||
|
// for the shared credentials file.
|
||||||
|
//
|
||||||
|
// Builds the shared config file path based on the OS's platform.
|
||||||
|
//
|
||||||
|
// - Linux/Unix: $HOME/.aws/credentials
|
||||||
|
// - Windows: %USERPROFILE%\.aws\credentials
|
||||||
|
func SharedCredentialsFilename() string {
|
||||||
|
return shareddefaults.SharedCredentialsFilename()
|
||||||
|
}
|
||||||
|
|
||||||
|
// SharedConfigFilename returns the SDK's default file path for
|
||||||
|
// the shared config file.
|
||||||
|
//
|
||||||
|
// Builds the shared config file path based on the OS's platform.
|
||||||
|
//
|
||||||
|
// - Linux/Unix: $HOME/.aws/config
|
||||||
|
// - Windows: %USERPROFILE%\.aws\config
|
||||||
|
func SharedConfigFilename() string {
|
||||||
|
return shareddefaults.SharedConfigFilename()
|
||||||
|
}
|
250
vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/api.go
generated
vendored
Normal file
250
vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/api.go
generated
vendored
Normal file
@ -0,0 +1,250 @@
|
|||||||
|
package ec2metadata
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"net/http"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"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/internal/sdkuri"
|
||||||
|
)
|
||||||
|
|
||||||
|
// getToken uses the duration to return a token for EC2 metadata service,
|
||||||
|
// or an error if the request failed.
|
||||||
|
func (c *EC2Metadata) getToken(ctx aws.Context, duration time.Duration) (tokenOutput, error) {
|
||||||
|
op := &request.Operation{
|
||||||
|
Name: "GetToken",
|
||||||
|
HTTPMethod: "PUT",
|
||||||
|
HTTPPath: "/latest/api/token",
|
||||||
|
}
|
||||||
|
|
||||||
|
var output tokenOutput
|
||||||
|
req := c.NewRequest(op, nil, &output)
|
||||||
|
req.SetContext(ctx)
|
||||||
|
|
||||||
|
// remove the fetch token handler from the request handlers to avoid infinite recursion
|
||||||
|
req.Handlers.Sign.RemoveByName(fetchTokenHandlerName)
|
||||||
|
|
||||||
|
// Swap the unmarshalMetadataHandler with unmarshalTokenHandler on this request.
|
||||||
|
req.Handlers.Unmarshal.Swap(unmarshalMetadataHandlerName, unmarshalTokenHandler)
|
||||||
|
|
||||||
|
ttl := strconv.FormatInt(int64(duration/time.Second), 10)
|
||||||
|
req.HTTPRequest.Header.Set(ttlHeader, ttl)
|
||||||
|
|
||||||
|
err := req.Send()
|
||||||
|
|
||||||
|
// Errors with bad request status should be returned.
|
||||||
|
if err != nil {
|
||||||
|
err = awserr.NewRequestFailure(
|
||||||
|
awserr.New(req.HTTPResponse.Status, http.StatusText(req.HTTPResponse.StatusCode), err),
|
||||||
|
req.HTTPResponse.StatusCode, req.RequestID)
|
||||||
|
}
|
||||||
|
|
||||||
|
return output, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetMetadata uses the path provided to request information from the EC2
|
||||||
|
// instance metadata service. The content will be returned as a string, or
|
||||||
|
// error if the request failed.
|
||||||
|
func (c *EC2Metadata) GetMetadata(p string) (string, error) {
|
||||||
|
return c.GetMetadataWithContext(aws.BackgroundContext(), p)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetMetadataWithContext uses the path provided to request information from the EC2
|
||||||
|
// instance metadata service. The content will be returned as a string, or
|
||||||
|
// error if the request failed.
|
||||||
|
func (c *EC2Metadata) GetMetadataWithContext(ctx aws.Context, p string) (string, error) {
|
||||||
|
op := &request.Operation{
|
||||||
|
Name: "GetMetadata",
|
||||||
|
HTTPMethod: "GET",
|
||||||
|
HTTPPath: sdkuri.PathJoin("/latest/meta-data", p),
|
||||||
|
}
|
||||||
|
output := &metadataOutput{}
|
||||||
|
|
||||||
|
req := c.NewRequest(op, nil, output)
|
||||||
|
|
||||||
|
req.SetContext(ctx)
|
||||||
|
|
||||||
|
err := req.Send()
|
||||||
|
return output.Content, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetUserData returns the userdata that was configured for the service. If
|
||||||
|
// there is no user-data setup for the EC2 instance a "NotFoundError" error
|
||||||
|
// code will be returned.
|
||||||
|
func (c *EC2Metadata) GetUserData() (string, error) {
|
||||||
|
return c.GetUserDataWithContext(aws.BackgroundContext())
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetUserDataWithContext returns the userdata that was configured for the service. If
|
||||||
|
// there is no user-data setup for the EC2 instance a "NotFoundError" error
|
||||||
|
// code will be returned.
|
||||||
|
func (c *EC2Metadata) GetUserDataWithContext(ctx aws.Context) (string, error) {
|
||||||
|
op := &request.Operation{
|
||||||
|
Name: "GetUserData",
|
||||||
|
HTTPMethod: "GET",
|
||||||
|
HTTPPath: "/latest/user-data",
|
||||||
|
}
|
||||||
|
|
||||||
|
output := &metadataOutput{}
|
||||||
|
req := c.NewRequest(op, nil, output)
|
||||||
|
req.SetContext(ctx)
|
||||||
|
|
||||||
|
err := req.Send()
|
||||||
|
return output.Content, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetDynamicData uses the path provided to request information from the EC2
|
||||||
|
// instance metadata service for dynamic data. The content will be returned
|
||||||
|
// as a string, or error if the request failed.
|
||||||
|
func (c *EC2Metadata) GetDynamicData(p string) (string, error) {
|
||||||
|
return c.GetDynamicDataWithContext(aws.BackgroundContext(), p)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetDynamicDataWithContext uses the path provided to request information from the EC2
|
||||||
|
// instance metadata service for dynamic data. The content will be returned
|
||||||
|
// as a string, or error if the request failed.
|
||||||
|
func (c *EC2Metadata) GetDynamicDataWithContext(ctx aws.Context, p string) (string, error) {
|
||||||
|
op := &request.Operation{
|
||||||
|
Name: "GetDynamicData",
|
||||||
|
HTTPMethod: "GET",
|
||||||
|
HTTPPath: sdkuri.PathJoin("/latest/dynamic", p),
|
||||||
|
}
|
||||||
|
|
||||||
|
output := &metadataOutput{}
|
||||||
|
req := c.NewRequest(op, nil, output)
|
||||||
|
req.SetContext(ctx)
|
||||||
|
|
||||||
|
err := req.Send()
|
||||||
|
return output.Content, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetInstanceIdentityDocument retrieves an identity document describing an
|
||||||
|
// instance. Error is returned if the request fails or is unable to parse
|
||||||
|
// the response.
|
||||||
|
func (c *EC2Metadata) GetInstanceIdentityDocument() (EC2InstanceIdentityDocument, error) {
|
||||||
|
return c.GetInstanceIdentityDocumentWithContext(aws.BackgroundContext())
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetInstanceIdentityDocumentWithContext retrieves an identity document describing an
|
||||||
|
// instance. Error is returned if the request fails or is unable to parse
|
||||||
|
// the response.
|
||||||
|
func (c *EC2Metadata) GetInstanceIdentityDocumentWithContext(ctx aws.Context) (EC2InstanceIdentityDocument, error) {
|
||||||
|
resp, err := c.GetDynamicDataWithContext(ctx, "instance-identity/document")
|
||||||
|
if err != nil {
|
||||||
|
return EC2InstanceIdentityDocument{},
|
||||||
|
awserr.New("EC2MetadataRequestError",
|
||||||
|
"failed to get EC2 instance identity document", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
doc := EC2InstanceIdentityDocument{}
|
||||||
|
if err := json.NewDecoder(strings.NewReader(resp)).Decode(&doc); err != nil {
|
||||||
|
return EC2InstanceIdentityDocument{},
|
||||||
|
awserr.New(request.ErrCodeSerialization,
|
||||||
|
"failed to decode EC2 instance identity document", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return doc, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// IAMInfo retrieves IAM info from the metadata API
|
||||||
|
func (c *EC2Metadata) IAMInfo() (EC2IAMInfo, error) {
|
||||||
|
return c.IAMInfoWithContext(aws.BackgroundContext())
|
||||||
|
}
|
||||||
|
|
||||||
|
// IAMInfoWithContext retrieves IAM info from the metadata API
|
||||||
|
func (c *EC2Metadata) IAMInfoWithContext(ctx aws.Context) (EC2IAMInfo, error) {
|
||||||
|
resp, err := c.GetMetadataWithContext(ctx, "iam/info")
|
||||||
|
if err != nil {
|
||||||
|
return EC2IAMInfo{},
|
||||||
|
awserr.New("EC2MetadataRequestError",
|
||||||
|
"failed to get EC2 IAM info", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
info := EC2IAMInfo{}
|
||||||
|
if err := json.NewDecoder(strings.NewReader(resp)).Decode(&info); err != nil {
|
||||||
|
return EC2IAMInfo{},
|
||||||
|
awserr.New(request.ErrCodeSerialization,
|
||||||
|
"failed to decode EC2 IAM info", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if info.Code != "Success" {
|
||||||
|
errMsg := fmt.Sprintf("failed to get EC2 IAM Info (%s)", info.Code)
|
||||||
|
return EC2IAMInfo{},
|
||||||
|
awserr.New("EC2MetadataError", errMsg, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
return info, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Region returns the region the instance is running in.
|
||||||
|
func (c *EC2Metadata) Region() (string, error) {
|
||||||
|
return c.RegionWithContext(aws.BackgroundContext())
|
||||||
|
}
|
||||||
|
|
||||||
|
// RegionWithContext returns the region the instance is running in.
|
||||||
|
func (c *EC2Metadata) RegionWithContext(ctx aws.Context) (string, error) {
|
||||||
|
ec2InstanceIdentityDocument, err := c.GetInstanceIdentityDocumentWithContext(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
// extract region from the ec2InstanceIdentityDocument
|
||||||
|
region := ec2InstanceIdentityDocument.Region
|
||||||
|
if len(region) == 0 {
|
||||||
|
return "", awserr.New("EC2MetadataError", "invalid region received for ec2metadata instance", nil)
|
||||||
|
}
|
||||||
|
// returns region
|
||||||
|
return region, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Available returns if the application has access to the EC2 Metadata service.
|
||||||
|
// Can be used to determine if application is running within an EC2 Instance and
|
||||||
|
// the metadata service is available.
|
||||||
|
func (c *EC2Metadata) Available() bool {
|
||||||
|
return c.AvailableWithContext(aws.BackgroundContext())
|
||||||
|
}
|
||||||
|
|
||||||
|
// AvailableWithContext returns if the application has access to the EC2 Metadata service.
|
||||||
|
// Can be used to determine if application is running within an EC2 Instance and
|
||||||
|
// the metadata service is available.
|
||||||
|
func (c *EC2Metadata) AvailableWithContext(ctx aws.Context) bool {
|
||||||
|
if _, err := c.GetMetadataWithContext(ctx, "instance-id"); err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// An EC2IAMInfo provides the shape for unmarshaling
|
||||||
|
// an IAM info from the metadata API
|
||||||
|
type EC2IAMInfo struct {
|
||||||
|
Code string
|
||||||
|
LastUpdated time.Time
|
||||||
|
InstanceProfileArn string
|
||||||
|
InstanceProfileID string
|
||||||
|
}
|
||||||
|
|
||||||
|
// An EC2InstanceIdentityDocument provides the shape for unmarshaling
|
||||||
|
// an instance identity document
|
||||||
|
type EC2InstanceIdentityDocument struct {
|
||||||
|
DevpayProductCodes []string `json:"devpayProductCodes"`
|
||||||
|
MarketplaceProductCodes []string `json:"marketplaceProductCodes"`
|
||||||
|
AvailabilityZone string `json:"availabilityZone"`
|
||||||
|
PrivateIP string `json:"privateIp"`
|
||||||
|
Version string `json:"version"`
|
||||||
|
Region string `json:"region"`
|
||||||
|
InstanceID string `json:"instanceId"`
|
||||||
|
BillingProducts []string `json:"billingProducts"`
|
||||||
|
InstanceType string `json:"instanceType"`
|
||||||
|
AccountID string `json:"accountId"`
|
||||||
|
PendingTime time.Time `json:"pendingTime"`
|
||||||
|
ImageID string `json:"imageId"`
|
||||||
|
KernelID string `json:"kernelId"`
|
||||||
|
RamdiskID string `json:"ramdiskId"`
|
||||||
|
Architecture string `json:"architecture"`
|
||||||
|
}
|
245
vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/service.go
generated
vendored
Normal file
245
vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/service.go
generated
vendored
Normal file
@ -0,0 +1,245 @@
|
|||||||
|
// Package ec2metadata provides the client for making API calls to the
|
||||||
|
// EC2 Metadata service.
|
||||||
|
//
|
||||||
|
// This package's client can be disabled completely by setting the environment
|
||||||
|
// variable "AWS_EC2_METADATA_DISABLED=true". This environment variable set to
|
||||||
|
// true instructs the SDK to disable the EC2 Metadata client. The client cannot
|
||||||
|
// be used while the environment variable is set to true, (case insensitive).
|
||||||
|
//
|
||||||
|
// The endpoint of the EC2 IMDS client can be configured via the environment
|
||||||
|
// variable, AWS_EC2_METADATA_SERVICE_ENDPOINT when creating the client with a
|
||||||
|
// Session. See aws/session#Options.EC2IMDSEndpoint for more details.
|
||||||
|
package ec2metadata
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"errors"
|
||||||
|
"io"
|
||||||
|
"net/http"
|
||||||
|
"net/url"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/client"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/client/metadata"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/corehandlers"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/request"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// ServiceName is the name of the service.
|
||||||
|
ServiceName = "ec2metadata"
|
||||||
|
disableServiceEnvVar = "AWS_EC2_METADATA_DISABLED"
|
||||||
|
|
||||||
|
// Headers for Token and TTL
|
||||||
|
ttlHeader = "x-aws-ec2-metadata-token-ttl-seconds"
|
||||||
|
tokenHeader = "x-aws-ec2-metadata-token"
|
||||||
|
|
||||||
|
// Named Handler constants
|
||||||
|
fetchTokenHandlerName = "FetchTokenHandler"
|
||||||
|
unmarshalMetadataHandlerName = "unmarshalMetadataHandler"
|
||||||
|
unmarshalTokenHandlerName = "unmarshalTokenHandler"
|
||||||
|
enableTokenProviderHandlerName = "enableTokenProviderHandler"
|
||||||
|
|
||||||
|
// TTL constants
|
||||||
|
defaultTTL = 21600 * time.Second
|
||||||
|
ttlExpirationWindow = 30 * time.Second
|
||||||
|
)
|
||||||
|
|
||||||
|
// A EC2Metadata is an EC2 Metadata service Client.
|
||||||
|
type EC2Metadata struct {
|
||||||
|
*client.Client
|
||||||
|
}
|
||||||
|
|
||||||
|
// New creates a new instance of the EC2Metadata client with a session.
|
||||||
|
// This client is safe to use across multiple goroutines.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Example:
|
||||||
|
// // Create a EC2Metadata client from just a session.
|
||||||
|
// svc := ec2metadata.New(mySession)
|
||||||
|
//
|
||||||
|
// // Create a EC2Metadata client with additional configuration
|
||||||
|
// svc := ec2metadata.New(mySession, aws.NewConfig().WithLogLevel(aws.LogDebugHTTPBody))
|
||||||
|
func New(p client.ConfigProvider, cfgs ...*aws.Config) *EC2Metadata {
|
||||||
|
c := p.ClientConfig(ServiceName, cfgs...)
|
||||||
|
return NewClient(*c.Config, c.Handlers, c.Endpoint, c.SigningRegion)
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewClient returns a new EC2Metadata client. Should be used to create
|
||||||
|
// a client when not using a session. Generally using just New with a session
|
||||||
|
// is preferred.
|
||||||
|
//
|
||||||
|
// Will remove the URL path from the endpoint provided to ensure the EC2 IMDS
|
||||||
|
// client is able to communicate with the EC2 IMDS API.
|
||||||
|
//
|
||||||
|
// If an unmodified HTTP client is provided from the stdlib default, or no client
|
||||||
|
// the EC2RoleProvider's EC2Metadata HTTP client's timeout will be shortened.
|
||||||
|
// To disable this set Config.EC2MetadataDisableTimeoutOverride to false. Enabled by default.
|
||||||
|
func NewClient(cfg aws.Config, handlers request.Handlers, endpoint, signingRegion string, opts ...func(*client.Client)) *EC2Metadata {
|
||||||
|
if !aws.BoolValue(cfg.EC2MetadataDisableTimeoutOverride) && httpClientZero(cfg.HTTPClient) {
|
||||||
|
// If the http client is unmodified and this feature is not disabled
|
||||||
|
// set custom timeouts for EC2Metadata requests.
|
||||||
|
cfg.HTTPClient = &http.Client{
|
||||||
|
// use a shorter timeout than default because the metadata
|
||||||
|
// service is local if it is running, and to fail faster
|
||||||
|
// if not running on an ec2 instance.
|
||||||
|
Timeout: 1 * time.Second,
|
||||||
|
}
|
||||||
|
// max number of retries on the client operation
|
||||||
|
cfg.MaxRetries = aws.Int(2)
|
||||||
|
}
|
||||||
|
|
||||||
|
if u, err := url.Parse(endpoint); err == nil {
|
||||||
|
// Remove path from the endpoint since it will be added by requests.
|
||||||
|
// This is an artifact of the SDK adding `/latest` to the endpoint for
|
||||||
|
// EC2 IMDS, but this is now moved to the operation definition.
|
||||||
|
u.Path = ""
|
||||||
|
u.RawPath = ""
|
||||||
|
endpoint = u.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
svc := &EC2Metadata{
|
||||||
|
Client: client.New(
|
||||||
|
cfg,
|
||||||
|
metadata.ClientInfo{
|
||||||
|
ServiceName: ServiceName,
|
||||||
|
ServiceID: ServiceName,
|
||||||
|
Endpoint: endpoint,
|
||||||
|
APIVersion: "latest",
|
||||||
|
},
|
||||||
|
handlers,
|
||||||
|
),
|
||||||
|
}
|
||||||
|
|
||||||
|
// token provider instance
|
||||||
|
tp := newTokenProvider(svc, defaultTTL)
|
||||||
|
|
||||||
|
// NamedHandler for fetching token
|
||||||
|
svc.Handlers.Sign.PushBackNamed(request.NamedHandler{
|
||||||
|
Name: fetchTokenHandlerName,
|
||||||
|
Fn: tp.fetchTokenHandler,
|
||||||
|
})
|
||||||
|
// NamedHandler for enabling token provider
|
||||||
|
svc.Handlers.Complete.PushBackNamed(request.NamedHandler{
|
||||||
|
Name: enableTokenProviderHandlerName,
|
||||||
|
Fn: tp.enableTokenProviderHandler,
|
||||||
|
})
|
||||||
|
|
||||||
|
svc.Handlers.Unmarshal.PushBackNamed(unmarshalHandler)
|
||||||
|
svc.Handlers.UnmarshalError.PushBack(unmarshalError)
|
||||||
|
svc.Handlers.Validate.Clear()
|
||||||
|
svc.Handlers.Validate.PushBack(validateEndpointHandler)
|
||||||
|
|
||||||
|
// Disable the EC2 Metadata service if the environment variable is set.
|
||||||
|
// This short-circuits the service's functionality to always fail to send
|
||||||
|
// requests.
|
||||||
|
if strings.ToLower(os.Getenv(disableServiceEnvVar)) == "true" {
|
||||||
|
svc.Handlers.Send.SwapNamed(request.NamedHandler{
|
||||||
|
Name: corehandlers.SendHandler.Name,
|
||||||
|
Fn: func(r *request.Request) {
|
||||||
|
r.HTTPResponse = &http.Response{
|
||||||
|
Header: http.Header{},
|
||||||
|
}
|
||||||
|
r.Error = awserr.New(
|
||||||
|
request.CanceledErrorCode,
|
||||||
|
"EC2 IMDS access disabled via "+disableServiceEnvVar+" env var",
|
||||||
|
nil)
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add additional options to the service config
|
||||||
|
for _, option := range opts {
|
||||||
|
option(svc.Client)
|
||||||
|
}
|
||||||
|
return svc
|
||||||
|
}
|
||||||
|
|
||||||
|
func httpClientZero(c *http.Client) bool {
|
||||||
|
return c == nil || (c.Transport == nil && c.CheckRedirect == nil && c.Jar == nil && c.Timeout == 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
type metadataOutput struct {
|
||||||
|
Content string
|
||||||
|
}
|
||||||
|
|
||||||
|
type tokenOutput struct {
|
||||||
|
Token string
|
||||||
|
TTL time.Duration
|
||||||
|
}
|
||||||
|
|
||||||
|
// unmarshal token handler is used to parse the response of a getToken operation
|
||||||
|
var unmarshalTokenHandler = request.NamedHandler{
|
||||||
|
Name: unmarshalTokenHandlerName,
|
||||||
|
Fn: func(r *request.Request) {
|
||||||
|
defer r.HTTPResponse.Body.Close()
|
||||||
|
var b bytes.Buffer
|
||||||
|
if _, err := io.Copy(&b, r.HTTPResponse.Body); err != nil {
|
||||||
|
r.Error = awserr.NewRequestFailure(awserr.New(request.ErrCodeSerialization,
|
||||||
|
"unable to unmarshal EC2 metadata response", err), r.HTTPResponse.StatusCode, r.RequestID)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
v := r.HTTPResponse.Header.Get(ttlHeader)
|
||||||
|
data, ok := r.Data.(*tokenOutput)
|
||||||
|
if !ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
data.Token = b.String()
|
||||||
|
// TTL is in seconds
|
||||||
|
i, err := strconv.ParseInt(v, 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
r.Error = awserr.NewRequestFailure(awserr.New(request.ParamFormatErrCode,
|
||||||
|
"unable to parse EC2 token TTL response", err), r.HTTPResponse.StatusCode, r.RequestID)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
t := time.Duration(i) * time.Second
|
||||||
|
data.TTL = t
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
var unmarshalHandler = request.NamedHandler{
|
||||||
|
Name: unmarshalMetadataHandlerName,
|
||||||
|
Fn: func(r *request.Request) {
|
||||||
|
defer r.HTTPResponse.Body.Close()
|
||||||
|
var b bytes.Buffer
|
||||||
|
if _, err := io.Copy(&b, r.HTTPResponse.Body); err != nil {
|
||||||
|
r.Error = awserr.NewRequestFailure(awserr.New(request.ErrCodeSerialization,
|
||||||
|
"unable to unmarshal EC2 metadata response", err), r.HTTPResponse.StatusCode, r.RequestID)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if data, ok := r.Data.(*metadataOutput); ok {
|
||||||
|
data.Content = b.String()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
func unmarshalError(r *request.Request) {
|
||||||
|
defer r.HTTPResponse.Body.Close()
|
||||||
|
var b bytes.Buffer
|
||||||
|
|
||||||
|
if _, err := io.Copy(&b, r.HTTPResponse.Body); err != nil {
|
||||||
|
r.Error = awserr.NewRequestFailure(
|
||||||
|
awserr.New(request.ErrCodeSerialization, "unable to unmarshal EC2 metadata error response", err),
|
||||||
|
r.HTTPResponse.StatusCode, r.RequestID)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Response body format is not consistent between metadata endpoints.
|
||||||
|
// Grab the error message as a string and include that as the source error
|
||||||
|
r.Error = awserr.NewRequestFailure(awserr.New("EC2MetadataError", "failed to make EC2Metadata request", errors.New(b.String())),
|
||||||
|
r.HTTPResponse.StatusCode, r.RequestID)
|
||||||
|
}
|
||||||
|
|
||||||
|
func validateEndpointHandler(r *request.Request) {
|
||||||
|
if r.ClientInfo.Endpoint == "" {
|
||||||
|
r.Error = aws.ErrMissingEndpoint
|
||||||
|
}
|
||||||
|
}
|
93
vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/token_provider.go
generated
vendored
Normal file
93
vendor/github.com/aws/aws-sdk-go/aws/ec2metadata/token_provider.go
generated
vendored
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
package ec2metadata
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
"sync/atomic"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/credentials"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/request"
|
||||||
|
)
|
||||||
|
|
||||||
|
// A tokenProvider struct provides access to EC2Metadata client
|
||||||
|
// and atomic instance of a token, along with configuredTTL for it.
|
||||||
|
// tokenProvider also provides an atomic flag to disable the
|
||||||
|
// fetch token operation.
|
||||||
|
// The disabled member will use 0 as false, and 1 as true.
|
||||||
|
type tokenProvider struct {
|
||||||
|
client *EC2Metadata
|
||||||
|
token atomic.Value
|
||||||
|
configuredTTL time.Duration
|
||||||
|
disabled uint32
|
||||||
|
}
|
||||||
|
|
||||||
|
// A ec2Token struct helps use of token in EC2 Metadata service ops
|
||||||
|
type ec2Token struct {
|
||||||
|
token string
|
||||||
|
credentials.Expiry
|
||||||
|
}
|
||||||
|
|
||||||
|
// newTokenProvider provides a pointer to a tokenProvider instance
|
||||||
|
func newTokenProvider(c *EC2Metadata, duration time.Duration) *tokenProvider {
|
||||||
|
return &tokenProvider{client: c, configuredTTL: duration}
|
||||||
|
}
|
||||||
|
|
||||||
|
// fetchTokenHandler fetches token for EC2Metadata service client by default.
|
||||||
|
func (t *tokenProvider) fetchTokenHandler(r *request.Request) {
|
||||||
|
|
||||||
|
// short-circuits to insecure data flow if tokenProvider is disabled.
|
||||||
|
if v := atomic.LoadUint32(&t.disabled); v == 1 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if ec2Token, ok := t.token.Load().(ec2Token); ok && !ec2Token.IsExpired() {
|
||||||
|
r.HTTPRequest.Header.Set(tokenHeader, ec2Token.token)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
output, err := t.client.getToken(r.Context(), t.configuredTTL)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
|
||||||
|
// change the disabled flag on token provider to true,
|
||||||
|
// when error is request timeout error.
|
||||||
|
if requestFailureError, ok := err.(awserr.RequestFailure); ok {
|
||||||
|
switch requestFailureError.StatusCode() {
|
||||||
|
case http.StatusForbidden, http.StatusNotFound, http.StatusMethodNotAllowed:
|
||||||
|
atomic.StoreUint32(&t.disabled, 1)
|
||||||
|
case http.StatusBadRequest:
|
||||||
|
r.Error = requestFailureError
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if request timed out while waiting for response
|
||||||
|
if e, ok := requestFailureError.OrigErr().(awserr.Error); ok {
|
||||||
|
if e.Code() == request.ErrCodeRequestError {
|
||||||
|
atomic.StoreUint32(&t.disabled, 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
newToken := ec2Token{
|
||||||
|
token: output.Token,
|
||||||
|
}
|
||||||
|
newToken.SetExpiration(time.Now().Add(output.TTL), ttlExpirationWindow)
|
||||||
|
t.token.Store(newToken)
|
||||||
|
|
||||||
|
// Inject token header to the request.
|
||||||
|
if ec2Token, ok := t.token.Load().(ec2Token); ok {
|
||||||
|
r.HTTPRequest.Header.Set(tokenHeader, ec2Token.token)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// enableTokenProviderHandler enables the token provider
|
||||||
|
func (t *tokenProvider) enableTokenProviderHandler(r *request.Request) {
|
||||||
|
// If the error code status is 401, we enable the token provider
|
||||||
|
if e, ok := r.Error.(awserr.RequestFailure); ok && e != nil &&
|
||||||
|
e.StatusCode() == http.StatusUnauthorized {
|
||||||
|
t.token.Store(ec2Token{})
|
||||||
|
atomic.StoreUint32(&t.disabled, 0)
|
||||||
|
}
|
||||||
|
}
|
921
vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go
generated
vendored
921
vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go
generated
vendored
File diff suppressed because it is too large
Load Diff
290
vendor/github.com/aws/aws-sdk-go/aws/session/credentials.go
generated
vendored
Normal file
290
vendor/github.com/aws/aws-sdk-go/aws/session/credentials.go
generated
vendored
Normal file
@ -0,0 +1,290 @@
|
|||||||
|
package session
|
||||||
|
|
||||||
|
import (
|
||||||
|
"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/credentials"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/credentials/processcreds"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/credentials/ssocreds"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/credentials/stscreds"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/defaults"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/request"
|
||||||
|
"github.com/aws/aws-sdk-go/internal/shareddefaults"
|
||||||
|
)
|
||||||
|
|
||||||
|
func resolveCredentials(cfg *aws.Config,
|
||||||
|
envCfg envConfig, sharedCfg sharedConfig,
|
||||||
|
handlers request.Handlers,
|
||||||
|
sessOpts Options,
|
||||||
|
) (*credentials.Credentials, error) {
|
||||||
|
|
||||||
|
switch {
|
||||||
|
case len(sessOpts.Profile) != 0:
|
||||||
|
// User explicitly provided an Profile in the session's configuration
|
||||||
|
// so load that profile from shared config first.
|
||||||
|
// Github(aws/aws-sdk-go#2727)
|
||||||
|
return resolveCredsFromProfile(cfg, envCfg, sharedCfg, handlers, sessOpts)
|
||||||
|
|
||||||
|
case envCfg.Creds.HasKeys():
|
||||||
|
// Environment credentials
|
||||||
|
return credentials.NewStaticCredentialsFromCreds(envCfg.Creds), nil
|
||||||
|
|
||||||
|
case len(envCfg.WebIdentityTokenFilePath) != 0:
|
||||||
|
// Web identity token from environment, RoleARN required to also be
|
||||||
|
// set.
|
||||||
|
return assumeWebIdentity(cfg, handlers,
|
||||||
|
envCfg.WebIdentityTokenFilePath,
|
||||||
|
envCfg.RoleARN,
|
||||||
|
envCfg.RoleSessionName,
|
||||||
|
)
|
||||||
|
|
||||||
|
default:
|
||||||
|
// Fallback to the "default" credential resolution chain.
|
||||||
|
return resolveCredsFromProfile(cfg, envCfg, sharedCfg, handlers, sessOpts)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WebIdentityEmptyRoleARNErr will occur if 'AWS_WEB_IDENTITY_TOKEN_FILE' was set but
|
||||||
|
// 'AWS_ROLE_ARN' was not set.
|
||||||
|
var WebIdentityEmptyRoleARNErr = awserr.New(stscreds.ErrCodeWebIdentity, "role ARN is not set", nil)
|
||||||
|
|
||||||
|
// WebIdentityEmptyTokenFilePathErr will occur if 'AWS_ROLE_ARN' was set but
|
||||||
|
// 'AWS_WEB_IDENTITY_TOKEN_FILE' was not set.
|
||||||
|
var WebIdentityEmptyTokenFilePathErr = awserr.New(stscreds.ErrCodeWebIdentity, "token file path is not set", nil)
|
||||||
|
|
||||||
|
func assumeWebIdentity(cfg *aws.Config, handlers request.Handlers,
|
||||||
|
filepath string,
|
||||||
|
roleARN, sessionName string,
|
||||||
|
) (*credentials.Credentials, error) {
|
||||||
|
|
||||||
|
if len(filepath) == 0 {
|
||||||
|
return nil, WebIdentityEmptyTokenFilePathErr
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(roleARN) == 0 {
|
||||||
|
return nil, WebIdentityEmptyRoleARNErr
|
||||||
|
}
|
||||||
|
|
||||||
|
creds := stscreds.NewWebIdentityCredentials(
|
||||||
|
&Session{
|
||||||
|
Config: cfg,
|
||||||
|
Handlers: handlers.Copy(),
|
||||||
|
},
|
||||||
|
roleARN,
|
||||||
|
sessionName,
|
||||||
|
filepath,
|
||||||
|
)
|
||||||
|
|
||||||
|
return creds, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func resolveCredsFromProfile(cfg *aws.Config,
|
||||||
|
envCfg envConfig, sharedCfg sharedConfig,
|
||||||
|
handlers request.Handlers,
|
||||||
|
sessOpts Options,
|
||||||
|
) (creds *credentials.Credentials, err error) {
|
||||||
|
|
||||||
|
switch {
|
||||||
|
case sharedCfg.SourceProfile != nil:
|
||||||
|
// Assume IAM role with credentials source from a different profile.
|
||||||
|
creds, err = resolveCredsFromProfile(cfg, envCfg,
|
||||||
|
*sharedCfg.SourceProfile, handlers, sessOpts,
|
||||||
|
)
|
||||||
|
|
||||||
|
case sharedCfg.Creds.HasKeys():
|
||||||
|
// Static Credentials from Shared Config/Credentials file.
|
||||||
|
creds = credentials.NewStaticCredentialsFromCreds(
|
||||||
|
sharedCfg.Creds,
|
||||||
|
)
|
||||||
|
|
||||||
|
case sharedCfg.hasSSOConfiguration():
|
||||||
|
creds, err = resolveSSOCredentials(cfg, sharedCfg, handlers)
|
||||||
|
|
||||||
|
case len(sharedCfg.CredentialProcess) != 0:
|
||||||
|
// Get credentials from CredentialProcess
|
||||||
|
creds = processcreds.NewCredentials(sharedCfg.CredentialProcess)
|
||||||
|
|
||||||
|
case len(sharedCfg.CredentialSource) != 0:
|
||||||
|
creds, err = resolveCredsFromSource(cfg, envCfg,
|
||||||
|
sharedCfg, handlers, sessOpts,
|
||||||
|
)
|
||||||
|
|
||||||
|
case len(sharedCfg.WebIdentityTokenFile) != 0:
|
||||||
|
// Credentials from Assume Web Identity token require an IAM Role, and
|
||||||
|
// that roll will be assumed. May be wrapped with another assume role
|
||||||
|
// via SourceProfile.
|
||||||
|
return assumeWebIdentity(cfg, handlers,
|
||||||
|
sharedCfg.WebIdentityTokenFile,
|
||||||
|
sharedCfg.RoleARN,
|
||||||
|
sharedCfg.RoleSessionName,
|
||||||
|
)
|
||||||
|
|
||||||
|
default:
|
||||||
|
// Fallback to default credentials provider, include mock errors for
|
||||||
|
// the credential chain so user can identify why credentials failed to
|
||||||
|
// be retrieved.
|
||||||
|
creds = credentials.NewCredentials(&credentials.ChainProvider{
|
||||||
|
VerboseErrors: aws.BoolValue(cfg.CredentialsChainVerboseErrors),
|
||||||
|
Providers: []credentials.Provider{
|
||||||
|
&credProviderError{
|
||||||
|
Err: awserr.New("EnvAccessKeyNotFound",
|
||||||
|
"failed to find credentials in the environment.", nil),
|
||||||
|
},
|
||||||
|
&credProviderError{
|
||||||
|
Err: awserr.New("SharedCredsLoad",
|
||||||
|
fmt.Sprintf("failed to load profile, %s.", envCfg.Profile), nil),
|
||||||
|
},
|
||||||
|
defaults.RemoteCredProvider(*cfg, handlers),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(sharedCfg.RoleARN) > 0 {
|
||||||
|
cfgCp := *cfg
|
||||||
|
cfgCp.Credentials = creds
|
||||||
|
return credsFromAssumeRole(cfgCp, handlers, sharedCfg, sessOpts)
|
||||||
|
}
|
||||||
|
|
||||||
|
return creds, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func resolveSSOCredentials(cfg *aws.Config, sharedCfg sharedConfig, handlers request.Handlers) (*credentials.Credentials, error) {
|
||||||
|
if err := sharedCfg.validateSSOConfiguration(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
cfgCopy := cfg.Copy()
|
||||||
|
cfgCopy.Region = &sharedCfg.SSORegion
|
||||||
|
|
||||||
|
return ssocreds.NewCredentials(
|
||||||
|
&Session{
|
||||||
|
Config: cfgCopy,
|
||||||
|
Handlers: handlers.Copy(),
|
||||||
|
},
|
||||||
|
sharedCfg.SSOAccountID,
|
||||||
|
sharedCfg.SSORoleName,
|
||||||
|
sharedCfg.SSOStartURL,
|
||||||
|
), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// valid credential source values
|
||||||
|
const (
|
||||||
|
credSourceEc2Metadata = "Ec2InstanceMetadata"
|
||||||
|
credSourceEnvironment = "Environment"
|
||||||
|
credSourceECSContainer = "EcsContainer"
|
||||||
|
)
|
||||||
|
|
||||||
|
func resolveCredsFromSource(cfg *aws.Config,
|
||||||
|
envCfg envConfig, sharedCfg sharedConfig,
|
||||||
|
handlers request.Handlers,
|
||||||
|
sessOpts Options,
|
||||||
|
) (creds *credentials.Credentials, err error) {
|
||||||
|
|
||||||
|
switch sharedCfg.CredentialSource {
|
||||||
|
case credSourceEc2Metadata:
|
||||||
|
p := defaults.RemoteCredProvider(*cfg, handlers)
|
||||||
|
creds = credentials.NewCredentials(p)
|
||||||
|
|
||||||
|
case credSourceEnvironment:
|
||||||
|
creds = credentials.NewStaticCredentialsFromCreds(envCfg.Creds)
|
||||||
|
|
||||||
|
case credSourceECSContainer:
|
||||||
|
if len(os.Getenv(shareddefaults.ECSCredsProviderEnvVar)) == 0 {
|
||||||
|
return nil, ErrSharedConfigECSContainerEnvVarEmpty
|
||||||
|
}
|
||||||
|
|
||||||
|
p := defaults.RemoteCredProvider(*cfg, handlers)
|
||||||
|
creds = credentials.NewCredentials(p)
|
||||||
|
|
||||||
|
default:
|
||||||
|
return nil, ErrSharedConfigInvalidCredSource
|
||||||
|
}
|
||||||
|
|
||||||
|
return creds, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func credsFromAssumeRole(cfg aws.Config,
|
||||||
|
handlers request.Handlers,
|
||||||
|
sharedCfg sharedConfig,
|
||||||
|
sessOpts Options,
|
||||||
|
) (*credentials.Credentials, error) {
|
||||||
|
|
||||||
|
if len(sharedCfg.MFASerial) != 0 && sessOpts.AssumeRoleTokenProvider == nil {
|
||||||
|
// AssumeRole Token provider is required if doing Assume Role
|
||||||
|
// with MFA.
|
||||||
|
return nil, AssumeRoleTokenProviderNotSetError{}
|
||||||
|
}
|
||||||
|
|
||||||
|
return stscreds.NewCredentials(
|
||||||
|
&Session{
|
||||||
|
Config: &cfg,
|
||||||
|
Handlers: handlers.Copy(),
|
||||||
|
},
|
||||||
|
sharedCfg.RoleARN,
|
||||||
|
func(opt *stscreds.AssumeRoleProvider) {
|
||||||
|
opt.RoleSessionName = sharedCfg.RoleSessionName
|
||||||
|
|
||||||
|
if sessOpts.AssumeRoleDuration == 0 &&
|
||||||
|
sharedCfg.AssumeRoleDuration != nil &&
|
||||||
|
*sharedCfg.AssumeRoleDuration/time.Minute > 15 {
|
||||||
|
opt.Duration = *sharedCfg.AssumeRoleDuration
|
||||||
|
} else if sessOpts.AssumeRoleDuration != 0 {
|
||||||
|
opt.Duration = sessOpts.AssumeRoleDuration
|
||||||
|
}
|
||||||
|
|
||||||
|
// Assume role with external ID
|
||||||
|
if len(sharedCfg.ExternalID) > 0 {
|
||||||
|
opt.ExternalID = aws.String(sharedCfg.ExternalID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Assume role with MFA
|
||||||
|
if len(sharedCfg.MFASerial) > 0 {
|
||||||
|
opt.SerialNumber = aws.String(sharedCfg.MFASerial)
|
||||||
|
opt.TokenProvider = sessOpts.AssumeRoleTokenProvider
|
||||||
|
}
|
||||||
|
},
|
||||||
|
), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// AssumeRoleTokenProviderNotSetError is an error returned when creating a
|
||||||
|
// session when the MFAToken option is not set when shared config is configured
|
||||||
|
// load assume a role with an MFA token.
|
||||||
|
type AssumeRoleTokenProviderNotSetError struct{}
|
||||||
|
|
||||||
|
// Code is the short id of the error.
|
||||||
|
func (e AssumeRoleTokenProviderNotSetError) Code() string {
|
||||||
|
return "AssumeRoleTokenProviderNotSetError"
|
||||||
|
}
|
||||||
|
|
||||||
|
// Message is the description of the error
|
||||||
|
func (e AssumeRoleTokenProviderNotSetError) Message() string {
|
||||||
|
return fmt.Sprintf("assume role with MFA enabled, but AssumeRoleTokenProvider session option not set.")
|
||||||
|
}
|
||||||
|
|
||||||
|
// OrigErr is the underlying error that caused the failure.
|
||||||
|
func (e AssumeRoleTokenProviderNotSetError) OrigErr() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error satisfies the error interface.
|
||||||
|
func (e AssumeRoleTokenProviderNotSetError) Error() string {
|
||||||
|
return awserr.SprintError(e.Code(), e.Message(), "", nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
type credProviderError struct {
|
||||||
|
Err error
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c credProviderError) Retrieve() (credentials.Value, error) {
|
||||||
|
return credentials.Value{}, c.Err
|
||||||
|
}
|
||||||
|
func (c credProviderError) IsExpired() bool {
|
||||||
|
return true
|
||||||
|
}
|
27
vendor/github.com/aws/aws-sdk-go/aws/session/custom_transport.go
generated
vendored
Normal file
27
vendor/github.com/aws/aws-sdk-go/aws/session/custom_transport.go
generated
vendored
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
// +build go1.13
|
||||||
|
|
||||||
|
package session
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net"
|
||||||
|
"net/http"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Transport that should be used when a custom CA bundle is specified with the
|
||||||
|
// SDK.
|
||||||
|
func getCustomTransport() *http.Transport {
|
||||||
|
return &http.Transport{
|
||||||
|
Proxy: http.ProxyFromEnvironment,
|
||||||
|
DialContext: (&net.Dialer{
|
||||||
|
Timeout: 30 * time.Second,
|
||||||
|
KeepAlive: 30 * time.Second,
|
||||||
|
DualStack: true,
|
||||||
|
}).DialContext,
|
||||||
|
ForceAttemptHTTP2: true,
|
||||||
|
MaxIdleConns: 100,
|
||||||
|
IdleConnTimeout: 90 * time.Second,
|
||||||
|
TLSHandshakeTimeout: 10 * time.Second,
|
||||||
|
ExpectContinueTimeout: 1 * time.Second,
|
||||||
|
}
|
||||||
|
}
|
26
vendor/github.com/aws/aws-sdk-go/aws/session/custom_transport_go1.12.go
generated
vendored
Normal file
26
vendor/github.com/aws/aws-sdk-go/aws/session/custom_transport_go1.12.go
generated
vendored
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
// +build !go1.13,go1.7
|
||||||
|
|
||||||
|
package session
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net"
|
||||||
|
"net/http"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Transport that should be used when a custom CA bundle is specified with the
|
||||||
|
// SDK.
|
||||||
|
func getCustomTransport() *http.Transport {
|
||||||
|
return &http.Transport{
|
||||||
|
Proxy: http.ProxyFromEnvironment,
|
||||||
|
DialContext: (&net.Dialer{
|
||||||
|
Timeout: 30 * time.Second,
|
||||||
|
KeepAlive: 30 * time.Second,
|
||||||
|
DualStack: true,
|
||||||
|
}).DialContext,
|
||||||
|
MaxIdleConns: 100,
|
||||||
|
IdleConnTimeout: 90 * time.Second,
|
||||||
|
TLSHandshakeTimeout: 10 * time.Second,
|
||||||
|
ExpectContinueTimeout: 1 * time.Second,
|
||||||
|
}
|
||||||
|
}
|
22
vendor/github.com/aws/aws-sdk-go/aws/session/custom_transport_go1.5.go
generated
vendored
Normal file
22
vendor/github.com/aws/aws-sdk-go/aws/session/custom_transport_go1.5.go
generated
vendored
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
// +build !go1.6,go1.5
|
||||||
|
|
||||||
|
package session
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net"
|
||||||
|
"net/http"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Transport that should be used when a custom CA bundle is specified with the
|
||||||
|
// SDK.
|
||||||
|
func getCustomTransport() *http.Transport {
|
||||||
|
return &http.Transport{
|
||||||
|
Proxy: http.ProxyFromEnvironment,
|
||||||
|
Dial: (&net.Dialer{
|
||||||
|
Timeout: 30 * time.Second,
|
||||||
|
KeepAlive: 30 * time.Second,
|
||||||
|
}).Dial,
|
||||||
|
TLSHandshakeTimeout: 10 * time.Second,
|
||||||
|
}
|
||||||
|
}
|
23
vendor/github.com/aws/aws-sdk-go/aws/session/custom_transport_go1.6.go
generated
vendored
Normal file
23
vendor/github.com/aws/aws-sdk-go/aws/session/custom_transport_go1.6.go
generated
vendored
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
// +build !go1.7,go1.6
|
||||||
|
|
||||||
|
package session
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net"
|
||||||
|
"net/http"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Transport that should be used when a custom CA bundle is specified with the
|
||||||
|
// SDK.
|
||||||
|
func getCustomTransport() *http.Transport {
|
||||||
|
return &http.Transport{
|
||||||
|
Proxy: http.ProxyFromEnvironment,
|
||||||
|
Dial: (&net.Dialer{
|
||||||
|
Timeout: 30 * time.Second,
|
||||||
|
KeepAlive: 30 * time.Second,
|
||||||
|
}).Dial,
|
||||||
|
TLSHandshakeTimeout: 10 * time.Second,
|
||||||
|
ExpectContinueTimeout: 1 * time.Second,
|
||||||
|
}
|
||||||
|
}
|
289
vendor/github.com/aws/aws-sdk-go/aws/session/doc.go
generated
vendored
Normal file
289
vendor/github.com/aws/aws-sdk-go/aws/session/doc.go
generated
vendored
Normal file
@ -0,0 +1,289 @@
|
|||||||
|
/*
|
||||||
|
Package session provides configuration for the SDK's service clients. Sessions
|
||||||
|
can be shared across service clients that share the same base configuration.
|
||||||
|
|
||||||
|
Sessions are safe to use concurrently as long as the Session is not being
|
||||||
|
modified. Sessions should be cached when possible, because creating a new
|
||||||
|
Session will load all configuration values from the environment, and config
|
||||||
|
files each time the Session is created. Sharing the Session value across all of
|
||||||
|
your service clients will ensure the configuration is loaded the fewest number
|
||||||
|
of times possible.
|
||||||
|
|
||||||
|
Sessions options from Shared Config
|
||||||
|
|
||||||
|
By default NewSession will only load credentials from the shared credentials
|
||||||
|
file (~/.aws/credentials). If the AWS_SDK_LOAD_CONFIG environment variable is
|
||||||
|
set to a truthy value the Session will be created from the configuration
|
||||||
|
values from the shared config (~/.aws/config) and shared credentials
|
||||||
|
(~/.aws/credentials) files. Using the NewSessionWithOptions with
|
||||||
|
SharedConfigState set to SharedConfigEnable will create the session as if the
|
||||||
|
AWS_SDK_LOAD_CONFIG environment variable was set.
|
||||||
|
|
||||||
|
Credential and config loading order
|
||||||
|
|
||||||
|
The Session will attempt to load configuration and credentials from the
|
||||||
|
environment, configuration files, and other credential sources. The order
|
||||||
|
configuration is loaded in is:
|
||||||
|
|
||||||
|
* Environment Variables
|
||||||
|
* Shared Credentials file
|
||||||
|
* Shared Configuration file (if SharedConfig is enabled)
|
||||||
|
* EC2 Instance Metadata (credentials only)
|
||||||
|
|
||||||
|
The Environment variables for credentials will have precedence over shared
|
||||||
|
config even if SharedConfig is enabled. To override this behavior, and use
|
||||||
|
shared config credentials instead specify the session.Options.Profile, (e.g.
|
||||||
|
when using credential_source=Environment to assume a role).
|
||||||
|
|
||||||
|
sess, err := session.NewSessionWithOptions(session.Options{
|
||||||
|
Profile: "myProfile",
|
||||||
|
})
|
||||||
|
|
||||||
|
Creating Sessions
|
||||||
|
|
||||||
|
Creating a Session without additional options will load credentials region, and
|
||||||
|
profile loaded from the environment and shared config automatically. See,
|
||||||
|
"Environment Variables" section for information on environment variables used
|
||||||
|
by Session.
|
||||||
|
|
||||||
|
// Create Session
|
||||||
|
sess, err := session.NewSession()
|
||||||
|
|
||||||
|
|
||||||
|
When creating Sessions optional aws.Config values can be passed in that will
|
||||||
|
override the default, or loaded, config values the Session is being created
|
||||||
|
with. This allows you to provide additional, or case based, configuration
|
||||||
|
as needed.
|
||||||
|
|
||||||
|
// Create a Session with a custom region
|
||||||
|
sess, err := session.NewSession(&aws.Config{
|
||||||
|
Region: aws.String("us-west-2"),
|
||||||
|
})
|
||||||
|
|
||||||
|
Use NewSessionWithOptions to provide additional configuration driving how the
|
||||||
|
Session's configuration will be loaded. Such as, specifying shared config
|
||||||
|
profile, or override the shared config state, (AWS_SDK_LOAD_CONFIG).
|
||||||
|
|
||||||
|
// Equivalent to session.NewSession()
|
||||||
|
sess, err := session.NewSessionWithOptions(session.Options{
|
||||||
|
// Options
|
||||||
|
})
|
||||||
|
|
||||||
|
sess, err := session.NewSessionWithOptions(session.Options{
|
||||||
|
// Specify profile to load for the session's config
|
||||||
|
Profile: "profile_name",
|
||||||
|
|
||||||
|
// Provide SDK Config options, such as Region.
|
||||||
|
Config: aws.Config{
|
||||||
|
Region: aws.String("us-west-2"),
|
||||||
|
},
|
||||||
|
|
||||||
|
// Force enable Shared Config support
|
||||||
|
SharedConfigState: session.SharedConfigEnable,
|
||||||
|
})
|
||||||
|
|
||||||
|
Adding Handlers
|
||||||
|
|
||||||
|
You can add handlers to a session to decorate API operation, (e.g. adding HTTP
|
||||||
|
headers). All clients that use the Session receive a copy of the Session's
|
||||||
|
handlers. For example, the following request handler added to the Session logs
|
||||||
|
every requests made.
|
||||||
|
|
||||||
|
// Create a session, and add additional handlers for all service
|
||||||
|
// clients created with the Session to inherit. Adds logging handler.
|
||||||
|
sess := session.Must(session.NewSession())
|
||||||
|
|
||||||
|
sess.Handlers.Send.PushFront(func(r *request.Request) {
|
||||||
|
// Log every request made and its payload
|
||||||
|
logger.Printf("Request: %s/%s, Params: %s",
|
||||||
|
r.ClientInfo.ServiceName, r.Operation, r.Params)
|
||||||
|
})
|
||||||
|
|
||||||
|
Shared Config Fields
|
||||||
|
|
||||||
|
By default the SDK will only load the shared credentials file's
|
||||||
|
(~/.aws/credentials) credentials values, and all other config is provided by
|
||||||
|
the environment variables, SDK defaults, and user provided aws.Config values.
|
||||||
|
|
||||||
|
If the AWS_SDK_LOAD_CONFIG environment variable is set, or SharedConfigEnable
|
||||||
|
option is used to create the Session the full shared config values will be
|
||||||
|
loaded. This includes credentials, region, and support for assume role. In
|
||||||
|
addition the Session will load its configuration from both the shared config
|
||||||
|
file (~/.aws/config) and shared credentials file (~/.aws/credentials). Both
|
||||||
|
files have the same format.
|
||||||
|
|
||||||
|
If both config files are present the configuration from both files will be
|
||||||
|
read. The Session will be created from configuration values from the shared
|
||||||
|
credentials file (~/.aws/credentials) over those in the shared config file
|
||||||
|
(~/.aws/config).
|
||||||
|
|
||||||
|
Credentials are the values the SDK uses to authenticating requests with AWS
|
||||||
|
Services. When specified in a file, both aws_access_key_id and
|
||||||
|
aws_secret_access_key must be provided together in the same file to be
|
||||||
|
considered valid. They will be ignored if both are not present.
|
||||||
|
aws_session_token is an optional field that can be provided in addition to the
|
||||||
|
other two fields.
|
||||||
|
|
||||||
|
aws_access_key_id = AKID
|
||||||
|
aws_secret_access_key = SECRET
|
||||||
|
aws_session_token = TOKEN
|
||||||
|
|
||||||
|
; region only supported if SharedConfigEnabled.
|
||||||
|
region = us-east-1
|
||||||
|
|
||||||
|
Assume Role configuration
|
||||||
|
|
||||||
|
The role_arn field allows you to configure the SDK to assume an IAM role using
|
||||||
|
a set of credentials from another source. Such as when paired with static
|
||||||
|
credentials, "profile_source", "credential_process", or "credential_source"
|
||||||
|
fields. If "role_arn" is provided, a source of credentials must also be
|
||||||
|
specified, such as "source_profile", "credential_source", or
|
||||||
|
"credential_process".
|
||||||
|
|
||||||
|
role_arn = arn:aws:iam::<account_number>:role/<role_name>
|
||||||
|
source_profile = profile_with_creds
|
||||||
|
external_id = 1234
|
||||||
|
mfa_serial = <serial or mfa arn>
|
||||||
|
role_session_name = session_name
|
||||||
|
|
||||||
|
|
||||||
|
The SDK supports assuming a role with MFA token. If "mfa_serial" is set, you
|
||||||
|
must also set the Session Option.AssumeRoleTokenProvider. The Session will fail
|
||||||
|
to load if the AssumeRoleTokenProvider is not specified.
|
||||||
|
|
||||||
|
sess := session.Must(session.NewSessionWithOptions(session.Options{
|
||||||
|
AssumeRoleTokenProvider: stscreds.StdinTokenProvider,
|
||||||
|
}))
|
||||||
|
|
||||||
|
To setup Assume Role outside of a session see the stscreds.AssumeRoleProvider
|
||||||
|
documentation.
|
||||||
|
|
||||||
|
Environment Variables
|
||||||
|
|
||||||
|
When a Session is created several environment variables can be set to adjust
|
||||||
|
how the SDK functions, and what configuration data it loads when creating
|
||||||
|
Sessions. All environment values are optional, but some values like credentials
|
||||||
|
require multiple of the values to set or the partial values will be ignored.
|
||||||
|
All environment variable values are strings unless otherwise noted.
|
||||||
|
|
||||||
|
Environment configuration values. If set both Access Key ID and Secret Access
|
||||||
|
Key must be provided. Session Token and optionally also be provided, but is
|
||||||
|
not required.
|
||||||
|
|
||||||
|
# Access Key ID
|
||||||
|
AWS_ACCESS_KEY_ID=AKID
|
||||||
|
AWS_ACCESS_KEY=AKID # only read if AWS_ACCESS_KEY_ID is not set.
|
||||||
|
|
||||||
|
# Secret Access Key
|
||||||
|
AWS_SECRET_ACCESS_KEY=SECRET
|
||||||
|
AWS_SECRET_KEY=SECRET=SECRET # only read if AWS_SECRET_ACCESS_KEY is not set.
|
||||||
|
|
||||||
|
# Session Token
|
||||||
|
AWS_SESSION_TOKEN=TOKEN
|
||||||
|
|
||||||
|
Region value will instruct the SDK where to make service API requests to. If is
|
||||||
|
not provided in the environment the region must be provided before a service
|
||||||
|
client request is made.
|
||||||
|
|
||||||
|
AWS_REGION=us-east-1
|
||||||
|
|
||||||
|
# AWS_DEFAULT_REGION is only read if AWS_SDK_LOAD_CONFIG is also set,
|
||||||
|
# and AWS_REGION is not also set.
|
||||||
|
AWS_DEFAULT_REGION=us-east-1
|
||||||
|
|
||||||
|
Profile name the SDK should load use when loading shared config from the
|
||||||
|
configuration files. If not provided "default" will be used as the profile name.
|
||||||
|
|
||||||
|
AWS_PROFILE=my_profile
|
||||||
|
|
||||||
|
# AWS_DEFAULT_PROFILE is only read if AWS_SDK_LOAD_CONFIG is also set,
|
||||||
|
# and AWS_PROFILE is not also set.
|
||||||
|
AWS_DEFAULT_PROFILE=my_profile
|
||||||
|
|
||||||
|
SDK load config instructs the SDK to load the shared config in addition to
|
||||||
|
shared credentials. This also expands the configuration loaded so the shared
|
||||||
|
credentials will have parity with the shared config file. This also enables
|
||||||
|
Region and Profile support for the AWS_DEFAULT_REGION and AWS_DEFAULT_PROFILE
|
||||||
|
env values as well.
|
||||||
|
|
||||||
|
AWS_SDK_LOAD_CONFIG=1
|
||||||
|
|
||||||
|
Custom Shared Config and Credential Files
|
||||||
|
|
||||||
|
Shared credentials file path can be set to instruct the SDK to use an alternative
|
||||||
|
file for the shared credentials. If not set the file will be loaded from
|
||||||
|
$HOME/.aws/credentials on Linux/Unix based systems, and
|
||||||
|
%USERPROFILE%\.aws\credentials on Windows.
|
||||||
|
|
||||||
|
AWS_SHARED_CREDENTIALS_FILE=$HOME/my_shared_credentials
|
||||||
|
|
||||||
|
Shared config file path can be set to instruct the SDK to use an alternative
|
||||||
|
file for the shared config. If not set the file will be loaded from
|
||||||
|
$HOME/.aws/config on Linux/Unix based systems, and
|
||||||
|
%USERPROFILE%\.aws\config on Windows.
|
||||||
|
|
||||||
|
AWS_CONFIG_FILE=$HOME/my_shared_config
|
||||||
|
|
||||||
|
Custom CA Bundle
|
||||||
|
|
||||||
|
Path to a custom Credentials Authority (CA) bundle PEM file that the SDK
|
||||||
|
will use instead of the default system's root CA bundle. Use this only
|
||||||
|
if you want to replace the CA bundle the SDK uses for TLS requests.
|
||||||
|
|
||||||
|
AWS_CA_BUNDLE=$HOME/my_custom_ca_bundle
|
||||||
|
|
||||||
|
Enabling this option will attempt to merge the Transport into the SDK's HTTP
|
||||||
|
client. If the client's Transport is not a http.Transport an error will be
|
||||||
|
returned. If the Transport's TLS config is set this option will cause the SDK
|
||||||
|
to overwrite the Transport's TLS config's RootCAs value. If the CA bundle file
|
||||||
|
contains multiple certificates all of them will be loaded.
|
||||||
|
|
||||||
|
The Session option CustomCABundle is also available when creating sessions
|
||||||
|
to also enable this feature. CustomCABundle session option field has priority
|
||||||
|
over the AWS_CA_BUNDLE environment variable, and will be used if both are set.
|
||||||
|
|
||||||
|
Setting a custom HTTPClient in the aws.Config options will override this setting.
|
||||||
|
To use this option and custom HTTP client, the HTTP client needs to be provided
|
||||||
|
when creating the session. Not the service client.
|
||||||
|
|
||||||
|
Custom Client TLS Certificate
|
||||||
|
|
||||||
|
The SDK supports the environment and session option being configured with
|
||||||
|
Client TLS certificates that are sent as a part of the client's TLS handshake
|
||||||
|
for client authentication. If used, both Cert and Key values are required. If
|
||||||
|
one is missing, or either fail to load the contents of the file an error will
|
||||||
|
be returned.
|
||||||
|
|
||||||
|
HTTP Client's Transport concrete implementation must be a http.Transport
|
||||||
|
or creating the session will fail.
|
||||||
|
|
||||||
|
AWS_SDK_GO_CLIENT_TLS_KEY=$HOME/my_client_key
|
||||||
|
AWS_SDK_GO_CLIENT_TLS_CERT=$HOME/my_client_cert
|
||||||
|
|
||||||
|
This can also be configured via the session.Options ClientTLSCert and ClientTLSKey.
|
||||||
|
|
||||||
|
sess, err := session.NewSessionWithOptions(session.Options{
|
||||||
|
ClientTLSCert: myCertFile,
|
||||||
|
ClientTLSKey: myKeyFile,
|
||||||
|
})
|
||||||
|
|
||||||
|
Custom EC2 IMDS Endpoint
|
||||||
|
|
||||||
|
The endpoint of the EC2 IMDS client can be configured via the environment
|
||||||
|
variable, AWS_EC2_METADATA_SERVICE_ENDPOINT when creating the client with a
|
||||||
|
Session. See Options.EC2IMDSEndpoint for more details.
|
||||||
|
|
||||||
|
AWS_EC2_METADATA_SERVICE_ENDPOINT=http://169.254.169.254
|
||||||
|
|
||||||
|
If using an URL with an IPv6 address literal, the IPv6 address
|
||||||
|
component must be enclosed in square brackets.
|
||||||
|
|
||||||
|
AWS_EC2_METADATA_SERVICE_ENDPOINT=http://[::1]
|
||||||
|
|
||||||
|
The custom EC2 IMDS endpoint can also be specified via the Session options.
|
||||||
|
|
||||||
|
sess, err := session.NewSessionWithOptions(session.Options{
|
||||||
|
EC2IMDSEndpoint: "http://[::1]",
|
||||||
|
})
|
||||||
|
*/
|
||||||
|
package session
|
378
vendor/github.com/aws/aws-sdk-go/aws/session/env_config.go
generated
vendored
Normal file
378
vendor/github.com/aws/aws-sdk-go/aws/session/env_config.go
generated
vendored
Normal file
@ -0,0 +1,378 @@
|
|||||||
|
package session
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/credentials"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/defaults"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/endpoints"
|
||||||
|
)
|
||||||
|
|
||||||
|
// EnvProviderName provides a name of the provider when config is loaded from environment.
|
||||||
|
const EnvProviderName = "EnvConfigCredentials"
|
||||||
|
|
||||||
|
// envConfig is a collection of environment values the SDK will read
|
||||||
|
// setup config from. All environment values are optional. But some values
|
||||||
|
// such as credentials require multiple values to be complete or the values
|
||||||
|
// will be ignored.
|
||||||
|
type envConfig struct {
|
||||||
|
// Environment configuration values. If set both Access Key ID and Secret Access
|
||||||
|
// Key must be provided. Session Token and optionally also be provided, but is
|
||||||
|
// not required.
|
||||||
|
//
|
||||||
|
// # Access Key ID
|
||||||
|
// AWS_ACCESS_KEY_ID=AKID
|
||||||
|
// AWS_ACCESS_KEY=AKID # only read if AWS_ACCESS_KEY_ID is not set.
|
||||||
|
//
|
||||||
|
// # Secret Access Key
|
||||||
|
// AWS_SECRET_ACCESS_KEY=SECRET
|
||||||
|
// AWS_SECRET_KEY=SECRET=SECRET # only read if AWS_SECRET_ACCESS_KEY is not set.
|
||||||
|
//
|
||||||
|
// # Session Token
|
||||||
|
// AWS_SESSION_TOKEN=TOKEN
|
||||||
|
Creds credentials.Value
|
||||||
|
|
||||||
|
// Region value will instruct the SDK where to make service API requests to. If is
|
||||||
|
// not provided in the environment the region must be provided before a service
|
||||||
|
// client request is made.
|
||||||
|
//
|
||||||
|
// AWS_REGION=us-east-1
|
||||||
|
//
|
||||||
|
// # AWS_DEFAULT_REGION is only read if AWS_SDK_LOAD_CONFIG is also set,
|
||||||
|
// # and AWS_REGION is not also set.
|
||||||
|
// AWS_DEFAULT_REGION=us-east-1
|
||||||
|
Region string
|
||||||
|
|
||||||
|
// Profile name the SDK should load use when loading shared configuration from the
|
||||||
|
// shared configuration files. If not provided "default" will be used as the
|
||||||
|
// profile name.
|
||||||
|
//
|
||||||
|
// AWS_PROFILE=my_profile
|
||||||
|
//
|
||||||
|
// # AWS_DEFAULT_PROFILE is only read if AWS_SDK_LOAD_CONFIG is also set,
|
||||||
|
// # and AWS_PROFILE is not also set.
|
||||||
|
// AWS_DEFAULT_PROFILE=my_profile
|
||||||
|
Profile string
|
||||||
|
|
||||||
|
// SDK load config instructs the SDK to load the shared config in addition to
|
||||||
|
// shared credentials. This also expands the configuration loaded from the shared
|
||||||
|
// credentials to have parity with the shared config file. This also enables
|
||||||
|
// Region and Profile support for the AWS_DEFAULT_REGION and AWS_DEFAULT_PROFILE
|
||||||
|
// env values as well.
|
||||||
|
//
|
||||||
|
// AWS_SDK_LOAD_CONFIG=1
|
||||||
|
EnableSharedConfig bool
|
||||||
|
|
||||||
|
// Shared credentials file path can be set to instruct the SDK to use an alternate
|
||||||
|
// file for the shared credentials. If not set the file will be loaded from
|
||||||
|
// $HOME/.aws/credentials on Linux/Unix based systems, and
|
||||||
|
// %USERPROFILE%\.aws\credentials on Windows.
|
||||||
|
//
|
||||||
|
// AWS_SHARED_CREDENTIALS_FILE=$HOME/my_shared_credentials
|
||||||
|
SharedCredentialsFile string
|
||||||
|
|
||||||
|
// Shared config file path can be set to instruct the SDK to use an alternate
|
||||||
|
// file for the shared config. If not set the file will be loaded from
|
||||||
|
// $HOME/.aws/config on Linux/Unix based systems, and
|
||||||
|
// %USERPROFILE%\.aws\config on Windows.
|
||||||
|
//
|
||||||
|
// AWS_CONFIG_FILE=$HOME/my_shared_config
|
||||||
|
SharedConfigFile string
|
||||||
|
|
||||||
|
// Sets the path to a custom Credentials Authority (CA) Bundle PEM file
|
||||||
|
// that the SDK will use instead of the system's root CA bundle.
|
||||||
|
// Only use this if you want to configure the SDK to use a custom set
|
||||||
|
// of CAs.
|
||||||
|
//
|
||||||
|
// Enabling this option will attempt to merge the Transport
|
||||||
|
// into the SDK's HTTP client. If the client's Transport is
|
||||||
|
// not a http.Transport an error will be returned. If the
|
||||||
|
// Transport's TLS config is set this option will cause the
|
||||||
|
// SDK to overwrite the Transport's TLS config's RootCAs value.
|
||||||
|
//
|
||||||
|
// Setting a custom HTTPClient in the aws.Config options will override this setting.
|
||||||
|
// To use this option and custom HTTP client, the HTTP client needs to be provided
|
||||||
|
// when creating the session. Not the service client.
|
||||||
|
//
|
||||||
|
// AWS_CA_BUNDLE=$HOME/my_custom_ca_bundle
|
||||||
|
CustomCABundle string
|
||||||
|
|
||||||
|
// Sets the TLC client certificate that should be used by the SDK's HTTP transport
|
||||||
|
// when making requests. The certificate must be paired with a TLS client key file.
|
||||||
|
//
|
||||||
|
// AWS_SDK_GO_CLIENT_TLS_CERT=$HOME/my_client_cert
|
||||||
|
ClientTLSCert string
|
||||||
|
|
||||||
|
// Sets the TLC client key that should be used by the SDK's HTTP transport
|
||||||
|
// when making requests. The key must be paired with a TLS client certificate file.
|
||||||
|
//
|
||||||
|
// AWS_SDK_GO_CLIENT_TLS_KEY=$HOME/my_client_key
|
||||||
|
ClientTLSKey string
|
||||||
|
|
||||||
|
csmEnabled string
|
||||||
|
CSMEnabled *bool
|
||||||
|
CSMPort string
|
||||||
|
CSMHost string
|
||||||
|
CSMClientID string
|
||||||
|
|
||||||
|
// Enables endpoint discovery via environment variables.
|
||||||
|
//
|
||||||
|
// AWS_ENABLE_ENDPOINT_DISCOVERY=true
|
||||||
|
EnableEndpointDiscovery *bool
|
||||||
|
enableEndpointDiscovery string
|
||||||
|
|
||||||
|
// Specifies the WebIdentity token the SDK should use to assume a role
|
||||||
|
// with.
|
||||||
|
//
|
||||||
|
// AWS_WEB_IDENTITY_TOKEN_FILE=file_path
|
||||||
|
WebIdentityTokenFilePath string
|
||||||
|
|
||||||
|
// Specifies the IAM role arn to use when assuming an role.
|
||||||
|
//
|
||||||
|
// AWS_ROLE_ARN=role_arn
|
||||||
|
RoleARN string
|
||||||
|
|
||||||
|
// Specifies the IAM role session name to use when assuming a role.
|
||||||
|
//
|
||||||
|
// AWS_ROLE_SESSION_NAME=session_name
|
||||||
|
RoleSessionName string
|
||||||
|
|
||||||
|
// Specifies the STS Regional Endpoint flag for the SDK to resolve the endpoint
|
||||||
|
// for a service.
|
||||||
|
//
|
||||||
|
// AWS_STS_REGIONAL_ENDPOINTS=regional
|
||||||
|
// This can take value as `regional` or `legacy`
|
||||||
|
STSRegionalEndpoint endpoints.STSRegionalEndpoint
|
||||||
|
|
||||||
|
// Specifies the S3 Regional Endpoint flag for the SDK to resolve the
|
||||||
|
// endpoint for a service.
|
||||||
|
//
|
||||||
|
// AWS_S3_US_EAST_1_REGIONAL_ENDPOINT=regional
|
||||||
|
// This can take value as `regional` or `legacy`
|
||||||
|
S3UsEast1RegionalEndpoint endpoints.S3UsEast1RegionalEndpoint
|
||||||
|
|
||||||
|
// Specifies if the S3 service should allow ARNs to direct the region
|
||||||
|
// the client's requests are sent to.
|
||||||
|
//
|
||||||
|
// AWS_S3_USE_ARN_REGION=true
|
||||||
|
S3UseARNRegion bool
|
||||||
|
|
||||||
|
// Specifies the alternative endpoint to use for EC2 IMDS.
|
||||||
|
//
|
||||||
|
// AWS_EC2_METADATA_SERVICE_ENDPOINT=http://[::1]
|
||||||
|
EC2IMDSEndpoint string
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
csmEnabledEnvKey = []string{
|
||||||
|
"AWS_CSM_ENABLED",
|
||||||
|
}
|
||||||
|
csmHostEnvKey = []string{
|
||||||
|
"AWS_CSM_HOST",
|
||||||
|
}
|
||||||
|
csmPortEnvKey = []string{
|
||||||
|
"AWS_CSM_PORT",
|
||||||
|
}
|
||||||
|
csmClientIDEnvKey = []string{
|
||||||
|
"AWS_CSM_CLIENT_ID",
|
||||||
|
}
|
||||||
|
credAccessEnvKey = []string{
|
||||||
|
"AWS_ACCESS_KEY_ID",
|
||||||
|
"AWS_ACCESS_KEY",
|
||||||
|
}
|
||||||
|
credSecretEnvKey = []string{
|
||||||
|
"AWS_SECRET_ACCESS_KEY",
|
||||||
|
"AWS_SECRET_KEY",
|
||||||
|
}
|
||||||
|
credSessionEnvKey = []string{
|
||||||
|
"AWS_SESSION_TOKEN",
|
||||||
|
}
|
||||||
|
|
||||||
|
enableEndpointDiscoveryEnvKey = []string{
|
||||||
|
"AWS_ENABLE_ENDPOINT_DISCOVERY",
|
||||||
|
}
|
||||||
|
|
||||||
|
regionEnvKeys = []string{
|
||||||
|
"AWS_REGION",
|
||||||
|
"AWS_DEFAULT_REGION", // Only read if AWS_SDK_LOAD_CONFIG is also set
|
||||||
|
}
|
||||||
|
profileEnvKeys = []string{
|
||||||
|
"AWS_PROFILE",
|
||||||
|
"AWS_DEFAULT_PROFILE", // Only read if AWS_SDK_LOAD_CONFIG is also set
|
||||||
|
}
|
||||||
|
sharedCredsFileEnvKey = []string{
|
||||||
|
"AWS_SHARED_CREDENTIALS_FILE",
|
||||||
|
}
|
||||||
|
sharedConfigFileEnvKey = []string{
|
||||||
|
"AWS_CONFIG_FILE",
|
||||||
|
}
|
||||||
|
webIdentityTokenFilePathEnvKey = []string{
|
||||||
|
"AWS_WEB_IDENTITY_TOKEN_FILE",
|
||||||
|
}
|
||||||
|
roleARNEnvKey = []string{
|
||||||
|
"AWS_ROLE_ARN",
|
||||||
|
}
|
||||||
|
roleSessionNameEnvKey = []string{
|
||||||
|
"AWS_ROLE_SESSION_NAME",
|
||||||
|
}
|
||||||
|
stsRegionalEndpointKey = []string{
|
||||||
|
"AWS_STS_REGIONAL_ENDPOINTS",
|
||||||
|
}
|
||||||
|
s3UsEast1RegionalEndpoint = []string{
|
||||||
|
"AWS_S3_US_EAST_1_REGIONAL_ENDPOINT",
|
||||||
|
}
|
||||||
|
s3UseARNRegionEnvKey = []string{
|
||||||
|
"AWS_S3_USE_ARN_REGION",
|
||||||
|
}
|
||||||
|
ec2IMDSEndpointEnvKey = []string{
|
||||||
|
"AWS_EC2_METADATA_SERVICE_ENDPOINT",
|
||||||
|
}
|
||||||
|
useCABundleKey = []string{
|
||||||
|
"AWS_CA_BUNDLE",
|
||||||
|
}
|
||||||
|
useClientTLSCert = []string{
|
||||||
|
"AWS_SDK_GO_CLIENT_TLS_CERT",
|
||||||
|
}
|
||||||
|
useClientTLSKey = []string{
|
||||||
|
"AWS_SDK_GO_CLIENT_TLS_KEY",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
// loadEnvConfig retrieves the SDK's environment configuration.
|
||||||
|
// See `envConfig` for the values that will be retrieved.
|
||||||
|
//
|
||||||
|
// If the environment variable `AWS_SDK_LOAD_CONFIG` is set to a truthy value
|
||||||
|
// the shared SDK config will be loaded in addition to the SDK's specific
|
||||||
|
// configuration values.
|
||||||
|
func loadEnvConfig() (envConfig, error) {
|
||||||
|
enableSharedConfig, _ := strconv.ParseBool(os.Getenv("AWS_SDK_LOAD_CONFIG"))
|
||||||
|
return envConfigLoad(enableSharedConfig)
|
||||||
|
}
|
||||||
|
|
||||||
|
// loadEnvSharedConfig retrieves the SDK's environment configuration, and the
|
||||||
|
// SDK shared config. See `envConfig` for the values that will be retrieved.
|
||||||
|
//
|
||||||
|
// Loads the shared configuration in addition to the SDK's specific configuration.
|
||||||
|
// This will load the same values as `loadEnvConfig` if the `AWS_SDK_LOAD_CONFIG`
|
||||||
|
// environment variable is set.
|
||||||
|
func loadSharedEnvConfig() (envConfig, error) {
|
||||||
|
return envConfigLoad(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
func envConfigLoad(enableSharedConfig bool) (envConfig, error) {
|
||||||
|
cfg := envConfig{}
|
||||||
|
|
||||||
|
cfg.EnableSharedConfig = enableSharedConfig
|
||||||
|
|
||||||
|
// Static environment credentials
|
||||||
|
var creds credentials.Value
|
||||||
|
setFromEnvVal(&creds.AccessKeyID, credAccessEnvKey)
|
||||||
|
setFromEnvVal(&creds.SecretAccessKey, credSecretEnvKey)
|
||||||
|
setFromEnvVal(&creds.SessionToken, credSessionEnvKey)
|
||||||
|
if creds.HasKeys() {
|
||||||
|
// Require logical grouping of credentials
|
||||||
|
creds.ProviderName = EnvProviderName
|
||||||
|
cfg.Creds = creds
|
||||||
|
}
|
||||||
|
|
||||||
|
// Role Metadata
|
||||||
|
setFromEnvVal(&cfg.RoleARN, roleARNEnvKey)
|
||||||
|
setFromEnvVal(&cfg.RoleSessionName, roleSessionNameEnvKey)
|
||||||
|
|
||||||
|
// Web identity environment variables
|
||||||
|
setFromEnvVal(&cfg.WebIdentityTokenFilePath, webIdentityTokenFilePathEnvKey)
|
||||||
|
|
||||||
|
// CSM environment variables
|
||||||
|
setFromEnvVal(&cfg.csmEnabled, csmEnabledEnvKey)
|
||||||
|
setFromEnvVal(&cfg.CSMHost, csmHostEnvKey)
|
||||||
|
setFromEnvVal(&cfg.CSMPort, csmPortEnvKey)
|
||||||
|
setFromEnvVal(&cfg.CSMClientID, csmClientIDEnvKey)
|
||||||
|
|
||||||
|
if len(cfg.csmEnabled) != 0 {
|
||||||
|
v, _ := strconv.ParseBool(cfg.csmEnabled)
|
||||||
|
cfg.CSMEnabled = &v
|
||||||
|
}
|
||||||
|
|
||||||
|
regionKeys := regionEnvKeys
|
||||||
|
profileKeys := profileEnvKeys
|
||||||
|
if !cfg.EnableSharedConfig {
|
||||||
|
regionKeys = regionKeys[:1]
|
||||||
|
profileKeys = profileKeys[:1]
|
||||||
|
}
|
||||||
|
|
||||||
|
setFromEnvVal(&cfg.Region, regionKeys)
|
||||||
|
setFromEnvVal(&cfg.Profile, profileKeys)
|
||||||
|
|
||||||
|
// endpoint discovery is in reference to it being enabled.
|
||||||
|
setFromEnvVal(&cfg.enableEndpointDiscovery, enableEndpointDiscoveryEnvKey)
|
||||||
|
if len(cfg.enableEndpointDiscovery) > 0 {
|
||||||
|
cfg.EnableEndpointDiscovery = aws.Bool(cfg.enableEndpointDiscovery != "false")
|
||||||
|
}
|
||||||
|
|
||||||
|
setFromEnvVal(&cfg.SharedCredentialsFile, sharedCredsFileEnvKey)
|
||||||
|
setFromEnvVal(&cfg.SharedConfigFile, sharedConfigFileEnvKey)
|
||||||
|
|
||||||
|
if len(cfg.SharedCredentialsFile) == 0 {
|
||||||
|
cfg.SharedCredentialsFile = defaults.SharedCredentialsFilename()
|
||||||
|
}
|
||||||
|
if len(cfg.SharedConfigFile) == 0 {
|
||||||
|
cfg.SharedConfigFile = defaults.SharedConfigFilename()
|
||||||
|
}
|
||||||
|
|
||||||
|
setFromEnvVal(&cfg.CustomCABundle, useCABundleKey)
|
||||||
|
setFromEnvVal(&cfg.ClientTLSCert, useClientTLSCert)
|
||||||
|
setFromEnvVal(&cfg.ClientTLSKey, useClientTLSKey)
|
||||||
|
|
||||||
|
var err error
|
||||||
|
// STS Regional Endpoint variable
|
||||||
|
for _, k := range stsRegionalEndpointKey {
|
||||||
|
if v := os.Getenv(k); len(v) != 0 {
|
||||||
|
cfg.STSRegionalEndpoint, err = endpoints.GetSTSRegionalEndpoint(v)
|
||||||
|
if err != nil {
|
||||||
|
return cfg, fmt.Errorf("failed to load, %v from env config, %v", k, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// S3 Regional Endpoint variable
|
||||||
|
for _, k := range s3UsEast1RegionalEndpoint {
|
||||||
|
if v := os.Getenv(k); len(v) != 0 {
|
||||||
|
cfg.S3UsEast1RegionalEndpoint, err = endpoints.GetS3UsEast1RegionalEndpoint(v)
|
||||||
|
if err != nil {
|
||||||
|
return cfg, fmt.Errorf("failed to load, %v from env config, %v", k, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var s3UseARNRegion string
|
||||||
|
setFromEnvVal(&s3UseARNRegion, s3UseARNRegionEnvKey)
|
||||||
|
if len(s3UseARNRegion) != 0 {
|
||||||
|
switch {
|
||||||
|
case strings.EqualFold(s3UseARNRegion, "false"):
|
||||||
|
cfg.S3UseARNRegion = false
|
||||||
|
case strings.EqualFold(s3UseARNRegion, "true"):
|
||||||
|
cfg.S3UseARNRegion = true
|
||||||
|
default:
|
||||||
|
return envConfig{}, fmt.Errorf(
|
||||||
|
"invalid value for environment variable, %s=%s, need true or false",
|
||||||
|
s3UseARNRegionEnvKey[0], s3UseARNRegion)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
setFromEnvVal(&cfg.EC2IMDSEndpoint, ec2IMDSEndpointEnvKey)
|
||||||
|
|
||||||
|
return cfg, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func setFromEnvVal(dst *string, keys []string) {
|
||||||
|
for _, k := range keys {
|
||||||
|
if v := os.Getenv(k); len(v) != 0 {
|
||||||
|
*dst = v
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
912
vendor/github.com/aws/aws-sdk-go/aws/session/session.go
generated
vendored
Normal file
912
vendor/github.com/aws/aws-sdk-go/aws/session/session.go
generated
vendored
Normal file
@ -0,0 +1,912 @@
|
|||||||
|
package session
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/tls"
|
||||||
|
"crypto/x509"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/client"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/corehandlers"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/credentials"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/csm"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/defaults"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/endpoints"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/request"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// ErrCodeSharedConfig represents an error that occurs in the shared
|
||||||
|
// configuration logic
|
||||||
|
ErrCodeSharedConfig = "SharedConfigErr"
|
||||||
|
|
||||||
|
// ErrCodeLoadCustomCABundle error code for unable to load custom CA bundle.
|
||||||
|
ErrCodeLoadCustomCABundle = "LoadCustomCABundleError"
|
||||||
|
|
||||||
|
// ErrCodeLoadClientTLSCert error code for unable to load client TLS
|
||||||
|
// certificate or key
|
||||||
|
ErrCodeLoadClientTLSCert = "LoadClientTLSCertError"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ErrSharedConfigSourceCollision will be returned if a section contains both
|
||||||
|
// source_profile and credential_source
|
||||||
|
var ErrSharedConfigSourceCollision = awserr.New(ErrCodeSharedConfig, "only one credential type may be specified per profile: source profile, credential source, credential process, web identity token, or sso", nil)
|
||||||
|
|
||||||
|
// ErrSharedConfigECSContainerEnvVarEmpty will be returned if the environment
|
||||||
|
// variables are empty and Environment was set as the credential source
|
||||||
|
var ErrSharedConfigECSContainerEnvVarEmpty = awserr.New(ErrCodeSharedConfig, "EcsContainer was specified as the credential_source, but 'AWS_CONTAINER_CREDENTIALS_RELATIVE_URI' was not set", nil)
|
||||||
|
|
||||||
|
// ErrSharedConfigInvalidCredSource will be returned if an invalid credential source was provided
|
||||||
|
var ErrSharedConfigInvalidCredSource = awserr.New(ErrCodeSharedConfig, "credential source values must be EcsContainer, Ec2InstanceMetadata, or Environment", nil)
|
||||||
|
|
||||||
|
// A Session provides a central location to create service clients from and
|
||||||
|
// store configurations and request handlers for those services.
|
||||||
|
//
|
||||||
|
// Sessions are safe to create service clients concurrently, but it is not safe
|
||||||
|
// to mutate the Session concurrently.
|
||||||
|
//
|
||||||
|
// The Session satisfies the service client's client.ConfigProvider.
|
||||||
|
type Session struct {
|
||||||
|
Config *aws.Config
|
||||||
|
Handlers request.Handlers
|
||||||
|
|
||||||
|
options Options
|
||||||
|
}
|
||||||
|
|
||||||
|
// New creates a new instance of the handlers merging in the provided configs
|
||||||
|
// on top of the SDK's default configurations. Once the Session is created it
|
||||||
|
// can be mutated to modify the Config or Handlers. The Session is safe to be
|
||||||
|
// read concurrently, but it should not be written to concurrently.
|
||||||
|
//
|
||||||
|
// If the AWS_SDK_LOAD_CONFIG environment is set to a truthy value, the New
|
||||||
|
// method could now encounter an error when loading the configuration. When
|
||||||
|
// The environment variable is set, and an error occurs, New will return a
|
||||||
|
// session that will fail all requests reporting the error that occurred while
|
||||||
|
// loading the session. Use NewSession to get the error when creating the
|
||||||
|
// session.
|
||||||
|
//
|
||||||
|
// If the AWS_SDK_LOAD_CONFIG environment variable is set to a truthy value
|
||||||
|
// the shared config file (~/.aws/config) will also be loaded, in addition to
|
||||||
|
// the shared credentials file (~/.aws/credentials). Values set in both the
|
||||||
|
// shared config, and shared credentials will be taken from the shared
|
||||||
|
// credentials file.
|
||||||
|
//
|
||||||
|
// Deprecated: Use NewSession functions to create sessions instead. NewSession
|
||||||
|
// has the same functionality as New except an error can be returned when the
|
||||||
|
// func is called instead of waiting to receive an error until a request is made.
|
||||||
|
func New(cfgs ...*aws.Config) *Session {
|
||||||
|
// load initial config from environment
|
||||||
|
envCfg, envErr := loadEnvConfig()
|
||||||
|
|
||||||
|
if envCfg.EnableSharedConfig {
|
||||||
|
var cfg aws.Config
|
||||||
|
cfg.MergeIn(cfgs...)
|
||||||
|
s, err := NewSessionWithOptions(Options{
|
||||||
|
Config: cfg,
|
||||||
|
SharedConfigState: SharedConfigEnable,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
// Old session.New expected all errors to be discovered when
|
||||||
|
// a request is made, and would report the errors then. This
|
||||||
|
// needs to be replicated if an error occurs while creating
|
||||||
|
// the session.
|
||||||
|
msg := "failed to create session with AWS_SDK_LOAD_CONFIG enabled. " +
|
||||||
|
"Use session.NewSession to handle errors occurring during session creation."
|
||||||
|
|
||||||
|
// Session creation failed, need to report the error and prevent
|
||||||
|
// any requests from succeeding.
|
||||||
|
s = &Session{Config: defaults.Config()}
|
||||||
|
s.logDeprecatedNewSessionError(msg, err, cfgs)
|
||||||
|
}
|
||||||
|
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
s := deprecatedNewSession(envCfg, cfgs...)
|
||||||
|
if envErr != nil {
|
||||||
|
msg := "failed to load env config"
|
||||||
|
s.logDeprecatedNewSessionError(msg, envErr, cfgs)
|
||||||
|
}
|
||||||
|
|
||||||
|
if csmCfg, err := loadCSMConfig(envCfg, []string{}); err != nil {
|
||||||
|
if l := s.Config.Logger; l != nil {
|
||||||
|
l.Log(fmt.Sprintf("ERROR: failed to load CSM configuration, %v", err))
|
||||||
|
}
|
||||||
|
} else if csmCfg.Enabled {
|
||||||
|
err := enableCSM(&s.Handlers, csmCfg, s.Config.Logger)
|
||||||
|
if err != nil {
|
||||||
|
msg := "failed to enable CSM"
|
||||||
|
s.logDeprecatedNewSessionError(msg, err, cfgs)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewSession returns a new Session created from SDK defaults, config files,
|
||||||
|
// environment, and user provided config files. Once the Session is created
|
||||||
|
// it can be mutated to modify the Config or Handlers. The Session is safe to
|
||||||
|
// be read concurrently, but it should not be written to concurrently.
|
||||||
|
//
|
||||||
|
// If the AWS_SDK_LOAD_CONFIG environment variable is set to a truthy value
|
||||||
|
// the shared config file (~/.aws/config) will also be loaded in addition to
|
||||||
|
// the shared credentials file (~/.aws/credentials). Values set in both the
|
||||||
|
// shared config, and shared credentials will be taken from the shared
|
||||||
|
// credentials file. Enabling the Shared Config will also allow the Session
|
||||||
|
// to be built with retrieving credentials with AssumeRole set in the config.
|
||||||
|
//
|
||||||
|
// See the NewSessionWithOptions func for information on how to override or
|
||||||
|
// control through code how the Session will be created, such as specifying the
|
||||||
|
// config profile, and controlling if shared config is enabled or not.
|
||||||
|
func NewSession(cfgs ...*aws.Config) (*Session, error) {
|
||||||
|
opts := Options{}
|
||||||
|
opts.Config.MergeIn(cfgs...)
|
||||||
|
|
||||||
|
return NewSessionWithOptions(opts)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SharedConfigState provides the ability to optionally override the state
|
||||||
|
// of the session's creation based on the shared config being enabled or
|
||||||
|
// disabled.
|
||||||
|
type SharedConfigState int
|
||||||
|
|
||||||
|
const (
|
||||||
|
// SharedConfigStateFromEnv does not override any state of the
|
||||||
|
// AWS_SDK_LOAD_CONFIG env var. It is the default value of the
|
||||||
|
// SharedConfigState type.
|
||||||
|
SharedConfigStateFromEnv SharedConfigState = iota
|
||||||
|
|
||||||
|
// SharedConfigDisable overrides the AWS_SDK_LOAD_CONFIG env var value
|
||||||
|
// and disables the shared config functionality.
|
||||||
|
SharedConfigDisable
|
||||||
|
|
||||||
|
// SharedConfigEnable overrides the AWS_SDK_LOAD_CONFIG env var value
|
||||||
|
// and enables the shared config functionality.
|
||||||
|
SharedConfigEnable
|
||||||
|
)
|
||||||
|
|
||||||
|
// Options provides the means to control how a Session is created and what
|
||||||
|
// configuration values will be loaded.
|
||||||
|
//
|
||||||
|
type Options struct {
|
||||||
|
// Provides config values for the SDK to use when creating service clients
|
||||||
|
// and making API requests to services. Any value set in with this field
|
||||||
|
// will override the associated value provided by the SDK defaults,
|
||||||
|
// environment or config files where relevant.
|
||||||
|
//
|
||||||
|
// If not set, configuration values from from SDK defaults, environment,
|
||||||
|
// config will be used.
|
||||||
|
Config aws.Config
|
||||||
|
|
||||||
|
// Overrides the config profile the Session should be created from. If not
|
||||||
|
// set the value of the environment variable will be loaded (AWS_PROFILE,
|
||||||
|
// or AWS_DEFAULT_PROFILE if the Shared Config is enabled).
|
||||||
|
//
|
||||||
|
// If not set and environment variables are not set the "default"
|
||||||
|
// (DefaultSharedConfigProfile) will be used as the profile to load the
|
||||||
|
// session config from.
|
||||||
|
Profile string
|
||||||
|
|
||||||
|
// Instructs how the Session will be created based on the AWS_SDK_LOAD_CONFIG
|
||||||
|
// environment variable. By default a Session will be created using the
|
||||||
|
// value provided by the AWS_SDK_LOAD_CONFIG environment variable.
|
||||||
|
//
|
||||||
|
// Setting this value to SharedConfigEnable or SharedConfigDisable
|
||||||
|
// will allow you to override the AWS_SDK_LOAD_CONFIG environment variable
|
||||||
|
// and enable or disable the shared config functionality.
|
||||||
|
SharedConfigState SharedConfigState
|
||||||
|
|
||||||
|
// Ordered list of files the session will load configuration from.
|
||||||
|
// It will override environment variable AWS_SHARED_CREDENTIALS_FILE, AWS_CONFIG_FILE.
|
||||||
|
SharedConfigFiles []string
|
||||||
|
|
||||||
|
// When the SDK's shared config is configured to assume a role with MFA
|
||||||
|
// this option is required in order to provide the mechanism that will
|
||||||
|
// retrieve the MFA token. There is no default value for this field. If
|
||||||
|
// it is not set an error will be returned when creating the session.
|
||||||
|
//
|
||||||
|
// This token provider will be called when ever the assumed role's
|
||||||
|
// credentials need to be refreshed. Within the context of service clients
|
||||||
|
// all sharing the same session the SDK will ensure calls to the token
|
||||||
|
// provider are atomic. When sharing a token provider across multiple
|
||||||
|
// sessions additional synchronization logic is needed to ensure the
|
||||||
|
// token providers do not introduce race conditions. It is recommend to
|
||||||
|
// share the session where possible.
|
||||||
|
//
|
||||||
|
// stscreds.StdinTokenProvider is a basic implementation that will prompt
|
||||||
|
// from stdin for the MFA token code.
|
||||||
|
//
|
||||||
|
// This field is only used if the shared configuration is enabled, and
|
||||||
|
// the config enables assume role wit MFA via the mfa_serial field.
|
||||||
|
AssumeRoleTokenProvider func() (string, error)
|
||||||
|
|
||||||
|
// When the SDK's shared config is configured to assume a role this option
|
||||||
|
// may be provided to set the expiry duration of the STS credentials.
|
||||||
|
// Defaults to 15 minutes if not set as documented in the
|
||||||
|
// stscreds.AssumeRoleProvider.
|
||||||
|
AssumeRoleDuration time.Duration
|
||||||
|
|
||||||
|
// Reader for a custom Credentials Authority (CA) bundle in PEM format that
|
||||||
|
// the SDK will use instead of the default system's root CA bundle. Use this
|
||||||
|
// only if you want to replace the CA bundle the SDK uses for TLS requests.
|
||||||
|
//
|
||||||
|
// HTTP Client's Transport concrete implementation must be a http.Transport
|
||||||
|
// or creating the session will fail.
|
||||||
|
//
|
||||||
|
// If the Transport's TLS config is set this option will cause the SDK
|
||||||
|
// to overwrite the Transport's TLS config's RootCAs value. If the CA
|
||||||
|
// bundle reader contains multiple certificates all of them will be loaded.
|
||||||
|
//
|
||||||
|
// Can also be specified via the environment variable:
|
||||||
|
//
|
||||||
|
// AWS_CA_BUNDLE=$HOME/ca_bundle
|
||||||
|
//
|
||||||
|
// Can also be specified via the shared config field:
|
||||||
|
//
|
||||||
|
// ca_bundle = $HOME/ca_bundle
|
||||||
|
CustomCABundle io.Reader
|
||||||
|
|
||||||
|
// Reader for the TLC client certificate that should be used by the SDK's
|
||||||
|
// HTTP transport when making requests. The certificate must be paired with
|
||||||
|
// a TLS client key file. Will be ignored if both are not provided.
|
||||||
|
//
|
||||||
|
// HTTP Client's Transport concrete implementation must be a http.Transport
|
||||||
|
// or creating the session will fail.
|
||||||
|
//
|
||||||
|
// Can also be specified via the environment variable:
|
||||||
|
//
|
||||||
|
// AWS_SDK_GO_CLIENT_TLS_CERT=$HOME/my_client_cert
|
||||||
|
ClientTLSCert io.Reader
|
||||||
|
|
||||||
|
// Reader for the TLC client key that should be used by the SDK's HTTP
|
||||||
|
// transport when making requests. The key must be paired with a TLS client
|
||||||
|
// certificate file. Will be ignored if both are not provided.
|
||||||
|
//
|
||||||
|
// HTTP Client's Transport concrete implementation must be a http.Transport
|
||||||
|
// or creating the session will fail.
|
||||||
|
//
|
||||||
|
// Can also be specified via the environment variable:
|
||||||
|
//
|
||||||
|
// AWS_SDK_GO_CLIENT_TLS_KEY=$HOME/my_client_key
|
||||||
|
ClientTLSKey io.Reader
|
||||||
|
|
||||||
|
// The handlers that the session and all API clients will be created with.
|
||||||
|
// This must be a complete set of handlers. Use the defaults.Handlers()
|
||||||
|
// function to initialize this value before changing the handlers to be
|
||||||
|
// used by the SDK.
|
||||||
|
Handlers request.Handlers
|
||||||
|
|
||||||
|
// Allows specifying a custom endpoint to be used by the EC2 IMDS client
|
||||||
|
// when making requests to the EC2 IMDS API. The must endpoint value must
|
||||||
|
// include protocol prefix.
|
||||||
|
//
|
||||||
|
// If unset, will the EC2 IMDS client will use its default endpoint.
|
||||||
|
//
|
||||||
|
// Can also be specified via the environment variable,
|
||||||
|
// AWS_EC2_METADATA_SERVICE_ENDPOINT.
|
||||||
|
//
|
||||||
|
// AWS_EC2_METADATA_SERVICE_ENDPOINT=http://169.254.169.254
|
||||||
|
//
|
||||||
|
// If using an URL with an IPv6 address literal, the IPv6 address
|
||||||
|
// component must be enclosed in square brackets.
|
||||||
|
//
|
||||||
|
// AWS_EC2_METADATA_SERVICE_ENDPOINT=http://[::1]
|
||||||
|
EC2IMDSEndpoint string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewSessionWithOptions returns a new Session created from SDK defaults, config files,
|
||||||
|
// environment, and user provided config files. This func uses the Options
|
||||||
|
// values to configure how the Session is created.
|
||||||
|
//
|
||||||
|
// If the AWS_SDK_LOAD_CONFIG environment variable is set to a truthy value
|
||||||
|
// the shared config file (~/.aws/config) will also be loaded in addition to
|
||||||
|
// the shared credentials file (~/.aws/credentials). Values set in both the
|
||||||
|
// shared config, and shared credentials will be taken from the shared
|
||||||
|
// credentials file. Enabling the Shared Config will also allow the Session
|
||||||
|
// to be built with retrieving credentials with AssumeRole set in the config.
|
||||||
|
//
|
||||||
|
// // Equivalent to session.New
|
||||||
|
// sess := session.Must(session.NewSessionWithOptions(session.Options{}))
|
||||||
|
//
|
||||||
|
// // Specify profile to load for the session's config
|
||||||
|
// sess := session.Must(session.NewSessionWithOptions(session.Options{
|
||||||
|
// Profile: "profile_name",
|
||||||
|
// }))
|
||||||
|
//
|
||||||
|
// // Specify profile for config and region for requests
|
||||||
|
// sess := session.Must(session.NewSessionWithOptions(session.Options{
|
||||||
|
// Config: aws.Config{Region: aws.String("us-east-1")},
|
||||||
|
// Profile: "profile_name",
|
||||||
|
// }))
|
||||||
|
//
|
||||||
|
// // Force enable Shared Config support
|
||||||
|
// sess := session.Must(session.NewSessionWithOptions(session.Options{
|
||||||
|
// SharedConfigState: session.SharedConfigEnable,
|
||||||
|
// }))
|
||||||
|
func NewSessionWithOptions(opts Options) (*Session, error) {
|
||||||
|
var envCfg envConfig
|
||||||
|
var err error
|
||||||
|
if opts.SharedConfigState == SharedConfigEnable {
|
||||||
|
envCfg, err = loadSharedEnvConfig()
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to load shared config, %v", err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
envCfg, err = loadEnvConfig()
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("failed to load environment config, %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(opts.Profile) != 0 {
|
||||||
|
envCfg.Profile = opts.Profile
|
||||||
|
}
|
||||||
|
|
||||||
|
switch opts.SharedConfigState {
|
||||||
|
case SharedConfigDisable:
|
||||||
|
envCfg.EnableSharedConfig = false
|
||||||
|
case SharedConfigEnable:
|
||||||
|
envCfg.EnableSharedConfig = true
|
||||||
|
}
|
||||||
|
|
||||||
|
return newSession(opts, envCfg, &opts.Config)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Must is a helper function to ensure the Session is valid and there was no
|
||||||
|
// error when calling a NewSession function.
|
||||||
|
//
|
||||||
|
// This helper is intended to be used in variable initialization to load the
|
||||||
|
// Session and configuration at startup. Such as:
|
||||||
|
//
|
||||||
|
// var sess = session.Must(session.NewSession())
|
||||||
|
func Must(sess *Session, err error) *Session {
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return sess
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wraps the endpoint resolver with a resolver that will return a custom
|
||||||
|
// endpoint for EC2 IMDS.
|
||||||
|
func wrapEC2IMDSEndpoint(resolver endpoints.Resolver, endpoint string) endpoints.Resolver {
|
||||||
|
return endpoints.ResolverFunc(
|
||||||
|
func(service, region string, opts ...func(*endpoints.Options)) (
|
||||||
|
endpoints.ResolvedEndpoint, error,
|
||||||
|
) {
|
||||||
|
if service == ec2MetadataServiceID {
|
||||||
|
return endpoints.ResolvedEndpoint{
|
||||||
|
URL: endpoint,
|
||||||
|
SigningName: ec2MetadataServiceID,
|
||||||
|
SigningRegion: region,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
return resolver.EndpointFor(service, region)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func deprecatedNewSession(envCfg envConfig, cfgs ...*aws.Config) *Session {
|
||||||
|
cfg := defaults.Config()
|
||||||
|
handlers := defaults.Handlers()
|
||||||
|
|
||||||
|
// Apply the passed in configs so the configuration can be applied to the
|
||||||
|
// default credential chain
|
||||||
|
cfg.MergeIn(cfgs...)
|
||||||
|
if cfg.EndpointResolver == nil {
|
||||||
|
// An endpoint resolver is required for a session to be able to provide
|
||||||
|
// endpoints for service client configurations.
|
||||||
|
cfg.EndpointResolver = endpoints.DefaultResolver()
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(envCfg.EC2IMDSEndpoint) != 0 {
|
||||||
|
cfg.EndpointResolver = wrapEC2IMDSEndpoint(cfg.EndpointResolver, envCfg.EC2IMDSEndpoint)
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg.Credentials = defaults.CredChain(cfg, handlers)
|
||||||
|
|
||||||
|
// Reapply any passed in configs to override credentials if set
|
||||||
|
cfg.MergeIn(cfgs...)
|
||||||
|
|
||||||
|
s := &Session{
|
||||||
|
Config: cfg,
|
||||||
|
Handlers: handlers,
|
||||||
|
options: Options{
|
||||||
|
EC2IMDSEndpoint: envCfg.EC2IMDSEndpoint,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
initHandlers(s)
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
func enableCSM(handlers *request.Handlers, cfg csmConfig, logger aws.Logger) error {
|
||||||
|
if logger != nil {
|
||||||
|
logger.Log("Enabling CSM")
|
||||||
|
}
|
||||||
|
|
||||||
|
r, err := csm.Start(cfg.ClientID, csm.AddressWithDefaults(cfg.Host, cfg.Port))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
r.InjectHandlers(handlers)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func newSession(opts Options, envCfg envConfig, cfgs ...*aws.Config) (*Session, error) {
|
||||||
|
cfg := defaults.Config()
|
||||||
|
|
||||||
|
handlers := opts.Handlers
|
||||||
|
if handlers.IsEmpty() {
|
||||||
|
handlers = defaults.Handlers()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get a merged version of the user provided config to determine if
|
||||||
|
// credentials were.
|
||||||
|
userCfg := &aws.Config{}
|
||||||
|
userCfg.MergeIn(cfgs...)
|
||||||
|
cfg.MergeIn(userCfg)
|
||||||
|
|
||||||
|
// Ordered config files will be loaded in with later files overwriting
|
||||||
|
// previous config file values.
|
||||||
|
var cfgFiles []string
|
||||||
|
if opts.SharedConfigFiles != nil {
|
||||||
|
cfgFiles = opts.SharedConfigFiles
|
||||||
|
} else {
|
||||||
|
cfgFiles = []string{envCfg.SharedConfigFile, envCfg.SharedCredentialsFile}
|
||||||
|
if !envCfg.EnableSharedConfig {
|
||||||
|
// The shared config file (~/.aws/config) is only loaded if instructed
|
||||||
|
// to load via the envConfig.EnableSharedConfig (AWS_SDK_LOAD_CONFIG).
|
||||||
|
cfgFiles = cfgFiles[1:]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load additional config from file(s)
|
||||||
|
sharedCfg, err := loadSharedConfig(envCfg.Profile, cfgFiles, envCfg.EnableSharedConfig)
|
||||||
|
if err != nil {
|
||||||
|
if len(envCfg.Profile) == 0 && !envCfg.EnableSharedConfig && (envCfg.Creds.HasKeys() || userCfg.Credentials != nil) {
|
||||||
|
// Special case where the user has not explicitly specified an AWS_PROFILE,
|
||||||
|
// or session.Options.profile, shared config is not enabled, and the
|
||||||
|
// environment has credentials, allow the shared config file to fail to
|
||||||
|
// load since the user has already provided credentials, and nothing else
|
||||||
|
// is required to be read file. Github(aws/aws-sdk-go#2455)
|
||||||
|
} else if _, ok := err.(SharedConfigProfileNotExistsError); !ok {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := mergeConfigSrcs(cfg, userCfg, envCfg, sharedCfg, handlers, opts); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := setTLSOptions(&opts, cfg, envCfg, sharedCfg); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
s := &Session{
|
||||||
|
Config: cfg,
|
||||||
|
Handlers: handlers,
|
||||||
|
options: opts,
|
||||||
|
}
|
||||||
|
|
||||||
|
initHandlers(s)
|
||||||
|
|
||||||
|
if csmCfg, err := loadCSMConfig(envCfg, cfgFiles); err != nil {
|
||||||
|
if l := s.Config.Logger; l != nil {
|
||||||
|
l.Log(fmt.Sprintf("ERROR: failed to load CSM configuration, %v", err))
|
||||||
|
}
|
||||||
|
} else if csmCfg.Enabled {
|
||||||
|
err = enableCSM(&s.Handlers, csmCfg, s.Config.Logger)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return s, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type csmConfig struct {
|
||||||
|
Enabled bool
|
||||||
|
Host string
|
||||||
|
Port string
|
||||||
|
ClientID string
|
||||||
|
}
|
||||||
|
|
||||||
|
var csmProfileName = "aws_csm"
|
||||||
|
|
||||||
|
func loadCSMConfig(envCfg envConfig, cfgFiles []string) (csmConfig, error) {
|
||||||
|
if envCfg.CSMEnabled != nil {
|
||||||
|
if *envCfg.CSMEnabled {
|
||||||
|
return csmConfig{
|
||||||
|
Enabled: true,
|
||||||
|
ClientID: envCfg.CSMClientID,
|
||||||
|
Host: envCfg.CSMHost,
|
||||||
|
Port: envCfg.CSMPort,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
return csmConfig{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
sharedCfg, err := loadSharedConfig(csmProfileName, cfgFiles, false)
|
||||||
|
if err != nil {
|
||||||
|
if _, ok := err.(SharedConfigProfileNotExistsError); !ok {
|
||||||
|
return csmConfig{}, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if sharedCfg.CSMEnabled != nil && *sharedCfg.CSMEnabled == true {
|
||||||
|
return csmConfig{
|
||||||
|
Enabled: true,
|
||||||
|
ClientID: sharedCfg.CSMClientID,
|
||||||
|
Host: sharedCfg.CSMHost,
|
||||||
|
Port: sharedCfg.CSMPort,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return csmConfig{}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func setTLSOptions(opts *Options, cfg *aws.Config, envCfg envConfig, sharedCfg sharedConfig) error {
|
||||||
|
// CA Bundle can be specified in both environment variable shared config file.
|
||||||
|
var caBundleFilename = envCfg.CustomCABundle
|
||||||
|
if len(caBundleFilename) == 0 {
|
||||||
|
caBundleFilename = sharedCfg.CustomCABundle
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only use environment value if session option is not provided.
|
||||||
|
customTLSOptions := map[string]struct {
|
||||||
|
filename string
|
||||||
|
field *io.Reader
|
||||||
|
errCode string
|
||||||
|
}{
|
||||||
|
"custom CA bundle PEM": {filename: caBundleFilename, field: &opts.CustomCABundle, errCode: ErrCodeLoadCustomCABundle},
|
||||||
|
"custom client TLS cert": {filename: envCfg.ClientTLSCert, field: &opts.ClientTLSCert, errCode: ErrCodeLoadClientTLSCert},
|
||||||
|
"custom client TLS key": {filename: envCfg.ClientTLSKey, field: &opts.ClientTLSKey, errCode: ErrCodeLoadClientTLSCert},
|
||||||
|
}
|
||||||
|
for name, v := range customTLSOptions {
|
||||||
|
if len(v.filename) != 0 && *v.field == nil {
|
||||||
|
f, err := os.Open(v.filename)
|
||||||
|
if err != nil {
|
||||||
|
return awserr.New(v.errCode, fmt.Sprintf("failed to open %s file", name), err)
|
||||||
|
}
|
||||||
|
defer f.Close()
|
||||||
|
*v.field = f
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setup HTTP client with custom cert bundle if enabled
|
||||||
|
if opts.CustomCABundle != nil {
|
||||||
|
if err := loadCustomCABundle(cfg.HTTPClient, opts.CustomCABundle); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Setup HTTP client TLS certificate and key for client TLS authentication.
|
||||||
|
if opts.ClientTLSCert != nil && opts.ClientTLSKey != nil {
|
||||||
|
if err := loadClientTLSCert(cfg.HTTPClient, opts.ClientTLSCert, opts.ClientTLSKey); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
} else if opts.ClientTLSCert == nil && opts.ClientTLSKey == nil {
|
||||||
|
// Do nothing if neither values are available.
|
||||||
|
|
||||||
|
} else {
|
||||||
|
return awserr.New(ErrCodeLoadClientTLSCert,
|
||||||
|
fmt.Sprintf("client TLS cert(%t) and key(%t) must both be provided",
|
||||||
|
opts.ClientTLSCert != nil, opts.ClientTLSKey != nil), nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func getHTTPTransport(client *http.Client) (*http.Transport, error) {
|
||||||
|
var t *http.Transport
|
||||||
|
switch v := client.Transport.(type) {
|
||||||
|
case *http.Transport:
|
||||||
|
t = v
|
||||||
|
default:
|
||||||
|
if client.Transport != nil {
|
||||||
|
return nil, fmt.Errorf("unsupported transport, %T", client.Transport)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if t == nil {
|
||||||
|
// Nil transport implies `http.DefaultTransport` should be used. Since
|
||||||
|
// the SDK cannot modify, nor copy the `DefaultTransport` specifying
|
||||||
|
// the values the next closest behavior.
|
||||||
|
t = getCustomTransport()
|
||||||
|
}
|
||||||
|
|
||||||
|
return t, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func loadCustomCABundle(client *http.Client, bundle io.Reader) error {
|
||||||
|
t, err := getHTTPTransport(client)
|
||||||
|
if err != nil {
|
||||||
|
return awserr.New(ErrCodeLoadCustomCABundle,
|
||||||
|
"unable to load custom CA bundle, HTTPClient's transport unsupported type", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
p, err := loadCertPool(bundle)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if t.TLSClientConfig == nil {
|
||||||
|
t.TLSClientConfig = &tls.Config{}
|
||||||
|
}
|
||||||
|
t.TLSClientConfig.RootCAs = p
|
||||||
|
|
||||||
|
client.Transport = t
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func loadCertPool(r io.Reader) (*x509.CertPool, error) {
|
||||||
|
b, err := ioutil.ReadAll(r)
|
||||||
|
if err != nil {
|
||||||
|
return nil, awserr.New(ErrCodeLoadCustomCABundle,
|
||||||
|
"failed to read custom CA bundle PEM file", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
p := x509.NewCertPool()
|
||||||
|
if !p.AppendCertsFromPEM(b) {
|
||||||
|
return nil, awserr.New(ErrCodeLoadCustomCABundle,
|
||||||
|
"failed to load custom CA bundle PEM file", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return p, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func loadClientTLSCert(client *http.Client, certFile, keyFile io.Reader) error {
|
||||||
|
t, err := getHTTPTransport(client)
|
||||||
|
if err != nil {
|
||||||
|
return awserr.New(ErrCodeLoadClientTLSCert,
|
||||||
|
"unable to get usable HTTP transport from client", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
cert, err := ioutil.ReadAll(certFile)
|
||||||
|
if err != nil {
|
||||||
|
return awserr.New(ErrCodeLoadClientTLSCert,
|
||||||
|
"unable to get read client TLS cert file", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
key, err := ioutil.ReadAll(keyFile)
|
||||||
|
if err != nil {
|
||||||
|
return awserr.New(ErrCodeLoadClientTLSCert,
|
||||||
|
"unable to get read client TLS key file", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
clientCert, err := tls.X509KeyPair(cert, key)
|
||||||
|
if err != nil {
|
||||||
|
return awserr.New(ErrCodeLoadClientTLSCert,
|
||||||
|
"unable to load x509 key pair from client cert", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
tlsCfg := t.TLSClientConfig
|
||||||
|
if tlsCfg == nil {
|
||||||
|
tlsCfg = &tls.Config{}
|
||||||
|
}
|
||||||
|
|
||||||
|
tlsCfg.Certificates = append(tlsCfg.Certificates, clientCert)
|
||||||
|
|
||||||
|
t.TLSClientConfig = tlsCfg
|
||||||
|
client.Transport = t
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func mergeConfigSrcs(cfg, userCfg *aws.Config,
|
||||||
|
envCfg envConfig, sharedCfg sharedConfig,
|
||||||
|
handlers request.Handlers,
|
||||||
|
sessOpts Options,
|
||||||
|
) error {
|
||||||
|
|
||||||
|
// Region if not already set by user
|
||||||
|
if len(aws.StringValue(cfg.Region)) == 0 {
|
||||||
|
if len(envCfg.Region) > 0 {
|
||||||
|
cfg.WithRegion(envCfg.Region)
|
||||||
|
} else if envCfg.EnableSharedConfig && len(sharedCfg.Region) > 0 {
|
||||||
|
cfg.WithRegion(sharedCfg.Region)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if cfg.EnableEndpointDiscovery == nil {
|
||||||
|
if envCfg.EnableEndpointDiscovery != nil {
|
||||||
|
cfg.WithEndpointDiscovery(*envCfg.EnableEndpointDiscovery)
|
||||||
|
} else if envCfg.EnableSharedConfig && sharedCfg.EnableEndpointDiscovery != nil {
|
||||||
|
cfg.WithEndpointDiscovery(*sharedCfg.EnableEndpointDiscovery)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Regional Endpoint flag for STS endpoint resolving
|
||||||
|
mergeSTSRegionalEndpointConfig(cfg, []endpoints.STSRegionalEndpoint{
|
||||||
|
userCfg.STSRegionalEndpoint,
|
||||||
|
envCfg.STSRegionalEndpoint,
|
||||||
|
sharedCfg.STSRegionalEndpoint,
|
||||||
|
endpoints.LegacySTSEndpoint,
|
||||||
|
})
|
||||||
|
|
||||||
|
// Regional Endpoint flag for S3 endpoint resolving
|
||||||
|
mergeS3UsEast1RegionalEndpointConfig(cfg, []endpoints.S3UsEast1RegionalEndpoint{
|
||||||
|
userCfg.S3UsEast1RegionalEndpoint,
|
||||||
|
envCfg.S3UsEast1RegionalEndpoint,
|
||||||
|
sharedCfg.S3UsEast1RegionalEndpoint,
|
||||||
|
endpoints.LegacyS3UsEast1Endpoint,
|
||||||
|
})
|
||||||
|
|
||||||
|
ec2IMDSEndpoint := sessOpts.EC2IMDSEndpoint
|
||||||
|
if len(ec2IMDSEndpoint) == 0 {
|
||||||
|
ec2IMDSEndpoint = envCfg.EC2IMDSEndpoint
|
||||||
|
}
|
||||||
|
if len(ec2IMDSEndpoint) != 0 {
|
||||||
|
cfg.EndpointResolver = wrapEC2IMDSEndpoint(cfg.EndpointResolver, ec2IMDSEndpoint)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Configure credentials if not already set by the user when creating the
|
||||||
|
// Session.
|
||||||
|
if cfg.Credentials == credentials.AnonymousCredentials && userCfg.Credentials == nil {
|
||||||
|
creds, err := resolveCredentials(cfg, envCfg, sharedCfg, handlers, sessOpts)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
cfg.Credentials = creds
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg.S3UseARNRegion = userCfg.S3UseARNRegion
|
||||||
|
if cfg.S3UseARNRegion == nil {
|
||||||
|
cfg.S3UseARNRegion = &envCfg.S3UseARNRegion
|
||||||
|
}
|
||||||
|
if cfg.S3UseARNRegion == nil {
|
||||||
|
cfg.S3UseARNRegion = &sharedCfg.S3UseARNRegion
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func mergeSTSRegionalEndpointConfig(cfg *aws.Config, values []endpoints.STSRegionalEndpoint) {
|
||||||
|
for _, v := range values {
|
||||||
|
if v != endpoints.UnsetSTSEndpoint {
|
||||||
|
cfg.STSRegionalEndpoint = v
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func mergeS3UsEast1RegionalEndpointConfig(cfg *aws.Config, values []endpoints.S3UsEast1RegionalEndpoint) {
|
||||||
|
for _, v := range values {
|
||||||
|
if v != endpoints.UnsetS3UsEast1Endpoint {
|
||||||
|
cfg.S3UsEast1RegionalEndpoint = v
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func initHandlers(s *Session) {
|
||||||
|
// Add the Validate parameter handler if it is not disabled.
|
||||||
|
s.Handlers.Validate.Remove(corehandlers.ValidateParametersHandler)
|
||||||
|
if !aws.BoolValue(s.Config.DisableParamValidation) {
|
||||||
|
s.Handlers.Validate.PushBackNamed(corehandlers.ValidateParametersHandler)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Copy creates and returns a copy of the current Session, copying the config
|
||||||
|
// and handlers. If any additional configs are provided they will be merged
|
||||||
|
// on top of the Session's copied config.
|
||||||
|
//
|
||||||
|
// // Create a copy of the current Session, configured for the us-west-2 region.
|
||||||
|
// sess.Copy(&aws.Config{Region: aws.String("us-west-2")})
|
||||||
|
func (s *Session) Copy(cfgs ...*aws.Config) *Session {
|
||||||
|
newSession := &Session{
|
||||||
|
Config: s.Config.Copy(cfgs...),
|
||||||
|
Handlers: s.Handlers.Copy(),
|
||||||
|
options: s.options,
|
||||||
|
}
|
||||||
|
|
||||||
|
initHandlers(newSession)
|
||||||
|
|
||||||
|
return newSession
|
||||||
|
}
|
||||||
|
|
||||||
|
// ClientConfig satisfies the client.ConfigProvider interface and is used to
|
||||||
|
// configure the service client instances. Passing the Session to the service
|
||||||
|
// client's constructor (New) will use this method to configure the client.
|
||||||
|
func (s *Session) ClientConfig(service string, cfgs ...*aws.Config) client.Config {
|
||||||
|
s = s.Copy(cfgs...)
|
||||||
|
|
||||||
|
region := aws.StringValue(s.Config.Region)
|
||||||
|
resolved, err := s.resolveEndpoint(service, region, s.Config)
|
||||||
|
if err != nil {
|
||||||
|
s.Handlers.Validate.PushBack(func(r *request.Request) {
|
||||||
|
if len(r.ClientInfo.Endpoint) != 0 {
|
||||||
|
// Error occurred while resolving endpoint, but the request
|
||||||
|
// being invoked has had an endpoint specified after the client
|
||||||
|
// was created.
|
||||||
|
return
|
||||||
|
}
|
||||||
|
r.Error = err
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return client.Config{
|
||||||
|
Config: s.Config,
|
||||||
|
Handlers: s.Handlers,
|
||||||
|
PartitionID: resolved.PartitionID,
|
||||||
|
Endpoint: resolved.URL,
|
||||||
|
SigningRegion: resolved.SigningRegion,
|
||||||
|
SigningNameDerived: resolved.SigningNameDerived,
|
||||||
|
SigningName: resolved.SigningName,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const ec2MetadataServiceID = "ec2metadata"
|
||||||
|
|
||||||
|
func (s *Session) resolveEndpoint(service, region string, cfg *aws.Config) (endpoints.ResolvedEndpoint, error) {
|
||||||
|
|
||||||
|
if ep := aws.StringValue(cfg.Endpoint); len(ep) != 0 {
|
||||||
|
return endpoints.ResolvedEndpoint{
|
||||||
|
URL: endpoints.AddScheme(ep, aws.BoolValue(cfg.DisableSSL)),
|
||||||
|
SigningRegion: region,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
resolved, err := cfg.EndpointResolver.EndpointFor(service, region,
|
||||||
|
func(opt *endpoints.Options) {
|
||||||
|
opt.DisableSSL = aws.BoolValue(cfg.DisableSSL)
|
||||||
|
opt.UseDualStack = aws.BoolValue(cfg.UseDualStack)
|
||||||
|
// Support for STSRegionalEndpoint where the STSRegionalEndpoint is
|
||||||
|
// provided in envConfig or sharedConfig with envConfig getting
|
||||||
|
// precedence.
|
||||||
|
opt.STSRegionalEndpoint = cfg.STSRegionalEndpoint
|
||||||
|
|
||||||
|
// Support for S3UsEast1RegionalEndpoint where the S3UsEast1RegionalEndpoint is
|
||||||
|
// provided in envConfig or sharedConfig with envConfig getting
|
||||||
|
// precedence.
|
||||||
|
opt.S3UsEast1RegionalEndpoint = cfg.S3UsEast1RegionalEndpoint
|
||||||
|
|
||||||
|
// Support the condition where the service is modeled but its
|
||||||
|
// endpoint metadata is not available.
|
||||||
|
opt.ResolveUnknownService = true
|
||||||
|
},
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return endpoints.ResolvedEndpoint{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return resolved, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// ClientConfigNoResolveEndpoint is the same as ClientConfig with the exception
|
||||||
|
// that the EndpointResolver will not be used to resolve the endpoint. The only
|
||||||
|
// endpoint set must come from the aws.Config.Endpoint field.
|
||||||
|
func (s *Session) ClientConfigNoResolveEndpoint(cfgs ...*aws.Config) client.Config {
|
||||||
|
s = s.Copy(cfgs...)
|
||||||
|
|
||||||
|
var resolved endpoints.ResolvedEndpoint
|
||||||
|
if ep := aws.StringValue(s.Config.Endpoint); len(ep) > 0 {
|
||||||
|
resolved.URL = endpoints.AddScheme(ep, aws.BoolValue(s.Config.DisableSSL))
|
||||||
|
resolved.SigningRegion = aws.StringValue(s.Config.Region)
|
||||||
|
}
|
||||||
|
|
||||||
|
return client.Config{
|
||||||
|
Config: s.Config,
|
||||||
|
Handlers: s.Handlers,
|
||||||
|
Endpoint: resolved.URL,
|
||||||
|
SigningRegion: resolved.SigningRegion,
|
||||||
|
SigningNameDerived: resolved.SigningNameDerived,
|
||||||
|
SigningName: resolved.SigningName,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// logDeprecatedNewSessionError function enables error handling for session
|
||||||
|
func (s *Session) logDeprecatedNewSessionError(msg string, err error, cfgs []*aws.Config) {
|
||||||
|
// Session creation failed, need to report the error and prevent
|
||||||
|
// any requests from succeeding.
|
||||||
|
s.Config.MergeIn(cfgs...)
|
||||||
|
s.Config.Logger.Log("ERROR:", msg, "Error:", err)
|
||||||
|
s.Handlers.Validate.PushBack(func(r *request.Request) {
|
||||||
|
r.Error = err
|
||||||
|
})
|
||||||
|
}
|
642
vendor/github.com/aws/aws-sdk-go/aws/session/shared_config.go
generated
vendored
Normal file
642
vendor/github.com/aws/aws-sdk-go/aws/session/shared_config.go
generated
vendored
Normal file
@ -0,0 +1,642 @@
|
|||||||
|
package session
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/credentials"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/endpoints"
|
||||||
|
"github.com/aws/aws-sdk-go/internal/ini"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// Static Credentials group
|
||||||
|
accessKeyIDKey = `aws_access_key_id` // group required
|
||||||
|
secretAccessKey = `aws_secret_access_key` // group required
|
||||||
|
sessionTokenKey = `aws_session_token` // optional
|
||||||
|
|
||||||
|
// Assume Role Credentials group
|
||||||
|
roleArnKey = `role_arn` // group required
|
||||||
|
sourceProfileKey = `source_profile` // group required (or credential_source)
|
||||||
|
credentialSourceKey = `credential_source` // group required (or source_profile)
|
||||||
|
externalIDKey = `external_id` // optional
|
||||||
|
mfaSerialKey = `mfa_serial` // optional
|
||||||
|
roleSessionNameKey = `role_session_name` // optional
|
||||||
|
roleDurationSecondsKey = "duration_seconds" // optional
|
||||||
|
|
||||||
|
// AWS Single Sign-On (AWS SSO) group
|
||||||
|
ssoAccountIDKey = "sso_account_id"
|
||||||
|
ssoRegionKey = "sso_region"
|
||||||
|
ssoRoleNameKey = "sso_role_name"
|
||||||
|
ssoStartURL = "sso_start_url"
|
||||||
|
|
||||||
|
// CSM options
|
||||||
|
csmEnabledKey = `csm_enabled`
|
||||||
|
csmHostKey = `csm_host`
|
||||||
|
csmPortKey = `csm_port`
|
||||||
|
csmClientIDKey = `csm_client_id`
|
||||||
|
|
||||||
|
// Additional Config fields
|
||||||
|
regionKey = `region`
|
||||||
|
|
||||||
|
// custom CA Bundle filename
|
||||||
|
customCABundleKey = `ca_bundle`
|
||||||
|
|
||||||
|
// endpoint discovery group
|
||||||
|
enableEndpointDiscoveryKey = `endpoint_discovery_enabled` // optional
|
||||||
|
|
||||||
|
// External Credential Process
|
||||||
|
credentialProcessKey = `credential_process` // optional
|
||||||
|
|
||||||
|
// Web Identity Token File
|
||||||
|
webIdentityTokenFileKey = `web_identity_token_file` // optional
|
||||||
|
|
||||||
|
// Additional config fields for regional or legacy endpoints
|
||||||
|
stsRegionalEndpointSharedKey = `sts_regional_endpoints`
|
||||||
|
|
||||||
|
// Additional config fields for regional or legacy endpoints
|
||||||
|
s3UsEast1RegionalSharedKey = `s3_us_east_1_regional_endpoint`
|
||||||
|
|
||||||
|
// DefaultSharedConfigProfile is the default profile to be used when
|
||||||
|
// loading configuration from the config files if another profile name
|
||||||
|
// is not provided.
|
||||||
|
DefaultSharedConfigProfile = `default`
|
||||||
|
|
||||||
|
// S3 ARN Region Usage
|
||||||
|
s3UseARNRegionKey = "s3_use_arn_region"
|
||||||
|
)
|
||||||
|
|
||||||
|
// sharedConfig represents the configuration fields of the SDK config files.
|
||||||
|
type sharedConfig struct {
|
||||||
|
Profile string
|
||||||
|
|
||||||
|
// Credentials values from the config file. Both aws_access_key_id and
|
||||||
|
// aws_secret_access_key must be provided together in the same file to be
|
||||||
|
// considered valid. The values will be ignored if not a complete group.
|
||||||
|
// aws_session_token is an optional field that can be provided if both of
|
||||||
|
// the other two fields are also provided.
|
||||||
|
//
|
||||||
|
// aws_access_key_id
|
||||||
|
// aws_secret_access_key
|
||||||
|
// aws_session_token
|
||||||
|
Creds credentials.Value
|
||||||
|
|
||||||
|
CredentialSource string
|
||||||
|
CredentialProcess string
|
||||||
|
WebIdentityTokenFile string
|
||||||
|
|
||||||
|
SSOAccountID string
|
||||||
|
SSORegion string
|
||||||
|
SSORoleName string
|
||||||
|
SSOStartURL string
|
||||||
|
|
||||||
|
RoleARN string
|
||||||
|
RoleSessionName string
|
||||||
|
ExternalID string
|
||||||
|
MFASerial string
|
||||||
|
AssumeRoleDuration *time.Duration
|
||||||
|
|
||||||
|
SourceProfileName string
|
||||||
|
SourceProfile *sharedConfig
|
||||||
|
|
||||||
|
// Region is the region the SDK should use for looking up AWS service
|
||||||
|
// endpoints and signing requests.
|
||||||
|
//
|
||||||
|
// region
|
||||||
|
Region string
|
||||||
|
|
||||||
|
// CustomCABundle is the file path to a PEM file the SDK will read and
|
||||||
|
// use to configure the HTTP transport with additional CA certs that are
|
||||||
|
// not present in the platforms default CA store.
|
||||||
|
//
|
||||||
|
// This value will be ignored if the file does not exist.
|
||||||
|
//
|
||||||
|
// ca_bundle
|
||||||
|
CustomCABundle string
|
||||||
|
|
||||||
|
// EnableEndpointDiscovery can be enabled in the shared config by setting
|
||||||
|
// endpoint_discovery_enabled to true
|
||||||
|
//
|
||||||
|
// endpoint_discovery_enabled = true
|
||||||
|
EnableEndpointDiscovery *bool
|
||||||
|
|
||||||
|
// CSM Options
|
||||||
|
CSMEnabled *bool
|
||||||
|
CSMHost string
|
||||||
|
CSMPort string
|
||||||
|
CSMClientID string
|
||||||
|
|
||||||
|
// Specifies the Regional Endpoint flag for the SDK to resolve the endpoint for a service
|
||||||
|
//
|
||||||
|
// sts_regional_endpoints = regional
|
||||||
|
// This can take value as `LegacySTSEndpoint` or `RegionalSTSEndpoint`
|
||||||
|
STSRegionalEndpoint endpoints.STSRegionalEndpoint
|
||||||
|
|
||||||
|
// Specifies the Regional Endpoint flag for the SDK to resolve the endpoint for a service
|
||||||
|
//
|
||||||
|
// s3_us_east_1_regional_endpoint = regional
|
||||||
|
// This can take value as `LegacyS3UsEast1Endpoint` or `RegionalS3UsEast1Endpoint`
|
||||||
|
S3UsEast1RegionalEndpoint endpoints.S3UsEast1RegionalEndpoint
|
||||||
|
|
||||||
|
// Specifies if the S3 service should allow ARNs to direct the region
|
||||||
|
// the client's requests are sent to.
|
||||||
|
//
|
||||||
|
// s3_use_arn_region=true
|
||||||
|
S3UseARNRegion bool
|
||||||
|
}
|
||||||
|
|
||||||
|
type sharedConfigFile struct {
|
||||||
|
Filename string
|
||||||
|
IniData ini.Sections
|
||||||
|
}
|
||||||
|
|
||||||
|
// loadSharedConfig retrieves the configuration from the list of files using
|
||||||
|
// the profile provided. The order the files are listed will determine
|
||||||
|
// precedence. Values in subsequent files will overwrite values defined in
|
||||||
|
// earlier files.
|
||||||
|
//
|
||||||
|
// For example, given two files A and B. Both define credentials. If the order
|
||||||
|
// of the files are A then B, B's credential values will be used instead of
|
||||||
|
// A's.
|
||||||
|
//
|
||||||
|
// See sharedConfig.setFromFile for information how the config files
|
||||||
|
// will be loaded.
|
||||||
|
func loadSharedConfig(profile string, filenames []string, exOpts bool) (sharedConfig, error) {
|
||||||
|
if len(profile) == 0 {
|
||||||
|
profile = DefaultSharedConfigProfile
|
||||||
|
}
|
||||||
|
|
||||||
|
files, err := loadSharedConfigIniFiles(filenames)
|
||||||
|
if err != nil {
|
||||||
|
return sharedConfig{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg := sharedConfig{}
|
||||||
|
profiles := map[string]struct{}{}
|
||||||
|
if err = cfg.setFromIniFiles(profiles, profile, files, exOpts); err != nil {
|
||||||
|
return sharedConfig{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return cfg, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func loadSharedConfigIniFiles(filenames []string) ([]sharedConfigFile, error) {
|
||||||
|
files := make([]sharedConfigFile, 0, len(filenames))
|
||||||
|
|
||||||
|
for _, filename := range filenames {
|
||||||
|
sections, err := ini.OpenFile(filename)
|
||||||
|
if aerr, ok := err.(awserr.Error); ok && aerr.Code() == ini.ErrCodeUnableToReadFile {
|
||||||
|
// Skip files which can't be opened and read for whatever reason
|
||||||
|
continue
|
||||||
|
} else if err != nil {
|
||||||
|
return nil, SharedConfigLoadError{Filename: filename, Err: err}
|
||||||
|
}
|
||||||
|
|
||||||
|
files = append(files, sharedConfigFile{
|
||||||
|
Filename: filename, IniData: sections,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return files, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cfg *sharedConfig) setFromIniFiles(profiles map[string]struct{}, profile string, files []sharedConfigFile, exOpts bool) error {
|
||||||
|
cfg.Profile = profile
|
||||||
|
|
||||||
|
// Trim files from the list that don't exist.
|
||||||
|
var skippedFiles int
|
||||||
|
var profileNotFoundErr error
|
||||||
|
for _, f := range files {
|
||||||
|
if err := cfg.setFromIniFile(profile, f, exOpts); err != nil {
|
||||||
|
if _, ok := err.(SharedConfigProfileNotExistsError); ok {
|
||||||
|
// Ignore profiles not defined in individual files.
|
||||||
|
profileNotFoundErr = err
|
||||||
|
skippedFiles++
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if skippedFiles == len(files) {
|
||||||
|
// If all files were skipped because the profile is not found, return
|
||||||
|
// the original profile not found error.
|
||||||
|
return profileNotFoundErr
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, ok := profiles[profile]; ok {
|
||||||
|
// if this is the second instance of the profile the Assume Role
|
||||||
|
// options must be cleared because they are only valid for the
|
||||||
|
// first reference of a profile. The self linked instance of the
|
||||||
|
// profile only have credential provider options.
|
||||||
|
cfg.clearAssumeRoleOptions()
|
||||||
|
} else {
|
||||||
|
// First time a profile has been seen, It must either be a assume role
|
||||||
|
// credentials, or SSO. Assert if the credential type requires a role ARN,
|
||||||
|
// the ARN is also set, or validate that the SSO configuration is complete.
|
||||||
|
if err := cfg.validateCredentialsConfig(profile); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
profiles[profile] = struct{}{}
|
||||||
|
|
||||||
|
if err := cfg.validateCredentialType(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Link source profiles for assume roles
|
||||||
|
if len(cfg.SourceProfileName) != 0 {
|
||||||
|
// Linked profile via source_profile ignore credential provider
|
||||||
|
// options, the source profile must provide the credentials.
|
||||||
|
cfg.clearCredentialOptions()
|
||||||
|
|
||||||
|
srcCfg := &sharedConfig{}
|
||||||
|
err := srcCfg.setFromIniFiles(profiles, cfg.SourceProfileName, files, exOpts)
|
||||||
|
if err != nil {
|
||||||
|
// SourceProfile that doesn't exist is an error in configuration.
|
||||||
|
if _, ok := err.(SharedConfigProfileNotExistsError); ok {
|
||||||
|
err = SharedConfigAssumeRoleError{
|
||||||
|
RoleARN: cfg.RoleARN,
|
||||||
|
SourceProfile: cfg.SourceProfileName,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if !srcCfg.hasCredentials() {
|
||||||
|
return SharedConfigAssumeRoleError{
|
||||||
|
RoleARN: cfg.RoleARN,
|
||||||
|
SourceProfile: cfg.SourceProfileName,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg.SourceProfile = srcCfg
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// setFromFile loads the configuration from the file using the profile
|
||||||
|
// provided. A sharedConfig pointer type value is used so that multiple config
|
||||||
|
// file loadings can be chained.
|
||||||
|
//
|
||||||
|
// Only loads complete logically grouped values, and will not set fields in cfg
|
||||||
|
// for incomplete grouped values in the config. Such as credentials. For
|
||||||
|
// example if a config file only includes aws_access_key_id but no
|
||||||
|
// aws_secret_access_key the aws_access_key_id will be ignored.
|
||||||
|
func (cfg *sharedConfig) setFromIniFile(profile string, file sharedConfigFile, exOpts bool) error {
|
||||||
|
section, ok := file.IniData.GetSection(profile)
|
||||||
|
if !ok {
|
||||||
|
// Fallback to to alternate profile name: profile <name>
|
||||||
|
section, ok = file.IniData.GetSection(fmt.Sprintf("profile %s", profile))
|
||||||
|
if !ok {
|
||||||
|
return SharedConfigProfileNotExistsError{Profile: profile, Err: nil}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if exOpts {
|
||||||
|
// Assume Role Parameters
|
||||||
|
updateString(&cfg.RoleARN, section, roleArnKey)
|
||||||
|
updateString(&cfg.ExternalID, section, externalIDKey)
|
||||||
|
updateString(&cfg.MFASerial, section, mfaSerialKey)
|
||||||
|
updateString(&cfg.RoleSessionName, section, roleSessionNameKey)
|
||||||
|
updateString(&cfg.SourceProfileName, section, sourceProfileKey)
|
||||||
|
updateString(&cfg.CredentialSource, section, credentialSourceKey)
|
||||||
|
updateString(&cfg.Region, section, regionKey)
|
||||||
|
updateString(&cfg.CustomCABundle, section, customCABundleKey)
|
||||||
|
|
||||||
|
if section.Has(roleDurationSecondsKey) {
|
||||||
|
d := time.Duration(section.Int(roleDurationSecondsKey)) * time.Second
|
||||||
|
cfg.AssumeRoleDuration = &d
|
||||||
|
}
|
||||||
|
|
||||||
|
if v := section.String(stsRegionalEndpointSharedKey); len(v) != 0 {
|
||||||
|
sre, err := endpoints.GetSTSRegionalEndpoint(v)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to load %s from shared config, %s, %v",
|
||||||
|
stsRegionalEndpointSharedKey, file.Filename, err)
|
||||||
|
}
|
||||||
|
cfg.STSRegionalEndpoint = sre
|
||||||
|
}
|
||||||
|
|
||||||
|
if v := section.String(s3UsEast1RegionalSharedKey); len(v) != 0 {
|
||||||
|
sre, err := endpoints.GetS3UsEast1RegionalEndpoint(v)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to load %s from shared config, %s, %v",
|
||||||
|
s3UsEast1RegionalSharedKey, file.Filename, err)
|
||||||
|
}
|
||||||
|
cfg.S3UsEast1RegionalEndpoint = sre
|
||||||
|
}
|
||||||
|
|
||||||
|
// AWS Single Sign-On (AWS SSO)
|
||||||
|
updateString(&cfg.SSOAccountID, section, ssoAccountIDKey)
|
||||||
|
updateString(&cfg.SSORegion, section, ssoRegionKey)
|
||||||
|
updateString(&cfg.SSORoleName, section, ssoRoleNameKey)
|
||||||
|
updateString(&cfg.SSOStartURL, section, ssoStartURL)
|
||||||
|
}
|
||||||
|
|
||||||
|
updateString(&cfg.CredentialProcess, section, credentialProcessKey)
|
||||||
|
updateString(&cfg.WebIdentityTokenFile, section, webIdentityTokenFileKey)
|
||||||
|
|
||||||
|
// Shared Credentials
|
||||||
|
creds := credentials.Value{
|
||||||
|
AccessKeyID: section.String(accessKeyIDKey),
|
||||||
|
SecretAccessKey: section.String(secretAccessKey),
|
||||||
|
SessionToken: section.String(sessionTokenKey),
|
||||||
|
ProviderName: fmt.Sprintf("SharedConfigCredentials: %s", file.Filename),
|
||||||
|
}
|
||||||
|
if creds.HasKeys() {
|
||||||
|
cfg.Creds = creds
|
||||||
|
}
|
||||||
|
|
||||||
|
// Endpoint discovery
|
||||||
|
updateBoolPtr(&cfg.EnableEndpointDiscovery, section, enableEndpointDiscoveryKey)
|
||||||
|
|
||||||
|
// CSM options
|
||||||
|
updateBoolPtr(&cfg.CSMEnabled, section, csmEnabledKey)
|
||||||
|
updateString(&cfg.CSMHost, section, csmHostKey)
|
||||||
|
updateString(&cfg.CSMPort, section, csmPortKey)
|
||||||
|
updateString(&cfg.CSMClientID, section, csmClientIDKey)
|
||||||
|
|
||||||
|
updateBool(&cfg.S3UseARNRegion, section, s3UseARNRegionKey)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cfg *sharedConfig) validateCredentialsConfig(profile string) error {
|
||||||
|
if err := cfg.validateCredentialsRequireARN(profile); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cfg *sharedConfig) validateCredentialsRequireARN(profile string) error {
|
||||||
|
var credSource string
|
||||||
|
|
||||||
|
switch {
|
||||||
|
case len(cfg.SourceProfileName) != 0:
|
||||||
|
credSource = sourceProfileKey
|
||||||
|
case len(cfg.CredentialSource) != 0:
|
||||||
|
credSource = credentialSourceKey
|
||||||
|
case len(cfg.WebIdentityTokenFile) != 0:
|
||||||
|
credSource = webIdentityTokenFileKey
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(credSource) != 0 && len(cfg.RoleARN) == 0 {
|
||||||
|
return CredentialRequiresARNError{
|
||||||
|
Type: credSource,
|
||||||
|
Profile: profile,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cfg *sharedConfig) validateCredentialType() error {
|
||||||
|
// Only one or no credential type can be defined.
|
||||||
|
if !oneOrNone(
|
||||||
|
len(cfg.SourceProfileName) != 0,
|
||||||
|
len(cfg.CredentialSource) != 0,
|
||||||
|
len(cfg.CredentialProcess) != 0,
|
||||||
|
len(cfg.WebIdentityTokenFile) != 0,
|
||||||
|
cfg.hasSSOConfiguration(),
|
||||||
|
) {
|
||||||
|
return ErrSharedConfigSourceCollision
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cfg *sharedConfig) validateSSOConfiguration() error {
|
||||||
|
if !cfg.hasSSOConfiguration() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var missing []string
|
||||||
|
if len(cfg.SSOAccountID) == 0 {
|
||||||
|
missing = append(missing, ssoAccountIDKey)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(cfg.SSORegion) == 0 {
|
||||||
|
missing = append(missing, ssoRegionKey)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(cfg.SSORoleName) == 0 {
|
||||||
|
missing = append(missing, ssoRoleNameKey)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(cfg.SSOStartURL) == 0 {
|
||||||
|
missing = append(missing, ssoStartURL)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(missing) > 0 {
|
||||||
|
return fmt.Errorf("profile %q is configured to use SSO but is missing required configuration: %s",
|
||||||
|
cfg.Profile, strings.Join(missing, ", "))
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cfg *sharedConfig) hasCredentials() bool {
|
||||||
|
switch {
|
||||||
|
case len(cfg.SourceProfileName) != 0:
|
||||||
|
case len(cfg.CredentialSource) != 0:
|
||||||
|
case len(cfg.CredentialProcess) != 0:
|
||||||
|
case len(cfg.WebIdentityTokenFile) != 0:
|
||||||
|
case cfg.hasSSOConfiguration():
|
||||||
|
case cfg.Creds.HasKeys():
|
||||||
|
default:
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cfg *sharedConfig) clearCredentialOptions() {
|
||||||
|
cfg.CredentialSource = ""
|
||||||
|
cfg.CredentialProcess = ""
|
||||||
|
cfg.WebIdentityTokenFile = ""
|
||||||
|
cfg.Creds = credentials.Value{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cfg *sharedConfig) clearAssumeRoleOptions() {
|
||||||
|
cfg.RoleARN = ""
|
||||||
|
cfg.ExternalID = ""
|
||||||
|
cfg.MFASerial = ""
|
||||||
|
cfg.RoleSessionName = ""
|
||||||
|
cfg.SourceProfileName = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cfg *sharedConfig) hasSSOConfiguration() bool {
|
||||||
|
switch {
|
||||||
|
case len(cfg.SSOAccountID) != 0:
|
||||||
|
case len(cfg.SSORegion) != 0:
|
||||||
|
case len(cfg.SSORoleName) != 0:
|
||||||
|
case len(cfg.SSOStartURL) != 0:
|
||||||
|
default:
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func oneOrNone(bs ...bool) bool {
|
||||||
|
var count int
|
||||||
|
|
||||||
|
for _, b := range bs {
|
||||||
|
if b {
|
||||||
|
count++
|
||||||
|
if count > 1 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// updateString will only update the dst with the value in the section key, key
|
||||||
|
// is present in the section.
|
||||||
|
func updateString(dst *string, section ini.Section, key string) {
|
||||||
|
if !section.Has(key) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
*dst = section.String(key)
|
||||||
|
}
|
||||||
|
|
||||||
|
// updateBool will only update the dst with the value in the section key, key
|
||||||
|
// is present in the section.
|
||||||
|
func updateBool(dst *bool, section ini.Section, key string) {
|
||||||
|
if !section.Has(key) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
*dst = section.Bool(key)
|
||||||
|
}
|
||||||
|
|
||||||
|
// updateBoolPtr will only update the dst with the value in the section key,
|
||||||
|
// key is present in the section.
|
||||||
|
func updateBoolPtr(dst **bool, section ini.Section, key string) {
|
||||||
|
if !section.Has(key) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
*dst = new(bool)
|
||||||
|
**dst = section.Bool(key)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SharedConfigLoadError is an error for the shared config file failed to load.
|
||||||
|
type SharedConfigLoadError struct {
|
||||||
|
Filename string
|
||||||
|
Err error
|
||||||
|
}
|
||||||
|
|
||||||
|
// Code is the short id of the error.
|
||||||
|
func (e SharedConfigLoadError) Code() string {
|
||||||
|
return "SharedConfigLoadError"
|
||||||
|
}
|
||||||
|
|
||||||
|
// Message is the description of the error
|
||||||
|
func (e SharedConfigLoadError) Message() string {
|
||||||
|
return fmt.Sprintf("failed to load config file, %s", e.Filename)
|
||||||
|
}
|
||||||
|
|
||||||
|
// OrigErr is the underlying error that caused the failure.
|
||||||
|
func (e SharedConfigLoadError) OrigErr() error {
|
||||||
|
return e.Err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error satisfies the error interface.
|
||||||
|
func (e SharedConfigLoadError) Error() string {
|
||||||
|
return awserr.SprintError(e.Code(), e.Message(), "", e.Err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SharedConfigProfileNotExistsError is an error for the shared config when
|
||||||
|
// the profile was not find in the config file.
|
||||||
|
type SharedConfigProfileNotExistsError struct {
|
||||||
|
Profile string
|
||||||
|
Err error
|
||||||
|
}
|
||||||
|
|
||||||
|
// Code is the short id of the error.
|
||||||
|
func (e SharedConfigProfileNotExistsError) Code() string {
|
||||||
|
return "SharedConfigProfileNotExistsError"
|
||||||
|
}
|
||||||
|
|
||||||
|
// Message is the description of the error
|
||||||
|
func (e SharedConfigProfileNotExistsError) Message() string {
|
||||||
|
return fmt.Sprintf("failed to get profile, %s", e.Profile)
|
||||||
|
}
|
||||||
|
|
||||||
|
// OrigErr is the underlying error that caused the failure.
|
||||||
|
func (e SharedConfigProfileNotExistsError) OrigErr() error {
|
||||||
|
return e.Err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error satisfies the error interface.
|
||||||
|
func (e SharedConfigProfileNotExistsError) Error() string {
|
||||||
|
return awserr.SprintError(e.Code(), e.Message(), "", e.Err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// SharedConfigAssumeRoleError is an error for the shared config when the
|
||||||
|
// profile contains assume role information, but that information is invalid
|
||||||
|
// or not complete.
|
||||||
|
type SharedConfigAssumeRoleError struct {
|
||||||
|
RoleARN string
|
||||||
|
SourceProfile string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Code is the short id of the error.
|
||||||
|
func (e SharedConfigAssumeRoleError) Code() string {
|
||||||
|
return "SharedConfigAssumeRoleError"
|
||||||
|
}
|
||||||
|
|
||||||
|
// Message is the description of the error
|
||||||
|
func (e SharedConfigAssumeRoleError) Message() string {
|
||||||
|
return fmt.Sprintf(
|
||||||
|
"failed to load assume role for %s, source profile %s has no shared credentials",
|
||||||
|
e.RoleARN, e.SourceProfile,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// OrigErr is the underlying error that caused the failure.
|
||||||
|
func (e SharedConfigAssumeRoleError) OrigErr() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error satisfies the error interface.
|
||||||
|
func (e SharedConfigAssumeRoleError) Error() string {
|
||||||
|
return awserr.SprintError(e.Code(), e.Message(), "", nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// CredentialRequiresARNError provides the error for shared config credentials
|
||||||
|
// that are incorrectly configured in the shared config or credentials file.
|
||||||
|
type CredentialRequiresARNError struct {
|
||||||
|
// type of credentials that were configured.
|
||||||
|
Type string
|
||||||
|
|
||||||
|
// Profile name the credentials were in.
|
||||||
|
Profile string
|
||||||
|
}
|
||||||
|
|
||||||
|
// Code is the short id of the error.
|
||||||
|
func (e CredentialRequiresARNError) Code() string {
|
||||||
|
return "CredentialRequiresARNError"
|
||||||
|
}
|
||||||
|
|
||||||
|
// Message is the description of the error
|
||||||
|
func (e CredentialRequiresARNError) Message() string {
|
||||||
|
return fmt.Sprintf(
|
||||||
|
"credential type %s requires role_arn, profile %s",
|
||||||
|
e.Type, e.Profile,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// OrigErr is the underlying error that caused the failure.
|
||||||
|
func (e CredentialRequiresARNError) OrigErr() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error satisfies the error interface.
|
||||||
|
func (e CredentialRequiresARNError) Error() string {
|
||||||
|
return awserr.SprintError(e.Code(), e.Message(), "", nil)
|
||||||
|
}
|
5
vendor/github.com/aws/aws-sdk-go/aws/signer/v4/v4.go
generated
vendored
5
vendor/github.com/aws/aws-sdk-go/aws/signer/v4/v4.go
generated
vendored
@ -689,9 +689,12 @@ func (ctx *signingCtx) buildBodyDigest() error {
|
|||||||
if hash == "" {
|
if hash == "" {
|
||||||
includeSHA256Header := ctx.unsignedPayload ||
|
includeSHA256Header := ctx.unsignedPayload ||
|
||||||
ctx.ServiceName == "s3" ||
|
ctx.ServiceName == "s3" ||
|
||||||
|
ctx.ServiceName == "s3-object-lambda" ||
|
||||||
ctx.ServiceName == "glacier"
|
ctx.ServiceName == "glacier"
|
||||||
|
|
||||||
s3Presign := ctx.isPresign && ctx.ServiceName == "s3"
|
s3Presign := ctx.isPresign &&
|
||||||
|
(ctx.ServiceName == "s3" ||
|
||||||
|
ctx.ServiceName == "s3-object-lambda")
|
||||||
|
|
||||||
if ctx.unsignedPayload || s3Presign {
|
if ctx.unsignedPayload || s3Presign {
|
||||||
hash = "UNSIGNED-PAYLOAD"
|
hash = "UNSIGNED-PAYLOAD"
|
||||||
|
2
vendor/github.com/aws/aws-sdk-go/aws/version.go
generated
vendored
2
vendor/github.com/aws/aws-sdk-go/aws/version.go
generated
vendored
@ -5,4 +5,4 @@ package aws
|
|||||||
const SDKName = "aws-sdk-go"
|
const SDKName = "aws-sdk-go"
|
||||||
|
|
||||||
// SDKVersion is the version of this SDK
|
// SDKVersion is the version of this SDK
|
||||||
const SDKVersion = "1.35.24"
|
const SDKVersion = "1.38.8"
|
||||||
|
23
vendor/github.com/aws/aws-sdk-go/internal/sdkuri/path.go
generated
vendored
Normal file
23
vendor/github.com/aws/aws-sdk-go/internal/sdkuri/path.go
generated
vendored
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
package sdkuri
|
||||||
|
|
||||||
|
import (
|
||||||
|
"path"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
// PathJoin will join the elements of the path delimited by the "/"
|
||||||
|
// character. Similar to path.Join with the exception the trailing "/"
|
||||||
|
// character is preserved if present.
|
||||||
|
func PathJoin(elems ...string) string {
|
||||||
|
if len(elems) == 0 {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
hasTrailing := strings.HasSuffix(elems[len(elems)-1], "/")
|
||||||
|
str := path.Join(elems...)
|
||||||
|
if hasTrailing && str != "/" {
|
||||||
|
str += "/"
|
||||||
|
}
|
||||||
|
|
||||||
|
return str
|
||||||
|
}
|
44
vendor/github.com/aws/aws-sdk-go/private/protocol/host.go
generated
vendored
44
vendor/github.com/aws/aws-sdk-go/private/protocol/host.go
generated
vendored
@ -1,9 +1,10 @@
|
|||||||
package protocol
|
package protocol
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/aws/aws-sdk-go/aws/request"
|
"github.com/aws/aws-sdk-go/aws/request"
|
||||||
|
"net"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ValidateEndpointHostHandler is a request handler that will validate the
|
// ValidateEndpointHostHandler is a request handler that will validate the
|
||||||
@ -22,8 +23,26 @@ var ValidateEndpointHostHandler = request.NamedHandler{
|
|||||||
// 3986 host. Returns error if the host is not valid.
|
// 3986 host. Returns error if the host is not valid.
|
||||||
func ValidateEndpointHost(opName, host string) error {
|
func ValidateEndpointHost(opName, host string) error {
|
||||||
paramErrs := request.ErrInvalidParams{Context: opName}
|
paramErrs := request.ErrInvalidParams{Context: opName}
|
||||||
labels := strings.Split(host, ".")
|
|
||||||
|
|
||||||
|
var hostname string
|
||||||
|
var port string
|
||||||
|
var err error
|
||||||
|
|
||||||
|
if strings.Contains(host, ":") {
|
||||||
|
hostname, port, err = net.SplitHostPort(host)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
paramErrs.Add(request.NewErrParamFormat("endpoint", err.Error(), host))
|
||||||
|
}
|
||||||
|
|
||||||
|
if !ValidPortNumber(port) {
|
||||||
|
paramErrs.Add(request.NewErrParamFormat("endpoint port number", "[0-65535]", port))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
hostname = host
|
||||||
|
}
|
||||||
|
|
||||||
|
labels := strings.Split(hostname, ".")
|
||||||
for i, label := range labels {
|
for i, label := range labels {
|
||||||
if i == len(labels)-1 && len(label) == 0 {
|
if i == len(labels)-1 && len(label) == 0 {
|
||||||
// Allow trailing dot for FQDN hosts.
|
// Allow trailing dot for FQDN hosts.
|
||||||
@ -36,7 +55,11 @@ func ValidateEndpointHost(opName, host string) error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(host) > 255 {
|
if len(hostname) == 0 {
|
||||||
|
paramErrs.Add(request.NewErrParamMinLen("endpoint host", 1))
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(hostname) > 255 {
|
||||||
paramErrs.Add(request.NewErrParamMaxLen(
|
paramErrs.Add(request.NewErrParamMaxLen(
|
||||||
"endpoint host", 255, host,
|
"endpoint host", 255, host,
|
||||||
))
|
))
|
||||||
@ -66,3 +89,16 @@ func ValidHostLabel(label string) bool {
|
|||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ValidPortNumber return if the port is valid RFC 3986 port
|
||||||
|
func ValidPortNumber(port string) bool {
|
||||||
|
i, err := strconv.Atoi(port)
|
||||||
|
if err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if i < 0 || i > 65535 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
296
vendor/github.com/aws/aws-sdk-go/private/protocol/json/jsonutil/build.go
generated
vendored
Normal file
296
vendor/github.com/aws/aws-sdk-go/private/protocol/json/jsonutil/build.go
generated
vendored
Normal file
@ -0,0 +1,296 @@
|
|||||||
|
// Package jsonutil provides JSON serialization of AWS requests and responses.
|
||||||
|
package jsonutil
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/base64"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"math"
|
||||||
|
"reflect"
|
||||||
|
"sort"
|
||||||
|
"strconv"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
|
"github.com/aws/aws-sdk-go/private/protocol"
|
||||||
|
)
|
||||||
|
|
||||||
|
var timeType = reflect.ValueOf(time.Time{}).Type()
|
||||||
|
var byteSliceType = reflect.ValueOf([]byte{}).Type()
|
||||||
|
|
||||||
|
// BuildJSON builds a JSON string for a given object v.
|
||||||
|
func BuildJSON(v interface{}) ([]byte, error) {
|
||||||
|
var buf bytes.Buffer
|
||||||
|
|
||||||
|
err := buildAny(reflect.ValueOf(v), &buf, "")
|
||||||
|
return buf.Bytes(), err
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildAny(value reflect.Value, buf *bytes.Buffer, tag reflect.StructTag) error {
|
||||||
|
origVal := value
|
||||||
|
value = reflect.Indirect(value)
|
||||||
|
if !value.IsValid() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
vtype := value.Type()
|
||||||
|
|
||||||
|
t := tag.Get("type")
|
||||||
|
if t == "" {
|
||||||
|
switch vtype.Kind() {
|
||||||
|
case reflect.Struct:
|
||||||
|
// also it can't be a time object
|
||||||
|
if value.Type() != timeType {
|
||||||
|
t = "structure"
|
||||||
|
}
|
||||||
|
case reflect.Slice:
|
||||||
|
// also it can't be a byte slice
|
||||||
|
if _, ok := value.Interface().([]byte); !ok {
|
||||||
|
t = "list"
|
||||||
|
}
|
||||||
|
case reflect.Map:
|
||||||
|
// cannot be a JSONValue map
|
||||||
|
if _, ok := value.Interface().(aws.JSONValue); !ok {
|
||||||
|
t = "map"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch t {
|
||||||
|
case "structure":
|
||||||
|
if field, ok := vtype.FieldByName("_"); ok {
|
||||||
|
tag = field.Tag
|
||||||
|
}
|
||||||
|
return buildStruct(value, buf, tag)
|
||||||
|
case "list":
|
||||||
|
return buildList(value, buf, tag)
|
||||||
|
case "map":
|
||||||
|
return buildMap(value, buf, tag)
|
||||||
|
default:
|
||||||
|
return buildScalar(origVal, buf, tag)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildStruct(value reflect.Value, buf *bytes.Buffer, tag reflect.StructTag) error {
|
||||||
|
if !value.IsValid() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// unwrap payloads
|
||||||
|
if payload := tag.Get("payload"); payload != "" {
|
||||||
|
field, _ := value.Type().FieldByName(payload)
|
||||||
|
tag = field.Tag
|
||||||
|
value = elemOf(value.FieldByName(payload))
|
||||||
|
|
||||||
|
if !value.IsValid() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buf.WriteByte('{')
|
||||||
|
|
||||||
|
t := value.Type()
|
||||||
|
first := true
|
||||||
|
for i := 0; i < t.NumField(); i++ {
|
||||||
|
member := value.Field(i)
|
||||||
|
|
||||||
|
// This allocates the most memory.
|
||||||
|
// Additionally, we cannot skip nil fields due to
|
||||||
|
// idempotency auto filling.
|
||||||
|
field := t.Field(i)
|
||||||
|
|
||||||
|
if field.PkgPath != "" {
|
||||||
|
continue // ignore unexported fields
|
||||||
|
}
|
||||||
|
if field.Tag.Get("json") == "-" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if field.Tag.Get("location") != "" {
|
||||||
|
continue // ignore non-body elements
|
||||||
|
}
|
||||||
|
if field.Tag.Get("ignore") != "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if protocol.CanSetIdempotencyToken(member, field) {
|
||||||
|
token := protocol.GetIdempotencyToken()
|
||||||
|
member = reflect.ValueOf(&token)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (member.Kind() == reflect.Ptr || member.Kind() == reflect.Slice || member.Kind() == reflect.Map) && member.IsNil() {
|
||||||
|
continue // ignore unset fields
|
||||||
|
}
|
||||||
|
|
||||||
|
if first {
|
||||||
|
first = false
|
||||||
|
} else {
|
||||||
|
buf.WriteByte(',')
|
||||||
|
}
|
||||||
|
|
||||||
|
// figure out what this field is called
|
||||||
|
name := field.Name
|
||||||
|
if locName := field.Tag.Get("locationName"); locName != "" {
|
||||||
|
name = locName
|
||||||
|
}
|
||||||
|
|
||||||
|
writeString(name, buf)
|
||||||
|
buf.WriteString(`:`)
|
||||||
|
|
||||||
|
err := buildAny(member, buf, field.Tag)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
buf.WriteString("}")
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildList(value reflect.Value, buf *bytes.Buffer, tag reflect.StructTag) error {
|
||||||
|
buf.WriteString("[")
|
||||||
|
|
||||||
|
for i := 0; i < value.Len(); i++ {
|
||||||
|
buildAny(value.Index(i), buf, "")
|
||||||
|
|
||||||
|
if i < value.Len()-1 {
|
||||||
|
buf.WriteString(",")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buf.WriteString("]")
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type sortedValues []reflect.Value
|
||||||
|
|
||||||
|
func (sv sortedValues) Len() int { return len(sv) }
|
||||||
|
func (sv sortedValues) Swap(i, j int) { sv[i], sv[j] = sv[j], sv[i] }
|
||||||
|
func (sv sortedValues) Less(i, j int) bool { return sv[i].String() < sv[j].String() }
|
||||||
|
|
||||||
|
func buildMap(value reflect.Value, buf *bytes.Buffer, tag reflect.StructTag) error {
|
||||||
|
buf.WriteString("{")
|
||||||
|
|
||||||
|
sv := sortedValues(value.MapKeys())
|
||||||
|
sort.Sort(sv)
|
||||||
|
|
||||||
|
for i, k := range sv {
|
||||||
|
if i > 0 {
|
||||||
|
buf.WriteByte(',')
|
||||||
|
}
|
||||||
|
|
||||||
|
writeString(k.String(), buf)
|
||||||
|
buf.WriteString(`:`)
|
||||||
|
|
||||||
|
buildAny(value.MapIndex(k), buf, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
buf.WriteString("}")
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func buildScalar(v reflect.Value, buf *bytes.Buffer, tag reflect.StructTag) error {
|
||||||
|
// prevents allocation on the heap.
|
||||||
|
scratch := [64]byte{}
|
||||||
|
switch value := reflect.Indirect(v); value.Kind() {
|
||||||
|
case reflect.String:
|
||||||
|
writeString(value.String(), buf)
|
||||||
|
case reflect.Bool:
|
||||||
|
if value.Bool() {
|
||||||
|
buf.WriteString("true")
|
||||||
|
} else {
|
||||||
|
buf.WriteString("false")
|
||||||
|
}
|
||||||
|
case reflect.Int64:
|
||||||
|
buf.Write(strconv.AppendInt(scratch[:0], value.Int(), 10))
|
||||||
|
case reflect.Float64:
|
||||||
|
f := value.Float()
|
||||||
|
if math.IsInf(f, 0) || math.IsNaN(f) {
|
||||||
|
return &json.UnsupportedValueError{Value: v, Str: strconv.FormatFloat(f, 'f', -1, 64)}
|
||||||
|
}
|
||||||
|
buf.Write(strconv.AppendFloat(scratch[:0], f, 'f', -1, 64))
|
||||||
|
default:
|
||||||
|
switch converted := value.Interface().(type) {
|
||||||
|
case time.Time:
|
||||||
|
format := tag.Get("timestampFormat")
|
||||||
|
if len(format) == 0 {
|
||||||
|
format = protocol.UnixTimeFormatName
|
||||||
|
}
|
||||||
|
|
||||||
|
ts := protocol.FormatTime(format, converted)
|
||||||
|
if format != protocol.UnixTimeFormatName {
|
||||||
|
ts = `"` + ts + `"`
|
||||||
|
}
|
||||||
|
|
||||||
|
buf.WriteString(ts)
|
||||||
|
case []byte:
|
||||||
|
if !value.IsNil() {
|
||||||
|
buf.WriteByte('"')
|
||||||
|
if len(converted) < 1024 {
|
||||||
|
// for small buffers, using Encode directly is much faster.
|
||||||
|
dst := make([]byte, base64.StdEncoding.EncodedLen(len(converted)))
|
||||||
|
base64.StdEncoding.Encode(dst, converted)
|
||||||
|
buf.Write(dst)
|
||||||
|
} else {
|
||||||
|
// for large buffers, avoid unnecessary extra temporary
|
||||||
|
// buffer space.
|
||||||
|
enc := base64.NewEncoder(base64.StdEncoding, buf)
|
||||||
|
enc.Write(converted)
|
||||||
|
enc.Close()
|
||||||
|
}
|
||||||
|
buf.WriteByte('"')
|
||||||
|
}
|
||||||
|
case aws.JSONValue:
|
||||||
|
str, err := protocol.EncodeJSONValue(converted, protocol.QuotedEscape)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("unable to encode JSONValue, %v", err)
|
||||||
|
}
|
||||||
|
buf.WriteString(str)
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("unsupported JSON value %v (%s)", value.Interface(), value.Type())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var hex = "0123456789abcdef"
|
||||||
|
|
||||||
|
func writeString(s string, buf *bytes.Buffer) {
|
||||||
|
buf.WriteByte('"')
|
||||||
|
for i := 0; i < len(s); i++ {
|
||||||
|
if s[i] == '"' {
|
||||||
|
buf.WriteString(`\"`)
|
||||||
|
} else if s[i] == '\\' {
|
||||||
|
buf.WriteString(`\\`)
|
||||||
|
} else if s[i] == '\b' {
|
||||||
|
buf.WriteString(`\b`)
|
||||||
|
} else if s[i] == '\f' {
|
||||||
|
buf.WriteString(`\f`)
|
||||||
|
} else if s[i] == '\r' {
|
||||||
|
buf.WriteString(`\r`)
|
||||||
|
} else if s[i] == '\t' {
|
||||||
|
buf.WriteString(`\t`)
|
||||||
|
} else if s[i] == '\n' {
|
||||||
|
buf.WriteString(`\n`)
|
||||||
|
} else if s[i] < 32 {
|
||||||
|
buf.WriteString("\\u00")
|
||||||
|
buf.WriteByte(hex[s[i]>>4])
|
||||||
|
buf.WriteByte(hex[s[i]&0xF])
|
||||||
|
} else {
|
||||||
|
buf.WriteByte(s[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
buf.WriteByte('"')
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns the reflection element of a value, if it is a pointer.
|
||||||
|
func elemOf(value reflect.Value) reflect.Value {
|
||||||
|
for value.Kind() == reflect.Ptr {
|
||||||
|
value = value.Elem()
|
||||||
|
}
|
||||||
|
return value
|
||||||
|
}
|
304
vendor/github.com/aws/aws-sdk-go/private/protocol/json/jsonutil/unmarshal.go
generated
vendored
Normal file
304
vendor/github.com/aws/aws-sdk-go/private/protocol/json/jsonutil/unmarshal.go
generated
vendored
Normal file
@ -0,0 +1,304 @@
|
|||||||
|
package jsonutil
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/base64"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"math/big"
|
||||||
|
"reflect"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||||
|
"github.com/aws/aws-sdk-go/private/protocol"
|
||||||
|
)
|
||||||
|
|
||||||
|
var millisecondsFloat = new(big.Float).SetInt64(1e3)
|
||||||
|
|
||||||
|
// UnmarshalJSONError unmarshal's the reader's JSON document into the passed in
|
||||||
|
// type. The value to unmarshal the json document into must be a pointer to the
|
||||||
|
// type.
|
||||||
|
func UnmarshalJSONError(v interface{}, stream io.Reader) error {
|
||||||
|
var errBuf bytes.Buffer
|
||||||
|
body := io.TeeReader(stream, &errBuf)
|
||||||
|
|
||||||
|
err := json.NewDecoder(body).Decode(v)
|
||||||
|
if err != nil {
|
||||||
|
msg := "failed decoding error message"
|
||||||
|
if err == io.EOF {
|
||||||
|
msg = "error message missing"
|
||||||
|
err = nil
|
||||||
|
}
|
||||||
|
return awserr.NewUnmarshalError(err, msg, errBuf.Bytes())
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSON reads a stream and unmarshals the results in object v.
|
||||||
|
func UnmarshalJSON(v interface{}, stream io.Reader) error {
|
||||||
|
var out interface{}
|
||||||
|
|
||||||
|
decoder := json.NewDecoder(stream)
|
||||||
|
decoder.UseNumber()
|
||||||
|
err := decoder.Decode(&out)
|
||||||
|
if err == io.EOF {
|
||||||
|
return nil
|
||||||
|
} else if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return unmarshaler{}.unmarshalAny(reflect.ValueOf(v), out, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalJSONCaseInsensitive reads a stream and unmarshals the result into the
|
||||||
|
// object v. Ignores casing for structure members.
|
||||||
|
func UnmarshalJSONCaseInsensitive(v interface{}, stream io.Reader) error {
|
||||||
|
var out interface{}
|
||||||
|
|
||||||
|
decoder := json.NewDecoder(stream)
|
||||||
|
decoder.UseNumber()
|
||||||
|
err := decoder.Decode(&out)
|
||||||
|
if err == io.EOF {
|
||||||
|
return nil
|
||||||
|
} else if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return unmarshaler{
|
||||||
|
caseInsensitive: true,
|
||||||
|
}.unmarshalAny(reflect.ValueOf(v), out, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
type unmarshaler struct {
|
||||||
|
caseInsensitive bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u unmarshaler) unmarshalAny(value reflect.Value, data interface{}, tag reflect.StructTag) error {
|
||||||
|
vtype := value.Type()
|
||||||
|
if vtype.Kind() == reflect.Ptr {
|
||||||
|
vtype = vtype.Elem() // check kind of actual element type
|
||||||
|
}
|
||||||
|
|
||||||
|
t := tag.Get("type")
|
||||||
|
if t == "" {
|
||||||
|
switch vtype.Kind() {
|
||||||
|
case reflect.Struct:
|
||||||
|
// also it can't be a time object
|
||||||
|
if _, ok := value.Interface().(*time.Time); !ok {
|
||||||
|
t = "structure"
|
||||||
|
}
|
||||||
|
case reflect.Slice:
|
||||||
|
// also it can't be a byte slice
|
||||||
|
if _, ok := value.Interface().([]byte); !ok {
|
||||||
|
t = "list"
|
||||||
|
}
|
||||||
|
case reflect.Map:
|
||||||
|
// cannot be a JSONValue map
|
||||||
|
if _, ok := value.Interface().(aws.JSONValue); !ok {
|
||||||
|
t = "map"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
switch t {
|
||||||
|
case "structure":
|
||||||
|
if field, ok := vtype.FieldByName("_"); ok {
|
||||||
|
tag = field.Tag
|
||||||
|
}
|
||||||
|
return u.unmarshalStruct(value, data, tag)
|
||||||
|
case "list":
|
||||||
|
return u.unmarshalList(value, data, tag)
|
||||||
|
case "map":
|
||||||
|
return u.unmarshalMap(value, data, tag)
|
||||||
|
default:
|
||||||
|
return u.unmarshalScalar(value, data, tag)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u unmarshaler) unmarshalStruct(value reflect.Value, data interface{}, tag reflect.StructTag) error {
|
||||||
|
if data == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
mapData, ok := data.(map[string]interface{})
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("JSON value is not a structure (%#v)", data)
|
||||||
|
}
|
||||||
|
|
||||||
|
t := value.Type()
|
||||||
|
if value.Kind() == reflect.Ptr {
|
||||||
|
if value.IsNil() { // create the structure if it's nil
|
||||||
|
s := reflect.New(value.Type().Elem())
|
||||||
|
value.Set(s)
|
||||||
|
value = s
|
||||||
|
}
|
||||||
|
|
||||||
|
value = value.Elem()
|
||||||
|
t = t.Elem()
|
||||||
|
}
|
||||||
|
|
||||||
|
// unwrap any payloads
|
||||||
|
if payload := tag.Get("payload"); payload != "" {
|
||||||
|
field, _ := t.FieldByName(payload)
|
||||||
|
return u.unmarshalAny(value.FieldByName(payload), data, field.Tag)
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 0; i < t.NumField(); i++ {
|
||||||
|
field := t.Field(i)
|
||||||
|
if field.PkgPath != "" {
|
||||||
|
continue // ignore unexported fields
|
||||||
|
}
|
||||||
|
|
||||||
|
// figure out what this field is called
|
||||||
|
name := field.Name
|
||||||
|
if locName := field.Tag.Get("locationName"); locName != "" {
|
||||||
|
name = locName
|
||||||
|
}
|
||||||
|
if u.caseInsensitive {
|
||||||
|
if _, ok := mapData[name]; !ok {
|
||||||
|
// Fallback to uncased name search if the exact name didn't match.
|
||||||
|
for kn, v := range mapData {
|
||||||
|
if strings.EqualFold(kn, name) {
|
||||||
|
mapData[name] = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
member := value.FieldByIndex(field.Index)
|
||||||
|
err := u.unmarshalAny(member, mapData[name], field.Tag)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u unmarshaler) unmarshalList(value reflect.Value, data interface{}, tag reflect.StructTag) error {
|
||||||
|
if data == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
listData, ok := data.([]interface{})
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("JSON value is not a list (%#v)", data)
|
||||||
|
}
|
||||||
|
|
||||||
|
if value.IsNil() {
|
||||||
|
l := len(listData)
|
||||||
|
value.Set(reflect.MakeSlice(value.Type(), l, l))
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, c := range listData {
|
||||||
|
err := u.unmarshalAny(value.Index(i), c, "")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u unmarshaler) unmarshalMap(value reflect.Value, data interface{}, tag reflect.StructTag) error {
|
||||||
|
if data == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
mapData, ok := data.(map[string]interface{})
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("JSON value is not a map (%#v)", data)
|
||||||
|
}
|
||||||
|
|
||||||
|
if value.IsNil() {
|
||||||
|
value.Set(reflect.MakeMap(value.Type()))
|
||||||
|
}
|
||||||
|
|
||||||
|
for k, v := range mapData {
|
||||||
|
kvalue := reflect.ValueOf(k)
|
||||||
|
vvalue := reflect.New(value.Type().Elem()).Elem()
|
||||||
|
|
||||||
|
u.unmarshalAny(vvalue, v, "")
|
||||||
|
value.SetMapIndex(kvalue, vvalue)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u unmarshaler) unmarshalScalar(value reflect.Value, data interface{}, tag reflect.StructTag) error {
|
||||||
|
|
||||||
|
switch d := data.(type) {
|
||||||
|
case nil:
|
||||||
|
return nil // nothing to do here
|
||||||
|
case string:
|
||||||
|
switch value.Interface().(type) {
|
||||||
|
case *string:
|
||||||
|
value.Set(reflect.ValueOf(&d))
|
||||||
|
case []byte:
|
||||||
|
b, err := base64.StdEncoding.DecodeString(d)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
value.Set(reflect.ValueOf(b))
|
||||||
|
case *time.Time:
|
||||||
|
format := tag.Get("timestampFormat")
|
||||||
|
if len(format) == 0 {
|
||||||
|
format = protocol.ISO8601TimeFormatName
|
||||||
|
}
|
||||||
|
|
||||||
|
t, err := protocol.ParseTime(format, d)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
value.Set(reflect.ValueOf(&t))
|
||||||
|
case aws.JSONValue:
|
||||||
|
// No need to use escaping as the value is a non-quoted string.
|
||||||
|
v, err := protocol.DecodeJSONValue(d, protocol.NoEscape)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
value.Set(reflect.ValueOf(v))
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("unsupported value: %v (%s)", value.Interface(), value.Type())
|
||||||
|
}
|
||||||
|
case json.Number:
|
||||||
|
switch value.Interface().(type) {
|
||||||
|
case *int64:
|
||||||
|
// Retain the old behavior where we would just truncate the float64
|
||||||
|
// calling d.Int64() here could cause an invalid syntax error due to the usage of strconv.ParseInt
|
||||||
|
f, err := d.Float64()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
di := int64(f)
|
||||||
|
value.Set(reflect.ValueOf(&di))
|
||||||
|
case *float64:
|
||||||
|
f, err := d.Float64()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
value.Set(reflect.ValueOf(&f))
|
||||||
|
case *time.Time:
|
||||||
|
float, ok := new(big.Float).SetString(d.String())
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("unsupported float time representation: %v", d.String())
|
||||||
|
}
|
||||||
|
float = float.Mul(float, millisecondsFloat)
|
||||||
|
ms, _ := float.Int64()
|
||||||
|
t := time.Unix(0, ms*1e6).UTC()
|
||||||
|
value.Set(reflect.ValueOf(&t))
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("unsupported value: %v (%s)", value.Interface(), value.Type())
|
||||||
|
}
|
||||||
|
case bool:
|
||||||
|
switch value.Interface().(type) {
|
||||||
|
case *bool:
|
||||||
|
value.Set(reflect.ValueOf(&d))
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("unsupported value: %v (%s)", value.Interface(), value.Type())
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("unsupported JSON value (%v)", data)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
88
vendor/github.com/aws/aws-sdk-go/private/protocol/jsonrpc/jsonrpc.go
generated
vendored
Normal file
88
vendor/github.com/aws/aws-sdk-go/private/protocol/jsonrpc/jsonrpc.go
generated
vendored
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
// Package jsonrpc provides JSON RPC utilities for serialization of AWS
|
||||||
|
// requests and responses.
|
||||||
|
package jsonrpc
|
||||||
|
|
||||||
|
//go:generate go run -tags codegen ../../../private/model/cli/gen-protocol-tests ../../../models/protocol_tests/input/json.json build_test.go
|
||||||
|
//go:generate go run -tags codegen ../../../private/model/cli/gen-protocol-tests ../../../models/protocol_tests/output/json.json unmarshal_test.go
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/request"
|
||||||
|
"github.com/aws/aws-sdk-go/private/protocol/json/jsonutil"
|
||||||
|
"github.com/aws/aws-sdk-go/private/protocol/rest"
|
||||||
|
)
|
||||||
|
|
||||||
|
var emptyJSON = []byte("{}")
|
||||||
|
|
||||||
|
// BuildHandler is a named request handler for building jsonrpc protocol
|
||||||
|
// requests
|
||||||
|
var BuildHandler = request.NamedHandler{
|
||||||
|
Name: "awssdk.jsonrpc.Build",
|
||||||
|
Fn: Build,
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalHandler is a named request handler for unmarshaling jsonrpc
|
||||||
|
// protocol requests
|
||||||
|
var UnmarshalHandler = request.NamedHandler{
|
||||||
|
Name: "awssdk.jsonrpc.Unmarshal",
|
||||||
|
Fn: Unmarshal,
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalMetaHandler is a named request handler for unmarshaling jsonrpc
|
||||||
|
// protocol request metadata
|
||||||
|
var UnmarshalMetaHandler = request.NamedHandler{
|
||||||
|
Name: "awssdk.jsonrpc.UnmarshalMeta",
|
||||||
|
Fn: UnmarshalMeta,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build builds a JSON payload for a JSON RPC request.
|
||||||
|
func Build(req *request.Request) {
|
||||||
|
var buf []byte
|
||||||
|
var err error
|
||||||
|
if req.ParamsFilled() {
|
||||||
|
buf, err = jsonutil.BuildJSON(req.Params)
|
||||||
|
if err != nil {
|
||||||
|
req.Error = awserr.New(request.ErrCodeSerialization, "failed encoding JSON RPC request", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
buf = emptyJSON
|
||||||
|
}
|
||||||
|
|
||||||
|
if req.ClientInfo.TargetPrefix != "" || string(buf) != "{}" {
|
||||||
|
req.SetBufferBody(buf)
|
||||||
|
}
|
||||||
|
|
||||||
|
if req.ClientInfo.TargetPrefix != "" {
|
||||||
|
target := req.ClientInfo.TargetPrefix + "." + req.Operation.Name
|
||||||
|
req.HTTPRequest.Header.Add("X-Amz-Target", target)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only set the content type if one is not already specified and an
|
||||||
|
// JSONVersion is specified.
|
||||||
|
if ct, v := req.HTTPRequest.Header.Get("Content-Type"), req.ClientInfo.JSONVersion; len(ct) == 0 && len(v) != 0 {
|
||||||
|
jsonVersion := req.ClientInfo.JSONVersion
|
||||||
|
req.HTTPRequest.Header.Set("Content-Type", "application/x-amz-json-"+jsonVersion)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unmarshal unmarshals a response for a JSON RPC service.
|
||||||
|
func Unmarshal(req *request.Request) {
|
||||||
|
defer req.HTTPResponse.Body.Close()
|
||||||
|
if req.DataFilled() {
|
||||||
|
err := jsonutil.UnmarshalJSON(req.Data, req.HTTPResponse.Body)
|
||||||
|
if err != nil {
|
||||||
|
req.Error = awserr.NewRequestFailure(
|
||||||
|
awserr.New(request.ErrCodeSerialization, "failed decoding JSON RPC response", err),
|
||||||
|
req.HTTPResponse.StatusCode,
|
||||||
|
req.RequestID,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalMeta unmarshals headers from a response for a JSON RPC service.
|
||||||
|
func UnmarshalMeta(req *request.Request) {
|
||||||
|
rest.UnmarshalMeta(req)
|
||||||
|
}
|
107
vendor/github.com/aws/aws-sdk-go/private/protocol/jsonrpc/unmarshal_error.go
generated
vendored
Normal file
107
vendor/github.com/aws/aws-sdk-go/private/protocol/jsonrpc/unmarshal_error.go
generated
vendored
Normal file
@ -0,0 +1,107 @@
|
|||||||
|
package jsonrpc
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/request"
|
||||||
|
"github.com/aws/aws-sdk-go/private/protocol"
|
||||||
|
"github.com/aws/aws-sdk-go/private/protocol/json/jsonutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
// UnmarshalTypedError provides unmarshaling errors API response errors
|
||||||
|
// for both typed and untyped errors.
|
||||||
|
type UnmarshalTypedError struct {
|
||||||
|
exceptions map[string]func(protocol.ResponseMetadata) error
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewUnmarshalTypedError returns an UnmarshalTypedError initialized for the
|
||||||
|
// set of exception names to the error unmarshalers
|
||||||
|
func NewUnmarshalTypedError(exceptions map[string]func(protocol.ResponseMetadata) error) *UnmarshalTypedError {
|
||||||
|
return &UnmarshalTypedError{
|
||||||
|
exceptions: exceptions,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalError attempts to unmarshal the HTTP response error as a known
|
||||||
|
// error type. If unable to unmarshal the error type, the generic SDK error
|
||||||
|
// type will be used.
|
||||||
|
func (u *UnmarshalTypedError) UnmarshalError(
|
||||||
|
resp *http.Response,
|
||||||
|
respMeta protocol.ResponseMetadata,
|
||||||
|
) (error, error) {
|
||||||
|
|
||||||
|
var buf bytes.Buffer
|
||||||
|
var jsonErr jsonErrorResponse
|
||||||
|
teeReader := io.TeeReader(resp.Body, &buf)
|
||||||
|
err := jsonutil.UnmarshalJSONError(&jsonErr, teeReader)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
body := ioutil.NopCloser(&buf)
|
||||||
|
|
||||||
|
// Code may be separated by hash(#), with the last element being the code
|
||||||
|
// used by the SDK.
|
||||||
|
codeParts := strings.SplitN(jsonErr.Code, "#", 2)
|
||||||
|
code := codeParts[len(codeParts)-1]
|
||||||
|
msg := jsonErr.Message
|
||||||
|
|
||||||
|
if fn, ok := u.exceptions[code]; ok {
|
||||||
|
// If exception code is know, use associated constructor to get a value
|
||||||
|
// for the exception that the JSON body can be unmarshaled into.
|
||||||
|
v := fn(respMeta)
|
||||||
|
err := jsonutil.UnmarshalJSONCaseInsensitive(v, body)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return v, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// fallback to unmodeled generic exceptions
|
||||||
|
return awserr.NewRequestFailure(
|
||||||
|
awserr.New(code, msg, nil),
|
||||||
|
respMeta.StatusCode,
|
||||||
|
respMeta.RequestID,
|
||||||
|
), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalErrorHandler is a named request handler for unmarshaling jsonrpc
|
||||||
|
// protocol request errors
|
||||||
|
var UnmarshalErrorHandler = request.NamedHandler{
|
||||||
|
Name: "awssdk.jsonrpc.UnmarshalError",
|
||||||
|
Fn: UnmarshalError,
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalError unmarshals an error response for a JSON RPC service.
|
||||||
|
func UnmarshalError(req *request.Request) {
|
||||||
|
defer req.HTTPResponse.Body.Close()
|
||||||
|
|
||||||
|
var jsonErr jsonErrorResponse
|
||||||
|
err := jsonutil.UnmarshalJSONError(&jsonErr, req.HTTPResponse.Body)
|
||||||
|
if err != nil {
|
||||||
|
req.Error = awserr.NewRequestFailure(
|
||||||
|
awserr.New(request.ErrCodeSerialization,
|
||||||
|
"failed to unmarshal error message", err),
|
||||||
|
req.HTTPResponse.StatusCode,
|
||||||
|
req.RequestID,
|
||||||
|
)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
codes := strings.SplitN(jsonErr.Code, "#", 2)
|
||||||
|
req.Error = awserr.NewRequestFailure(
|
||||||
|
awserr.New(codes[len(codes)-1], jsonErr.Message, nil),
|
||||||
|
req.HTTPResponse.StatusCode,
|
||||||
|
req.RequestID,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
type jsonErrorResponse struct {
|
||||||
|
Code string `json:"__type"`
|
||||||
|
Message string `json:"message"`
|
||||||
|
}
|
36
vendor/github.com/aws/aws-sdk-go/private/protocol/query/build.go
generated
vendored
Normal file
36
vendor/github.com/aws/aws-sdk-go/private/protocol/query/build.go
generated
vendored
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
// Package query provides serialization of AWS query requests, and responses.
|
||||||
|
package query
|
||||||
|
|
||||||
|
//go:generate go run -tags codegen ../../../private/model/cli/gen-protocol-tests ../../../models/protocol_tests/input/query.json build_test.go
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/url"
|
||||||
|
|
||||||
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/request"
|
||||||
|
"github.com/aws/aws-sdk-go/private/protocol/query/queryutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
// BuildHandler is a named request handler for building query protocol requests
|
||||||
|
var BuildHandler = request.NamedHandler{Name: "awssdk.query.Build", Fn: Build}
|
||||||
|
|
||||||
|
// Build builds a request for an AWS Query service.
|
||||||
|
func Build(r *request.Request) {
|
||||||
|
body := url.Values{
|
||||||
|
"Action": {r.Operation.Name},
|
||||||
|
"Version": {r.ClientInfo.APIVersion},
|
||||||
|
}
|
||||||
|
if err := queryutil.Parse(body, r.Params, false); err != nil {
|
||||||
|
r.Error = awserr.New(request.ErrCodeSerialization, "failed encoding Query request", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if !r.IsPresigned() {
|
||||||
|
r.HTTPRequest.Method = "POST"
|
||||||
|
r.HTTPRequest.Header.Set("Content-Type", "application/x-www-form-urlencoded; charset=utf-8")
|
||||||
|
r.SetBufferBody([]byte(body.Encode()))
|
||||||
|
} else { // This is a pre-signed request
|
||||||
|
r.HTTPRequest.Method = "GET"
|
||||||
|
r.HTTPRequest.URL.RawQuery = body.Encode()
|
||||||
|
}
|
||||||
|
}
|
39
vendor/github.com/aws/aws-sdk-go/private/protocol/query/unmarshal.go
generated
vendored
Normal file
39
vendor/github.com/aws/aws-sdk-go/private/protocol/query/unmarshal.go
generated
vendored
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
package query
|
||||||
|
|
||||||
|
//go:generate go run -tags codegen ../../../private/model/cli/gen-protocol-tests ../../../models/protocol_tests/output/query.json unmarshal_test.go
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/xml"
|
||||||
|
|
||||||
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/request"
|
||||||
|
"github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
// UnmarshalHandler is a named request handler for unmarshaling query protocol requests
|
||||||
|
var UnmarshalHandler = request.NamedHandler{Name: "awssdk.query.Unmarshal", Fn: Unmarshal}
|
||||||
|
|
||||||
|
// UnmarshalMetaHandler is a named request handler for unmarshaling query protocol request metadata
|
||||||
|
var UnmarshalMetaHandler = request.NamedHandler{Name: "awssdk.query.UnmarshalMeta", Fn: UnmarshalMeta}
|
||||||
|
|
||||||
|
// Unmarshal unmarshals a response for an AWS Query service.
|
||||||
|
func Unmarshal(r *request.Request) {
|
||||||
|
defer r.HTTPResponse.Body.Close()
|
||||||
|
if r.DataFilled() {
|
||||||
|
decoder := xml.NewDecoder(r.HTTPResponse.Body)
|
||||||
|
err := xmlutil.UnmarshalXML(r.Data, decoder, r.Operation.Name+"Result")
|
||||||
|
if err != nil {
|
||||||
|
r.Error = awserr.NewRequestFailure(
|
||||||
|
awserr.New(request.ErrCodeSerialization, "failed decoding Query response", err),
|
||||||
|
r.HTTPResponse.StatusCode,
|
||||||
|
r.RequestID,
|
||||||
|
)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalMeta unmarshals header response values for an AWS Query service.
|
||||||
|
func UnmarshalMeta(r *request.Request) {
|
||||||
|
r.RequestID = r.HTTPResponse.Header.Get("X-Amzn-Requestid")
|
||||||
|
}
|
69
vendor/github.com/aws/aws-sdk-go/private/protocol/query/unmarshal_error.go
generated
vendored
Normal file
69
vendor/github.com/aws/aws-sdk-go/private/protocol/query/unmarshal_error.go
generated
vendored
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
package query
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/xml"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/request"
|
||||||
|
"github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
// UnmarshalErrorHandler is a name request handler to unmarshal request errors
|
||||||
|
var UnmarshalErrorHandler = request.NamedHandler{Name: "awssdk.query.UnmarshalError", Fn: UnmarshalError}
|
||||||
|
|
||||||
|
type xmlErrorResponse struct {
|
||||||
|
Code string `xml:"Error>Code"`
|
||||||
|
Message string `xml:"Error>Message"`
|
||||||
|
RequestID string `xml:"RequestId"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type xmlResponseError struct {
|
||||||
|
xmlErrorResponse
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *xmlResponseError) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
|
||||||
|
const svcUnavailableTagName = "ServiceUnavailableException"
|
||||||
|
const errorResponseTagName = "ErrorResponse"
|
||||||
|
|
||||||
|
switch start.Name.Local {
|
||||||
|
case svcUnavailableTagName:
|
||||||
|
e.Code = svcUnavailableTagName
|
||||||
|
e.Message = "service is unavailable"
|
||||||
|
return d.Skip()
|
||||||
|
|
||||||
|
case errorResponseTagName:
|
||||||
|
return d.DecodeElement(&e.xmlErrorResponse, &start)
|
||||||
|
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("unknown error response tag, %v", start)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalError unmarshals an error response for an AWS Query service.
|
||||||
|
func UnmarshalError(r *request.Request) {
|
||||||
|
defer r.HTTPResponse.Body.Close()
|
||||||
|
|
||||||
|
var respErr xmlResponseError
|
||||||
|
err := xmlutil.UnmarshalXMLError(&respErr, r.HTTPResponse.Body)
|
||||||
|
if err != nil {
|
||||||
|
r.Error = awserr.NewRequestFailure(
|
||||||
|
awserr.New(request.ErrCodeSerialization,
|
||||||
|
"failed to unmarshal error message", err),
|
||||||
|
r.HTTPResponse.StatusCode,
|
||||||
|
r.RequestID,
|
||||||
|
)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
reqID := respErr.RequestID
|
||||||
|
if len(reqID) == 0 {
|
||||||
|
reqID = r.RequestID
|
||||||
|
}
|
||||||
|
|
||||||
|
r.Error = awserr.NewRequestFailure(
|
||||||
|
awserr.New(respErr.Code, respErr.Message, nil),
|
||||||
|
r.HTTPResponse.StatusCode,
|
||||||
|
reqID,
|
||||||
|
)
|
||||||
|
}
|
59
vendor/github.com/aws/aws-sdk-go/private/protocol/restjson/restjson.go
generated
vendored
Normal file
59
vendor/github.com/aws/aws-sdk-go/private/protocol/restjson/restjson.go
generated
vendored
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
// Package restjson provides RESTful JSON serialization of AWS
|
||||||
|
// requests and responses.
|
||||||
|
package restjson
|
||||||
|
|
||||||
|
//go:generate go run -tags codegen ../../../private/model/cli/gen-protocol-tests ../../../models/protocol_tests/input/rest-json.json build_test.go
|
||||||
|
//go:generate go run -tags codegen ../../../private/model/cli/gen-protocol-tests ../../../models/protocol_tests/output/rest-json.json unmarshal_test.go
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/aws/aws-sdk-go/aws/request"
|
||||||
|
"github.com/aws/aws-sdk-go/private/protocol/jsonrpc"
|
||||||
|
"github.com/aws/aws-sdk-go/private/protocol/rest"
|
||||||
|
)
|
||||||
|
|
||||||
|
// BuildHandler is a named request handler for building restjson protocol
|
||||||
|
// requests
|
||||||
|
var BuildHandler = request.NamedHandler{
|
||||||
|
Name: "awssdk.restjson.Build",
|
||||||
|
Fn: Build,
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalHandler is a named request handler for unmarshaling restjson
|
||||||
|
// protocol requests
|
||||||
|
var UnmarshalHandler = request.NamedHandler{
|
||||||
|
Name: "awssdk.restjson.Unmarshal",
|
||||||
|
Fn: Unmarshal,
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalMetaHandler is a named request handler for unmarshaling restjson
|
||||||
|
// protocol request metadata
|
||||||
|
var UnmarshalMetaHandler = request.NamedHandler{
|
||||||
|
Name: "awssdk.restjson.UnmarshalMeta",
|
||||||
|
Fn: UnmarshalMeta,
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build builds a request for the REST JSON protocol.
|
||||||
|
func Build(r *request.Request) {
|
||||||
|
rest.Build(r)
|
||||||
|
|
||||||
|
if t := rest.PayloadType(r.Params); t == "structure" || t == "" {
|
||||||
|
if v := r.HTTPRequest.Header.Get("Content-Type"); len(v) == 0 {
|
||||||
|
r.HTTPRequest.Header.Set("Content-Type", "application/json")
|
||||||
|
}
|
||||||
|
jsonrpc.Build(r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Unmarshal unmarshals a response body for the REST JSON protocol.
|
||||||
|
func Unmarshal(r *request.Request) {
|
||||||
|
if t := rest.PayloadType(r.Data); t == "structure" || t == "" {
|
||||||
|
jsonrpc.Unmarshal(r)
|
||||||
|
} else {
|
||||||
|
rest.Unmarshal(r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalMeta unmarshals response headers for the REST JSON protocol.
|
||||||
|
func UnmarshalMeta(r *request.Request) {
|
||||||
|
rest.UnmarshalMeta(r)
|
||||||
|
}
|
134
vendor/github.com/aws/aws-sdk-go/private/protocol/restjson/unmarshal_error.go
generated
vendored
Normal file
134
vendor/github.com/aws/aws-sdk-go/private/protocol/restjson/unmarshal_error.go
generated
vendored
Normal file
@ -0,0 +1,134 @@
|
|||||||
|
package restjson
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/aws/aws-sdk-go/aws/awserr"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/request"
|
||||||
|
"github.com/aws/aws-sdk-go/private/protocol"
|
||||||
|
"github.com/aws/aws-sdk-go/private/protocol/json/jsonutil"
|
||||||
|
"github.com/aws/aws-sdk-go/private/protocol/rest"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
errorTypeHeader = "X-Amzn-Errortype"
|
||||||
|
errorMessageHeader = "X-Amzn-Errormessage"
|
||||||
|
)
|
||||||
|
|
||||||
|
// UnmarshalTypedError provides unmarshaling errors API response errors
|
||||||
|
// for both typed and untyped errors.
|
||||||
|
type UnmarshalTypedError struct {
|
||||||
|
exceptions map[string]func(protocol.ResponseMetadata) error
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewUnmarshalTypedError returns an UnmarshalTypedError initialized for the
|
||||||
|
// set of exception names to the error unmarshalers
|
||||||
|
func NewUnmarshalTypedError(exceptions map[string]func(protocol.ResponseMetadata) error) *UnmarshalTypedError {
|
||||||
|
return &UnmarshalTypedError{
|
||||||
|
exceptions: exceptions,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalError attempts to unmarshal the HTTP response error as a known
|
||||||
|
// error type. If unable to unmarshal the error type, the generic SDK error
|
||||||
|
// type will be used.
|
||||||
|
func (u *UnmarshalTypedError) UnmarshalError(
|
||||||
|
resp *http.Response,
|
||||||
|
respMeta protocol.ResponseMetadata,
|
||||||
|
) (error, error) {
|
||||||
|
|
||||||
|
code := resp.Header.Get(errorTypeHeader)
|
||||||
|
msg := resp.Header.Get(errorMessageHeader)
|
||||||
|
|
||||||
|
body := resp.Body
|
||||||
|
if len(code) == 0 {
|
||||||
|
// If unable to get code from HTTP headers have to parse JSON message
|
||||||
|
// to determine what kind of exception this will be.
|
||||||
|
var buf bytes.Buffer
|
||||||
|
var jsonErr jsonErrorResponse
|
||||||
|
teeReader := io.TeeReader(resp.Body, &buf)
|
||||||
|
err := jsonutil.UnmarshalJSONError(&jsonErr, teeReader)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
body = ioutil.NopCloser(&buf)
|
||||||
|
code = jsonErr.Code
|
||||||
|
msg = jsonErr.Message
|
||||||
|
}
|
||||||
|
|
||||||
|
// If code has colon separators remove them so can compare against modeled
|
||||||
|
// exception names.
|
||||||
|
code = strings.SplitN(code, ":", 2)[0]
|
||||||
|
|
||||||
|
if fn, ok := u.exceptions[code]; ok {
|
||||||
|
// If exception code is know, use associated constructor to get a value
|
||||||
|
// for the exception that the JSON body can be unmarshaled into.
|
||||||
|
v := fn(respMeta)
|
||||||
|
if err := jsonutil.UnmarshalJSONCaseInsensitive(v, body); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := rest.UnmarshalResponse(resp, v, true); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return v, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// fallback to unmodeled generic exceptions
|
||||||
|
return awserr.NewRequestFailure(
|
||||||
|
awserr.New(code, msg, nil),
|
||||||
|
respMeta.StatusCode,
|
||||||
|
respMeta.RequestID,
|
||||||
|
), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalErrorHandler is a named request handler for unmarshaling restjson
|
||||||
|
// protocol request errors
|
||||||
|
var UnmarshalErrorHandler = request.NamedHandler{
|
||||||
|
Name: "awssdk.restjson.UnmarshalError",
|
||||||
|
Fn: UnmarshalError,
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnmarshalError unmarshals a response error for the REST JSON protocol.
|
||||||
|
func UnmarshalError(r *request.Request) {
|
||||||
|
defer r.HTTPResponse.Body.Close()
|
||||||
|
|
||||||
|
var jsonErr jsonErrorResponse
|
||||||
|
err := jsonutil.UnmarshalJSONError(&jsonErr, r.HTTPResponse.Body)
|
||||||
|
if err != nil {
|
||||||
|
r.Error = awserr.NewRequestFailure(
|
||||||
|
awserr.New(request.ErrCodeSerialization,
|
||||||
|
"failed to unmarshal response error", err),
|
||||||
|
r.HTTPResponse.StatusCode,
|
||||||
|
r.RequestID,
|
||||||
|
)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
code := r.HTTPResponse.Header.Get(errorTypeHeader)
|
||||||
|
if code == "" {
|
||||||
|
code = jsonErr.Code
|
||||||
|
}
|
||||||
|
msg := r.HTTPResponse.Header.Get(errorMessageHeader)
|
||||||
|
if msg == "" {
|
||||||
|
msg = jsonErr.Message
|
||||||
|
}
|
||||||
|
|
||||||
|
code = strings.SplitN(code, ":", 2)[0]
|
||||||
|
r.Error = awserr.NewRequestFailure(
|
||||||
|
awserr.New(code, jsonErr.Message, nil),
|
||||||
|
r.HTTPResponse.StatusCode,
|
||||||
|
r.RequestID,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
type jsonErrorResponse struct {
|
||||||
|
Code string `json:"code"`
|
||||||
|
Message string `json:"message"`
|
||||||
|
}
|
7167
vendor/github.com/aws/aws-sdk-go/service/ec2/api.go
generated
vendored
7167
vendor/github.com/aws/aws-sdk-go/service/ec2/api.go
generated
vendored
File diff suppressed because it is too large
Load Diff
10
vendor/github.com/aws/aws-sdk-go/service/ec2/doc.go
generated
vendored
10
vendor/github.com/aws/aws-sdk-go/service/ec2/doc.go
generated
vendored
@ -4,8 +4,14 @@
|
|||||||
// requests to Amazon Elastic Compute Cloud.
|
// requests to Amazon Elastic Compute Cloud.
|
||||||
//
|
//
|
||||||
// Amazon Elastic Compute Cloud (Amazon EC2) provides secure and resizable computing
|
// Amazon Elastic Compute Cloud (Amazon EC2) provides secure and resizable computing
|
||||||
// capacity in the AWS cloud. Using Amazon EC2 eliminates the need to invest
|
// capacity in the AWS Cloud. Using Amazon EC2 eliminates the need to invest
|
||||||
// in hardware up front, so you can develop and deploy applications faster.
|
// in hardware up front, so you can develop and deploy applications faster.
|
||||||
|
// Amazon Virtual Private Cloud (Amazon VPC) enables you to provision a logically
|
||||||
|
// isolated section of the AWS Cloud where you can launch AWS resources in a
|
||||||
|
// virtual network that you've defined. Amazon Elastic Block Store (Amazon EBS)
|
||||||
|
// provides block level storage volumes for use with EC2 instances. EBS volumes
|
||||||
|
// are highly available and reliable storage volumes that can be attached to
|
||||||
|
// any running instance and used like a hard drive.
|
||||||
//
|
//
|
||||||
// To learn more, see the following resources:
|
// To learn more, see the following resources:
|
||||||
//
|
//
|
||||||
@ -13,7 +19,7 @@
|
|||||||
// EC2 documentation (http://aws.amazon.com/documentation/ec2)
|
// EC2 documentation (http://aws.amazon.com/documentation/ec2)
|
||||||
//
|
//
|
||||||
// * Amazon EBS: Amazon EBS product page (http://aws.amazon.com/ebs), Amazon
|
// * Amazon EBS: Amazon EBS product page (http://aws.amazon.com/ebs), Amazon
|
||||||
// EBS documentation (https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AmazonEBS.html)
|
// EBS documentation (http://aws.amazon.com/documentation/ebs)
|
||||||
//
|
//
|
||||||
// * Amazon VPC: Amazon VPC product page (http://aws.amazon.com/vpc), Amazon
|
// * Amazon VPC: Amazon VPC product page (http://aws.amazon.com/vpc), Amazon
|
||||||
// VPC documentation (http://aws.amazon.com/documentation/vpc)
|
// VPC documentation (http://aws.amazon.com/documentation/vpc)
|
||||||
|
15680
vendor/github.com/aws/aws-sdk-go/service/kms/api.go
generated
vendored
Normal file
15680
vendor/github.com/aws/aws-sdk-go/service/kms/api.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
98
vendor/github.com/aws/aws-sdk-go/service/kms/doc.go
generated
vendored
Normal file
98
vendor/github.com/aws/aws-sdk-go/service/kms/doc.go
generated
vendored
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT.
|
||||||
|
|
||||||
|
// Package kms provides the client and types for making API
|
||||||
|
// requests to AWS Key Management Service.
|
||||||
|
//
|
||||||
|
// AWS Key Management Service (AWS KMS) is an encryption and key management
|
||||||
|
// web service. This guide describes the AWS KMS operations that you can call
|
||||||
|
// programmatically. For general information about AWS KMS, see the AWS Key
|
||||||
|
// Management Service Developer Guide (https://docs.aws.amazon.com/kms/latest/developerguide/).
|
||||||
|
//
|
||||||
|
// AWS provides SDKs that consist of libraries and sample code for various programming
|
||||||
|
// languages and platforms (Java, Ruby, .Net, macOS, Android, etc.). The SDKs
|
||||||
|
// provide a convenient way to create programmatic access to AWS KMS and other
|
||||||
|
// AWS services. For example, the SDKs take care of tasks such as signing requests
|
||||||
|
// (see below), managing errors, and retrying requests automatically. For more
|
||||||
|
// information about the AWS SDKs, including how to download and install them,
|
||||||
|
// see Tools for Amazon Web Services (http://aws.amazon.com/tools/).
|
||||||
|
//
|
||||||
|
// We recommend that you use the AWS SDKs to make programmatic API calls to
|
||||||
|
// AWS KMS.
|
||||||
|
//
|
||||||
|
// Clients must support TLS (Transport Layer Security) 1.0. We recommend TLS
|
||||||
|
// 1.2. Clients must also support cipher suites with Perfect Forward Secrecy
|
||||||
|
// (PFS) such as Ephemeral Diffie-Hellman (DHE) or Elliptic Curve Ephemeral
|
||||||
|
// Diffie-Hellman (ECDHE). Most modern systems such as Java 7 and later support
|
||||||
|
// these modes.
|
||||||
|
//
|
||||||
|
// Signing Requests
|
||||||
|
//
|
||||||
|
// Requests must be signed by using an access key ID and a secret access key.
|
||||||
|
// We strongly recommend that you do not use your AWS account (root) access
|
||||||
|
// key ID and secret key for everyday work with AWS KMS. Instead, use the access
|
||||||
|
// key ID and secret access key for an IAM user. You can also use the AWS Security
|
||||||
|
// Token Service to generate temporary security credentials that you can use
|
||||||
|
// to sign requests.
|
||||||
|
//
|
||||||
|
// All AWS KMS operations require Signature Version 4 (https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html).
|
||||||
|
//
|
||||||
|
// Logging API Requests
|
||||||
|
//
|
||||||
|
// AWS KMS supports AWS CloudTrail, a service that logs AWS API calls and related
|
||||||
|
// events for your AWS account and delivers them to an Amazon S3 bucket that
|
||||||
|
// you specify. By using the information collected by CloudTrail, you can determine
|
||||||
|
// what requests were made to AWS KMS, who made the request, when it was made,
|
||||||
|
// and so on. To learn more about CloudTrail, including how to turn it on and
|
||||||
|
// find your log files, see the AWS CloudTrail User Guide (https://docs.aws.amazon.com/awscloudtrail/latest/userguide/).
|
||||||
|
//
|
||||||
|
// Additional Resources
|
||||||
|
//
|
||||||
|
// For more information about credentials and request signing, see the following:
|
||||||
|
//
|
||||||
|
// * AWS Security Credentials (https://docs.aws.amazon.com/general/latest/gr/aws-security-credentials.html)
|
||||||
|
// - This topic provides general information about the types of credentials
|
||||||
|
// used for accessing AWS.
|
||||||
|
//
|
||||||
|
// * Temporary Security Credentials (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html)
|
||||||
|
// - This section of the IAM User Guide describes how to create and use temporary
|
||||||
|
// security credentials.
|
||||||
|
//
|
||||||
|
// * Signature Version 4 Signing Process (https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html)
|
||||||
|
// - This set of topics walks you through the process of signing a request
|
||||||
|
// using an access key ID and a secret access key.
|
||||||
|
//
|
||||||
|
// Commonly Used API Operations
|
||||||
|
//
|
||||||
|
// Of the API operations discussed in this guide, the following will prove the
|
||||||
|
// most useful for most applications. You will likely perform operations other
|
||||||
|
// than these, such as creating keys and assigning policies, by using the console.
|
||||||
|
//
|
||||||
|
// * Encrypt
|
||||||
|
//
|
||||||
|
// * Decrypt
|
||||||
|
//
|
||||||
|
// * GenerateDataKey
|
||||||
|
//
|
||||||
|
// * GenerateDataKeyWithoutPlaintext
|
||||||
|
//
|
||||||
|
// See https://docs.aws.amazon.com/goto/WebAPI/kms-2014-11-01 for more information on this service.
|
||||||
|
//
|
||||||
|
// See kms package documentation for more information.
|
||||||
|
// https://docs.aws.amazon.com/sdk-for-go/api/service/kms/
|
||||||
|
//
|
||||||
|
// Using the Client
|
||||||
|
//
|
||||||
|
// To contact AWS Key Management Service with the SDK use the New function to create
|
||||||
|
// a new service client. With that client you can make API requests to the service.
|
||||||
|
// These clients are safe to use concurrently.
|
||||||
|
//
|
||||||
|
// See the SDK's documentation for more information on how to use the SDK.
|
||||||
|
// https://docs.aws.amazon.com/sdk-for-go/api/
|
||||||
|
//
|
||||||
|
// See aws.Config documentation for more information on configuring SDK clients.
|
||||||
|
// https://docs.aws.amazon.com/sdk-for-go/api/aws/#Config
|
||||||
|
//
|
||||||
|
// See the AWS Key Management Service client KMS for more
|
||||||
|
// information on creating client for this service.
|
||||||
|
// https://docs.aws.amazon.com/sdk-for-go/api/service/kms/#New
|
||||||
|
package kms
|
367
vendor/github.com/aws/aws-sdk-go/service/kms/errors.go
generated
vendored
Normal file
367
vendor/github.com/aws/aws-sdk-go/service/kms/errors.go
generated
vendored
Normal file
@ -0,0 +1,367 @@
|
|||||||
|
// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT.
|
||||||
|
|
||||||
|
package kms
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/aws/aws-sdk-go/private/protocol"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
|
||||||
|
// ErrCodeAlreadyExistsException for service response error code
|
||||||
|
// "AlreadyExistsException".
|
||||||
|
//
|
||||||
|
// The request was rejected because it attempted to create a resource that already
|
||||||
|
// exists.
|
||||||
|
ErrCodeAlreadyExistsException = "AlreadyExistsException"
|
||||||
|
|
||||||
|
// ErrCodeCloudHsmClusterInUseException for service response error code
|
||||||
|
// "CloudHsmClusterInUseException".
|
||||||
|
//
|
||||||
|
// The request was rejected because the specified AWS CloudHSM cluster is already
|
||||||
|
// associated with a custom key store or it shares a backup history with a cluster
|
||||||
|
// that is associated with a custom key store. Each custom key store must be
|
||||||
|
// associated with a different AWS CloudHSM cluster.
|
||||||
|
//
|
||||||
|
// Clusters that share a backup history have the same cluster certificate. To
|
||||||
|
// view the cluster certificate of a cluster, use the DescribeClusters (https://docs.aws.amazon.com/cloudhsm/latest/APIReference/API_DescribeClusters.html)
|
||||||
|
// operation.
|
||||||
|
ErrCodeCloudHsmClusterInUseException = "CloudHsmClusterInUseException"
|
||||||
|
|
||||||
|
// ErrCodeCloudHsmClusterInvalidConfigurationException for service response error code
|
||||||
|
// "CloudHsmClusterInvalidConfigurationException".
|
||||||
|
//
|
||||||
|
// The request was rejected because the associated AWS CloudHSM cluster did
|
||||||
|
// not meet the configuration requirements for a custom key store.
|
||||||
|
//
|
||||||
|
// * The cluster must be configured with private subnets in at least two
|
||||||
|
// different Availability Zones in the Region.
|
||||||
|
//
|
||||||
|
// * The security group for the cluster (https://docs.aws.amazon.com/cloudhsm/latest/userguide/configure-sg.html)
|
||||||
|
// (cloudhsm-cluster-<cluster-id>-sg) must include inbound rules and outbound
|
||||||
|
// rules that allow TCP traffic on ports 2223-2225. The Source in the inbound
|
||||||
|
// rules and the Destination in the outbound rules must match the security
|
||||||
|
// group ID. These rules are set by default when you create the cluster.
|
||||||
|
// Do not delete or change them. To get information about a particular security
|
||||||
|
// group, use the DescribeSecurityGroups (https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSecurityGroups.html)
|
||||||
|
// operation.
|
||||||
|
//
|
||||||
|
// * The cluster must contain at least as many HSMs as the operation requires.
|
||||||
|
// To add HSMs, use the AWS CloudHSM CreateHsm (https://docs.aws.amazon.com/cloudhsm/latest/APIReference/API_CreateHsm.html)
|
||||||
|
// operation. For the CreateCustomKeyStore, UpdateCustomKeyStore, and CreateKey
|
||||||
|
// operations, the AWS CloudHSM cluster must have at least two active HSMs,
|
||||||
|
// each in a different Availability Zone. For the ConnectCustomKeyStore operation,
|
||||||
|
// the AWS CloudHSM must contain at least one active HSM.
|
||||||
|
//
|
||||||
|
// For information about the requirements for an AWS CloudHSM cluster that is
|
||||||
|
// associated with a custom key store, see Assemble the Prerequisites (https://docs.aws.amazon.com/kms/latest/developerguide/create-keystore.html#before-keystore)
|
||||||
|
// in the AWS Key Management Service Developer Guide. For information about
|
||||||
|
// creating a private subnet for an AWS CloudHSM cluster, see Create a Private
|
||||||
|
// Subnet (https://docs.aws.amazon.com/cloudhsm/latest/userguide/create-subnets.html)
|
||||||
|
// in the AWS CloudHSM User Guide. For information about cluster security groups,
|
||||||
|
// see Configure a Default Security Group (https://docs.aws.amazon.com/cloudhsm/latest/userguide/configure-sg.html)
|
||||||
|
// in the AWS CloudHSM User Guide .
|
||||||
|
ErrCodeCloudHsmClusterInvalidConfigurationException = "CloudHsmClusterInvalidConfigurationException"
|
||||||
|
|
||||||
|
// ErrCodeCloudHsmClusterNotActiveException for service response error code
|
||||||
|
// "CloudHsmClusterNotActiveException".
|
||||||
|
//
|
||||||
|
// The request was rejected because the AWS CloudHSM cluster that is associated
|
||||||
|
// with the custom key store is not active. Initialize and activate the cluster
|
||||||
|
// and try the command again. For detailed instructions, see Getting Started
|
||||||
|
// (https://docs.aws.amazon.com/cloudhsm/latest/userguide/getting-started.html)
|
||||||
|
// in the AWS CloudHSM User Guide.
|
||||||
|
ErrCodeCloudHsmClusterNotActiveException = "CloudHsmClusterNotActiveException"
|
||||||
|
|
||||||
|
// ErrCodeCloudHsmClusterNotFoundException for service response error code
|
||||||
|
// "CloudHsmClusterNotFoundException".
|
||||||
|
//
|
||||||
|
// The request was rejected because AWS KMS cannot find the AWS CloudHSM cluster
|
||||||
|
// with the specified cluster ID. Retry the request with a different cluster
|
||||||
|
// ID.
|
||||||
|
ErrCodeCloudHsmClusterNotFoundException = "CloudHsmClusterNotFoundException"
|
||||||
|
|
||||||
|
// ErrCodeCloudHsmClusterNotRelatedException for service response error code
|
||||||
|
// "CloudHsmClusterNotRelatedException".
|
||||||
|
//
|
||||||
|
// The request was rejected because the specified AWS CloudHSM cluster has a
|
||||||
|
// different cluster certificate than the original cluster. You cannot use the
|
||||||
|
// operation to specify an unrelated cluster.
|
||||||
|
//
|
||||||
|
// Specify a cluster that shares a backup history with the original cluster.
|
||||||
|
// This includes clusters that were created from a backup of the current cluster,
|
||||||
|
// and clusters that were created from the same backup that produced the current
|
||||||
|
// cluster.
|
||||||
|
//
|
||||||
|
// Clusters that share a backup history have the same cluster certificate. To
|
||||||
|
// view the cluster certificate of a cluster, use the DescribeClusters (https://docs.aws.amazon.com/cloudhsm/latest/APIReference/API_DescribeClusters.html)
|
||||||
|
// operation.
|
||||||
|
ErrCodeCloudHsmClusterNotRelatedException = "CloudHsmClusterNotRelatedException"
|
||||||
|
|
||||||
|
// ErrCodeCustomKeyStoreHasCMKsException for service response error code
|
||||||
|
// "CustomKeyStoreHasCMKsException".
|
||||||
|
//
|
||||||
|
// The request was rejected because the custom key store contains AWS KMS customer
|
||||||
|
// master keys (CMKs). After verifying that you do not need to use the CMKs,
|
||||||
|
// use the ScheduleKeyDeletion operation to delete the CMKs. After they are
|
||||||
|
// deleted, you can delete the custom key store.
|
||||||
|
ErrCodeCustomKeyStoreHasCMKsException = "CustomKeyStoreHasCMKsException"
|
||||||
|
|
||||||
|
// ErrCodeCustomKeyStoreInvalidStateException for service response error code
|
||||||
|
// "CustomKeyStoreInvalidStateException".
|
||||||
|
//
|
||||||
|
// The request was rejected because of the ConnectionState of the custom key
|
||||||
|
// store. To get the ConnectionState of a custom key store, use the DescribeCustomKeyStores
|
||||||
|
// operation.
|
||||||
|
//
|
||||||
|
// This exception is thrown under the following conditions:
|
||||||
|
//
|
||||||
|
// * You requested the CreateKey or GenerateRandom operation in a custom
|
||||||
|
// key store that is not connected. These operations are valid only when
|
||||||
|
// the custom key store ConnectionState is CONNECTED.
|
||||||
|
//
|
||||||
|
// * You requested the UpdateCustomKeyStore or DeleteCustomKeyStore operation
|
||||||
|
// on a custom key store that is not disconnected. This operation is valid
|
||||||
|
// only when the custom key store ConnectionState is DISCONNECTED.
|
||||||
|
//
|
||||||
|
// * You requested the ConnectCustomKeyStore operation on a custom key store
|
||||||
|
// with a ConnectionState of DISCONNECTING or FAILED. This operation is valid
|
||||||
|
// for all other ConnectionState values.
|
||||||
|
ErrCodeCustomKeyStoreInvalidStateException = "CustomKeyStoreInvalidStateException"
|
||||||
|
|
||||||
|
// ErrCodeCustomKeyStoreNameInUseException for service response error code
|
||||||
|
// "CustomKeyStoreNameInUseException".
|
||||||
|
//
|
||||||
|
// The request was rejected because the specified custom key store name is already
|
||||||
|
// assigned to another custom key store in the account. Try again with a custom
|
||||||
|
// key store name that is unique in the account.
|
||||||
|
ErrCodeCustomKeyStoreNameInUseException = "CustomKeyStoreNameInUseException"
|
||||||
|
|
||||||
|
// ErrCodeCustomKeyStoreNotFoundException for service response error code
|
||||||
|
// "CustomKeyStoreNotFoundException".
|
||||||
|
//
|
||||||
|
// The request was rejected because AWS KMS cannot find a custom key store with
|
||||||
|
// the specified key store name or ID.
|
||||||
|
ErrCodeCustomKeyStoreNotFoundException = "CustomKeyStoreNotFoundException"
|
||||||
|
|
||||||
|
// ErrCodeDependencyTimeoutException for service response error code
|
||||||
|
// "DependencyTimeoutException".
|
||||||
|
//
|
||||||
|
// The system timed out while trying to fulfill the request. The request can
|
||||||
|
// be retried.
|
||||||
|
ErrCodeDependencyTimeoutException = "DependencyTimeoutException"
|
||||||
|
|
||||||
|
// ErrCodeDisabledException for service response error code
|
||||||
|
// "DisabledException".
|
||||||
|
//
|
||||||
|
// The request was rejected because the specified CMK is not enabled.
|
||||||
|
ErrCodeDisabledException = "DisabledException"
|
||||||
|
|
||||||
|
// ErrCodeExpiredImportTokenException for service response error code
|
||||||
|
// "ExpiredImportTokenException".
|
||||||
|
//
|
||||||
|
// The request was rejected because the specified import token is expired. Use
|
||||||
|
// GetParametersForImport to get a new import token and public key, use the
|
||||||
|
// new public key to encrypt the key material, and then try the request again.
|
||||||
|
ErrCodeExpiredImportTokenException = "ExpiredImportTokenException"
|
||||||
|
|
||||||
|
// ErrCodeIncorrectKeyException for service response error code
|
||||||
|
// "IncorrectKeyException".
|
||||||
|
//
|
||||||
|
// The request was rejected because the specified CMK cannot decrypt the data.
|
||||||
|
// The KeyId in a Decrypt request and the SourceKeyId in a ReEncrypt request
|
||||||
|
// must identify the same CMK that was used to encrypt the ciphertext.
|
||||||
|
ErrCodeIncorrectKeyException = "IncorrectKeyException"
|
||||||
|
|
||||||
|
// ErrCodeIncorrectKeyMaterialException for service response error code
|
||||||
|
// "IncorrectKeyMaterialException".
|
||||||
|
//
|
||||||
|
// The request was rejected because the key material in the request is, expired,
|
||||||
|
// invalid, or is not the same key material that was previously imported into
|
||||||
|
// this customer master key (CMK).
|
||||||
|
ErrCodeIncorrectKeyMaterialException = "IncorrectKeyMaterialException"
|
||||||
|
|
||||||
|
// ErrCodeIncorrectTrustAnchorException for service response error code
|
||||||
|
// "IncorrectTrustAnchorException".
|
||||||
|
//
|
||||||
|
// The request was rejected because the trust anchor certificate in the request
|
||||||
|
// is not the trust anchor certificate for the specified AWS CloudHSM cluster.
|
||||||
|
//
|
||||||
|
// When you initialize the cluster (https://docs.aws.amazon.com/cloudhsm/latest/userguide/initialize-cluster.html#sign-csr),
|
||||||
|
// you create the trust anchor certificate and save it in the customerCA.crt
|
||||||
|
// file.
|
||||||
|
ErrCodeIncorrectTrustAnchorException = "IncorrectTrustAnchorException"
|
||||||
|
|
||||||
|
// ErrCodeInternalException for service response error code
|
||||||
|
// "KMSInternalException".
|
||||||
|
//
|
||||||
|
// The request was rejected because an internal exception occurred. The request
|
||||||
|
// can be retried.
|
||||||
|
ErrCodeInternalException = "KMSInternalException"
|
||||||
|
|
||||||
|
// ErrCodeInvalidAliasNameException for service response error code
|
||||||
|
// "InvalidAliasNameException".
|
||||||
|
//
|
||||||
|
// The request was rejected because the specified alias name is not valid.
|
||||||
|
ErrCodeInvalidAliasNameException = "InvalidAliasNameException"
|
||||||
|
|
||||||
|
// ErrCodeInvalidArnException for service response error code
|
||||||
|
// "InvalidArnException".
|
||||||
|
//
|
||||||
|
// The request was rejected because a specified ARN, or an ARN in a key policy,
|
||||||
|
// is not valid.
|
||||||
|
ErrCodeInvalidArnException = "InvalidArnException"
|
||||||
|
|
||||||
|
// ErrCodeInvalidCiphertextException for service response error code
|
||||||
|
// "InvalidCiphertextException".
|
||||||
|
//
|
||||||
|
// From the Decrypt or ReEncrypt operation, the request was rejected because
|
||||||
|
// the specified ciphertext, or additional authenticated data incorporated into
|
||||||
|
// the ciphertext, such as the encryption context, is corrupted, missing, or
|
||||||
|
// otherwise invalid.
|
||||||
|
//
|
||||||
|
// From the ImportKeyMaterial operation, the request was rejected because AWS
|
||||||
|
// KMS could not decrypt the encrypted (wrapped) key material.
|
||||||
|
ErrCodeInvalidCiphertextException = "InvalidCiphertextException"
|
||||||
|
|
||||||
|
// ErrCodeInvalidGrantIdException for service response error code
|
||||||
|
// "InvalidGrantIdException".
|
||||||
|
//
|
||||||
|
// The request was rejected because the specified GrantId is not valid.
|
||||||
|
ErrCodeInvalidGrantIdException = "InvalidGrantIdException"
|
||||||
|
|
||||||
|
// ErrCodeInvalidGrantTokenException for service response error code
|
||||||
|
// "InvalidGrantTokenException".
|
||||||
|
//
|
||||||
|
// The request was rejected because the specified grant token is not valid.
|
||||||
|
ErrCodeInvalidGrantTokenException = "InvalidGrantTokenException"
|
||||||
|
|
||||||
|
// ErrCodeInvalidImportTokenException for service response error code
|
||||||
|
// "InvalidImportTokenException".
|
||||||
|
//
|
||||||
|
// The request was rejected because the provided import token is invalid or
|
||||||
|
// is associated with a different customer master key (CMK).
|
||||||
|
ErrCodeInvalidImportTokenException = "InvalidImportTokenException"
|
||||||
|
|
||||||
|
// ErrCodeInvalidKeyUsageException for service response error code
|
||||||
|
// "InvalidKeyUsageException".
|
||||||
|
//
|
||||||
|
// The request was rejected for one of the following reasons:
|
||||||
|
//
|
||||||
|
// * The KeyUsage value of the CMK is incompatible with the API operation.
|
||||||
|
//
|
||||||
|
// * The encryption algorithm or signing algorithm specified for the operation
|
||||||
|
// is incompatible with the type of key material in the CMK (CustomerMasterKeySpec).
|
||||||
|
//
|
||||||
|
// For encrypting, decrypting, re-encrypting, and generating data keys, the
|
||||||
|
// KeyUsage must be ENCRYPT_DECRYPT. For signing and verifying, the KeyUsage
|
||||||
|
// must be SIGN_VERIFY. To find the KeyUsage of a CMK, use the DescribeKey operation.
|
||||||
|
//
|
||||||
|
// To find the encryption or signing algorithms supported for a particular CMK,
|
||||||
|
// use the DescribeKey operation.
|
||||||
|
ErrCodeInvalidKeyUsageException = "InvalidKeyUsageException"
|
||||||
|
|
||||||
|
// ErrCodeInvalidMarkerException for service response error code
|
||||||
|
// "InvalidMarkerException".
|
||||||
|
//
|
||||||
|
// The request was rejected because the marker that specifies where pagination
|
||||||
|
// should next begin is not valid.
|
||||||
|
ErrCodeInvalidMarkerException = "InvalidMarkerException"
|
||||||
|
|
||||||
|
// ErrCodeInvalidStateException for service response error code
|
||||||
|
// "KMSInvalidStateException".
|
||||||
|
//
|
||||||
|
// The request was rejected because the state of the specified resource is not
|
||||||
|
// valid for this request.
|
||||||
|
//
|
||||||
|
// For more information about how key state affects the use of a CMK, see How
|
||||||
|
// Key State Affects Use of a Customer Master Key (https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html)
|
||||||
|
// in the AWS Key Management Service Developer Guide .
|
||||||
|
ErrCodeInvalidStateException = "KMSInvalidStateException"
|
||||||
|
|
||||||
|
// ErrCodeKMSInvalidSignatureException for service response error code
|
||||||
|
// "KMSInvalidSignatureException".
|
||||||
|
//
|
||||||
|
// The request was rejected because the signature verification failed. Signature
|
||||||
|
// verification fails when it cannot confirm that signature was produced by
|
||||||
|
// signing the specified message with the specified CMK and signing algorithm.
|
||||||
|
ErrCodeKMSInvalidSignatureException = "KMSInvalidSignatureException"
|
||||||
|
|
||||||
|
// ErrCodeKeyUnavailableException for service response error code
|
||||||
|
// "KeyUnavailableException".
|
||||||
|
//
|
||||||
|
// The request was rejected because the specified CMK was not available. You
|
||||||
|
// can retry the request.
|
||||||
|
ErrCodeKeyUnavailableException = "KeyUnavailableException"
|
||||||
|
|
||||||
|
// ErrCodeLimitExceededException for service response error code
|
||||||
|
// "LimitExceededException".
|
||||||
|
//
|
||||||
|
// The request was rejected because a quota was exceeded. For more information,
|
||||||
|
// see Quotas (https://docs.aws.amazon.com/kms/latest/developerguide/limits.html)
|
||||||
|
// in the AWS Key Management Service Developer Guide.
|
||||||
|
ErrCodeLimitExceededException = "LimitExceededException"
|
||||||
|
|
||||||
|
// ErrCodeMalformedPolicyDocumentException for service response error code
|
||||||
|
// "MalformedPolicyDocumentException".
|
||||||
|
//
|
||||||
|
// The request was rejected because the specified policy is not syntactically
|
||||||
|
// or semantically correct.
|
||||||
|
ErrCodeMalformedPolicyDocumentException = "MalformedPolicyDocumentException"
|
||||||
|
|
||||||
|
// ErrCodeNotFoundException for service response error code
|
||||||
|
// "NotFoundException".
|
||||||
|
//
|
||||||
|
// The request was rejected because the specified entity or resource could not
|
||||||
|
// be found.
|
||||||
|
ErrCodeNotFoundException = "NotFoundException"
|
||||||
|
|
||||||
|
// ErrCodeTagException for service response error code
|
||||||
|
// "TagException".
|
||||||
|
//
|
||||||
|
// The request was rejected because one or more tags are not valid.
|
||||||
|
ErrCodeTagException = "TagException"
|
||||||
|
|
||||||
|
// ErrCodeUnsupportedOperationException for service response error code
|
||||||
|
// "UnsupportedOperationException".
|
||||||
|
//
|
||||||
|
// The request was rejected because a specified parameter is not supported or
|
||||||
|
// a specified resource is not valid for this operation.
|
||||||
|
ErrCodeUnsupportedOperationException = "UnsupportedOperationException"
|
||||||
|
)
|
||||||
|
|
||||||
|
var exceptionFromCode = map[string]func(protocol.ResponseMetadata) error{
|
||||||
|
"AlreadyExistsException": newErrorAlreadyExistsException,
|
||||||
|
"CloudHsmClusterInUseException": newErrorCloudHsmClusterInUseException,
|
||||||
|
"CloudHsmClusterInvalidConfigurationException": newErrorCloudHsmClusterInvalidConfigurationException,
|
||||||
|
"CloudHsmClusterNotActiveException": newErrorCloudHsmClusterNotActiveException,
|
||||||
|
"CloudHsmClusterNotFoundException": newErrorCloudHsmClusterNotFoundException,
|
||||||
|
"CloudHsmClusterNotRelatedException": newErrorCloudHsmClusterNotRelatedException,
|
||||||
|
"CustomKeyStoreHasCMKsException": newErrorCustomKeyStoreHasCMKsException,
|
||||||
|
"CustomKeyStoreInvalidStateException": newErrorCustomKeyStoreInvalidStateException,
|
||||||
|
"CustomKeyStoreNameInUseException": newErrorCustomKeyStoreNameInUseException,
|
||||||
|
"CustomKeyStoreNotFoundException": newErrorCustomKeyStoreNotFoundException,
|
||||||
|
"DependencyTimeoutException": newErrorDependencyTimeoutException,
|
||||||
|
"DisabledException": newErrorDisabledException,
|
||||||
|
"ExpiredImportTokenException": newErrorExpiredImportTokenException,
|
||||||
|
"IncorrectKeyException": newErrorIncorrectKeyException,
|
||||||
|
"IncorrectKeyMaterialException": newErrorIncorrectKeyMaterialException,
|
||||||
|
"IncorrectTrustAnchorException": newErrorIncorrectTrustAnchorException,
|
||||||
|
"KMSInternalException": newErrorInternalException,
|
||||||
|
"InvalidAliasNameException": newErrorInvalidAliasNameException,
|
||||||
|
"InvalidArnException": newErrorInvalidArnException,
|
||||||
|
"InvalidCiphertextException": newErrorInvalidCiphertextException,
|
||||||
|
"InvalidGrantIdException": newErrorInvalidGrantIdException,
|
||||||
|
"InvalidGrantTokenException": newErrorInvalidGrantTokenException,
|
||||||
|
"InvalidImportTokenException": newErrorInvalidImportTokenException,
|
||||||
|
"InvalidKeyUsageException": newErrorInvalidKeyUsageException,
|
||||||
|
"InvalidMarkerException": newErrorInvalidMarkerException,
|
||||||
|
"KMSInvalidStateException": newErrorInvalidStateException,
|
||||||
|
"KMSInvalidSignatureException": newErrorKMSInvalidSignatureException,
|
||||||
|
"KeyUnavailableException": newErrorKeyUnavailableException,
|
||||||
|
"LimitExceededException": newErrorLimitExceededException,
|
||||||
|
"MalformedPolicyDocumentException": newErrorMalformedPolicyDocumentException,
|
||||||
|
"NotFoundException": newErrorNotFoundException,
|
||||||
|
"TagException": newErrorTagException,
|
||||||
|
"UnsupportedOperationException": newErrorUnsupportedOperationException,
|
||||||
|
}
|
103
vendor/github.com/aws/aws-sdk-go/service/kms/service.go
generated
vendored
Normal file
103
vendor/github.com/aws/aws-sdk-go/service/kms/service.go
generated
vendored
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT.
|
||||||
|
|
||||||
|
package kms
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/client"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/client/metadata"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/request"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/signer/v4"
|
||||||
|
"github.com/aws/aws-sdk-go/private/protocol"
|
||||||
|
"github.com/aws/aws-sdk-go/private/protocol/jsonrpc"
|
||||||
|
)
|
||||||
|
|
||||||
|
// KMS provides the API operation methods for making requests to
|
||||||
|
// AWS Key Management Service. See this package's package overview docs
|
||||||
|
// for details on the service.
|
||||||
|
//
|
||||||
|
// KMS methods are safe to use concurrently. It is not safe to
|
||||||
|
// modify mutate any of the struct's properties though.
|
||||||
|
type KMS struct {
|
||||||
|
*client.Client
|
||||||
|
}
|
||||||
|
|
||||||
|
// Used for custom client initialization logic
|
||||||
|
var initClient func(*client.Client)
|
||||||
|
|
||||||
|
// Used for custom request initialization logic
|
||||||
|
var initRequest func(*request.Request)
|
||||||
|
|
||||||
|
// Service information constants
|
||||||
|
const (
|
||||||
|
ServiceName = "kms" // Name of service.
|
||||||
|
EndpointsID = ServiceName // ID to lookup a service endpoint with.
|
||||||
|
ServiceID = "KMS" // ServiceID is a unique identifier of a specific service.
|
||||||
|
)
|
||||||
|
|
||||||
|
// New creates a new instance of the KMS client with a session.
|
||||||
|
// If additional configuration is needed for the client instance use the optional
|
||||||
|
// aws.Config parameter to add your extra config.
|
||||||
|
//
|
||||||
|
// Example:
|
||||||
|
// mySession := session.Must(session.NewSession())
|
||||||
|
//
|
||||||
|
// // Create a KMS client from just a session.
|
||||||
|
// svc := kms.New(mySession)
|
||||||
|
//
|
||||||
|
// // Create a KMS client with additional configuration
|
||||||
|
// svc := kms.New(mySession, aws.NewConfig().WithRegion("us-west-2"))
|
||||||
|
func New(p client.ConfigProvider, cfgs ...*aws.Config) *KMS {
|
||||||
|
c := p.ClientConfig(EndpointsID, cfgs...)
|
||||||
|
return newClient(*c.Config, c.Handlers, c.PartitionID, c.Endpoint, c.SigningRegion, c.SigningName)
|
||||||
|
}
|
||||||
|
|
||||||
|
// newClient creates, initializes and returns a new service client instance.
|
||||||
|
func newClient(cfg aws.Config, handlers request.Handlers, partitionID, endpoint, signingRegion, signingName string) *KMS {
|
||||||
|
svc := &KMS{
|
||||||
|
Client: client.New(
|
||||||
|
cfg,
|
||||||
|
metadata.ClientInfo{
|
||||||
|
ServiceName: ServiceName,
|
||||||
|
ServiceID: ServiceID,
|
||||||
|
SigningName: signingName,
|
||||||
|
SigningRegion: signingRegion,
|
||||||
|
PartitionID: partitionID,
|
||||||
|
Endpoint: endpoint,
|
||||||
|
APIVersion: "2014-11-01",
|
||||||
|
JSONVersion: "1.1",
|
||||||
|
TargetPrefix: "TrentService",
|
||||||
|
},
|
||||||
|
handlers,
|
||||||
|
),
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handlers
|
||||||
|
svc.Handlers.Sign.PushBackNamed(v4.SignRequestHandler)
|
||||||
|
svc.Handlers.Build.PushBackNamed(jsonrpc.BuildHandler)
|
||||||
|
svc.Handlers.Unmarshal.PushBackNamed(jsonrpc.UnmarshalHandler)
|
||||||
|
svc.Handlers.UnmarshalMeta.PushBackNamed(jsonrpc.UnmarshalMetaHandler)
|
||||||
|
svc.Handlers.UnmarshalError.PushBackNamed(
|
||||||
|
protocol.NewUnmarshalErrorHandler(jsonrpc.NewUnmarshalTypedError(exceptionFromCode)).NamedHandler(),
|
||||||
|
)
|
||||||
|
|
||||||
|
// Run custom client initialization if present
|
||||||
|
if initClient != nil {
|
||||||
|
initClient(svc.Client)
|
||||||
|
}
|
||||||
|
|
||||||
|
return svc
|
||||||
|
}
|
||||||
|
|
||||||
|
// newRequest creates a new request for a KMS operation and runs any
|
||||||
|
// custom request initialization.
|
||||||
|
func (c *KMS) newRequest(op *request.Operation, params, data interface{}) *request.Request {
|
||||||
|
req := c.NewRequest(op, params, data)
|
||||||
|
|
||||||
|
// Run custom request initialization if present
|
||||||
|
if initRequest != nil {
|
||||||
|
initRequest(req)
|
||||||
|
}
|
||||||
|
|
||||||
|
return req
|
||||||
|
}
|
1210
vendor/github.com/aws/aws-sdk-go/service/sso/api.go
generated
vendored
Normal file
1210
vendor/github.com/aws/aws-sdk-go/service/sso/api.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
44
vendor/github.com/aws/aws-sdk-go/service/sso/doc.go
generated
vendored
Normal file
44
vendor/github.com/aws/aws-sdk-go/service/sso/doc.go
generated
vendored
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT.
|
||||||
|
|
||||||
|
// Package sso provides the client and types for making API
|
||||||
|
// requests to AWS Single Sign-On.
|
||||||
|
//
|
||||||
|
// AWS Single Sign-On Portal is a web service that makes it easy for you to
|
||||||
|
// assign user access to AWS SSO resources such as the user portal. Users can
|
||||||
|
// get AWS account applications and roles assigned to them and get federated
|
||||||
|
// into the application.
|
||||||
|
//
|
||||||
|
// For general information about AWS SSO, see What is AWS Single Sign-On? (https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html)
|
||||||
|
// in the AWS SSO User Guide.
|
||||||
|
//
|
||||||
|
// This API reference guide describes the AWS SSO Portal operations that you
|
||||||
|
// can call programatically and includes detailed information on data types
|
||||||
|
// and errors.
|
||||||
|
//
|
||||||
|
// AWS provides SDKs that consist of libraries and sample code for various programming
|
||||||
|
// languages and platforms, such as Java, Ruby, .Net, iOS, or Android. The SDKs
|
||||||
|
// provide a convenient way to create programmatic access to AWS SSO and other
|
||||||
|
// AWS services. For more information about the AWS SDKs, including how to download
|
||||||
|
// and install them, see Tools for Amazon Web Services (http://aws.amazon.com/tools/).
|
||||||
|
//
|
||||||
|
// See https://docs.aws.amazon.com/goto/WebAPI/sso-2019-06-10 for more information on this service.
|
||||||
|
//
|
||||||
|
// See sso package documentation for more information.
|
||||||
|
// https://docs.aws.amazon.com/sdk-for-go/api/service/sso/
|
||||||
|
//
|
||||||
|
// Using the Client
|
||||||
|
//
|
||||||
|
// To contact AWS Single Sign-On with the SDK use the New function to create
|
||||||
|
// a new service client. With that client you can make API requests to the service.
|
||||||
|
// These clients are safe to use concurrently.
|
||||||
|
//
|
||||||
|
// See the SDK's documentation for more information on how to use the SDK.
|
||||||
|
// https://docs.aws.amazon.com/sdk-for-go/api/
|
||||||
|
//
|
||||||
|
// See aws.Config documentation for more information on configuring SDK clients.
|
||||||
|
// https://docs.aws.amazon.com/sdk-for-go/api/aws/#Config
|
||||||
|
//
|
||||||
|
// See the AWS Single Sign-On client SSO for more
|
||||||
|
// information on creating client for this service.
|
||||||
|
// https://docs.aws.amazon.com/sdk-for-go/api/service/sso/#New
|
||||||
|
package sso
|
44
vendor/github.com/aws/aws-sdk-go/service/sso/errors.go
generated
vendored
Normal file
44
vendor/github.com/aws/aws-sdk-go/service/sso/errors.go
generated
vendored
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT.
|
||||||
|
|
||||||
|
package sso
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/aws/aws-sdk-go/private/protocol"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
|
||||||
|
// ErrCodeInvalidRequestException for service response error code
|
||||||
|
// "InvalidRequestException".
|
||||||
|
//
|
||||||
|
// Indicates that a problem occurred with the input to the request. For example,
|
||||||
|
// a required parameter might be missing or out of range.
|
||||||
|
ErrCodeInvalidRequestException = "InvalidRequestException"
|
||||||
|
|
||||||
|
// ErrCodeResourceNotFoundException for service response error code
|
||||||
|
// "ResourceNotFoundException".
|
||||||
|
//
|
||||||
|
// The specified resource doesn't exist.
|
||||||
|
ErrCodeResourceNotFoundException = "ResourceNotFoundException"
|
||||||
|
|
||||||
|
// ErrCodeTooManyRequestsException for service response error code
|
||||||
|
// "TooManyRequestsException".
|
||||||
|
//
|
||||||
|
// Indicates that the request is being made too frequently and is more than
|
||||||
|
// what the server can handle.
|
||||||
|
ErrCodeTooManyRequestsException = "TooManyRequestsException"
|
||||||
|
|
||||||
|
// ErrCodeUnauthorizedException for service response error code
|
||||||
|
// "UnauthorizedException".
|
||||||
|
//
|
||||||
|
// Indicates that the request is not authorized. This can happen due to an invalid
|
||||||
|
// access token in the request.
|
||||||
|
ErrCodeUnauthorizedException = "UnauthorizedException"
|
||||||
|
)
|
||||||
|
|
||||||
|
var exceptionFromCode = map[string]func(protocol.ResponseMetadata) error{
|
||||||
|
"InvalidRequestException": newErrorInvalidRequestException,
|
||||||
|
"ResourceNotFoundException": newErrorResourceNotFoundException,
|
||||||
|
"TooManyRequestsException": newErrorTooManyRequestsException,
|
||||||
|
"UnauthorizedException": newErrorUnauthorizedException,
|
||||||
|
}
|
104
vendor/github.com/aws/aws-sdk-go/service/sso/service.go
generated
vendored
Normal file
104
vendor/github.com/aws/aws-sdk-go/service/sso/service.go
generated
vendored
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT.
|
||||||
|
|
||||||
|
package sso
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/client"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/client/metadata"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/request"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/signer/v4"
|
||||||
|
"github.com/aws/aws-sdk-go/private/protocol"
|
||||||
|
"github.com/aws/aws-sdk-go/private/protocol/restjson"
|
||||||
|
)
|
||||||
|
|
||||||
|
// SSO provides the API operation methods for making requests to
|
||||||
|
// AWS Single Sign-On. See this package's package overview docs
|
||||||
|
// for details on the service.
|
||||||
|
//
|
||||||
|
// SSO methods are safe to use concurrently. It is not safe to
|
||||||
|
// modify mutate any of the struct's properties though.
|
||||||
|
type SSO struct {
|
||||||
|
*client.Client
|
||||||
|
}
|
||||||
|
|
||||||
|
// Used for custom client initialization logic
|
||||||
|
var initClient func(*client.Client)
|
||||||
|
|
||||||
|
// Used for custom request initialization logic
|
||||||
|
var initRequest func(*request.Request)
|
||||||
|
|
||||||
|
// Service information constants
|
||||||
|
const (
|
||||||
|
ServiceName = "SSO" // Name of service.
|
||||||
|
EndpointsID = "portal.sso" // ID to lookup a service endpoint with.
|
||||||
|
ServiceID = "SSO" // ServiceID is a unique identifier of a specific service.
|
||||||
|
)
|
||||||
|
|
||||||
|
// New creates a new instance of the SSO client with a session.
|
||||||
|
// If additional configuration is needed for the client instance use the optional
|
||||||
|
// aws.Config parameter to add your extra config.
|
||||||
|
//
|
||||||
|
// Example:
|
||||||
|
// mySession := session.Must(session.NewSession())
|
||||||
|
//
|
||||||
|
// // Create a SSO client from just a session.
|
||||||
|
// svc := sso.New(mySession)
|
||||||
|
//
|
||||||
|
// // Create a SSO client with additional configuration
|
||||||
|
// svc := sso.New(mySession, aws.NewConfig().WithRegion("us-west-2"))
|
||||||
|
func New(p client.ConfigProvider, cfgs ...*aws.Config) *SSO {
|
||||||
|
c := p.ClientConfig(EndpointsID, cfgs...)
|
||||||
|
if c.SigningNameDerived || len(c.SigningName) == 0 {
|
||||||
|
c.SigningName = "awsssoportal"
|
||||||
|
}
|
||||||
|
return newClient(*c.Config, c.Handlers, c.PartitionID, c.Endpoint, c.SigningRegion, c.SigningName)
|
||||||
|
}
|
||||||
|
|
||||||
|
// newClient creates, initializes and returns a new service client instance.
|
||||||
|
func newClient(cfg aws.Config, handlers request.Handlers, partitionID, endpoint, signingRegion, signingName string) *SSO {
|
||||||
|
svc := &SSO{
|
||||||
|
Client: client.New(
|
||||||
|
cfg,
|
||||||
|
metadata.ClientInfo{
|
||||||
|
ServiceName: ServiceName,
|
||||||
|
ServiceID: ServiceID,
|
||||||
|
SigningName: signingName,
|
||||||
|
SigningRegion: signingRegion,
|
||||||
|
PartitionID: partitionID,
|
||||||
|
Endpoint: endpoint,
|
||||||
|
APIVersion: "2019-06-10",
|
||||||
|
},
|
||||||
|
handlers,
|
||||||
|
),
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handlers
|
||||||
|
svc.Handlers.Sign.PushBackNamed(v4.SignRequestHandler)
|
||||||
|
svc.Handlers.Build.PushBackNamed(restjson.BuildHandler)
|
||||||
|
svc.Handlers.Unmarshal.PushBackNamed(restjson.UnmarshalHandler)
|
||||||
|
svc.Handlers.UnmarshalMeta.PushBackNamed(restjson.UnmarshalMetaHandler)
|
||||||
|
svc.Handlers.UnmarshalError.PushBackNamed(
|
||||||
|
protocol.NewUnmarshalErrorHandler(restjson.NewUnmarshalTypedError(exceptionFromCode)).NamedHandler(),
|
||||||
|
)
|
||||||
|
|
||||||
|
// Run custom client initialization if present
|
||||||
|
if initClient != nil {
|
||||||
|
initClient(svc.Client)
|
||||||
|
}
|
||||||
|
|
||||||
|
return svc
|
||||||
|
}
|
||||||
|
|
||||||
|
// newRequest creates a new request for a SSO operation and runs any
|
||||||
|
// custom request initialization.
|
||||||
|
func (c *SSO) newRequest(op *request.Operation, params, data interface{}) *request.Request {
|
||||||
|
req := c.NewRequest(op, params, data)
|
||||||
|
|
||||||
|
// Run custom request initialization if present
|
||||||
|
if initRequest != nil {
|
||||||
|
initRequest(req)
|
||||||
|
}
|
||||||
|
|
||||||
|
return req
|
||||||
|
}
|
86
vendor/github.com/aws/aws-sdk-go/service/sso/ssoiface/interface.go
generated
vendored
Normal file
86
vendor/github.com/aws/aws-sdk-go/service/sso/ssoiface/interface.go
generated
vendored
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT.
|
||||||
|
|
||||||
|
// Package ssoiface provides an interface to enable mocking the AWS Single Sign-On service client
|
||||||
|
// for testing your code.
|
||||||
|
//
|
||||||
|
// It is important to note that this interface will have breaking changes
|
||||||
|
// when the service model is updated and adds new API operations, paginators,
|
||||||
|
// and waiters.
|
||||||
|
package ssoiface
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/request"
|
||||||
|
"github.com/aws/aws-sdk-go/service/sso"
|
||||||
|
)
|
||||||
|
|
||||||
|
// SSOAPI provides an interface to enable mocking the
|
||||||
|
// sso.SSO service client's API operation,
|
||||||
|
// paginators, and waiters. This make unit testing your code that calls out
|
||||||
|
// to the SDK's service client's calls easier.
|
||||||
|
//
|
||||||
|
// The best way to use this interface is so the SDK's service client's calls
|
||||||
|
// can be stubbed out for unit testing your code with the SDK without needing
|
||||||
|
// to inject custom request handlers into the SDK's request pipeline.
|
||||||
|
//
|
||||||
|
// // myFunc uses an SDK service client to make a request to
|
||||||
|
// // AWS Single Sign-On.
|
||||||
|
// func myFunc(svc ssoiface.SSOAPI) bool {
|
||||||
|
// // Make svc.GetRoleCredentials request
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// func main() {
|
||||||
|
// sess := session.New()
|
||||||
|
// svc := sso.New(sess)
|
||||||
|
//
|
||||||
|
// myFunc(svc)
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// In your _test.go file:
|
||||||
|
//
|
||||||
|
// // Define a mock struct to be used in your unit tests of myFunc.
|
||||||
|
// type mockSSOClient struct {
|
||||||
|
// ssoiface.SSOAPI
|
||||||
|
// }
|
||||||
|
// func (m *mockSSOClient) GetRoleCredentials(input *sso.GetRoleCredentialsInput) (*sso.GetRoleCredentialsOutput, error) {
|
||||||
|
// // mock response/functionality
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// func TestMyFunc(t *testing.T) {
|
||||||
|
// // Setup Test
|
||||||
|
// mockSvc := &mockSSOClient{}
|
||||||
|
//
|
||||||
|
// myfunc(mockSvc)
|
||||||
|
//
|
||||||
|
// // Verify myFunc's functionality
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// It is important to note that this interface will have breaking changes
|
||||||
|
// when the service model is updated and adds new API operations, paginators,
|
||||||
|
// and waiters. Its suggested to use the pattern above for testing, or using
|
||||||
|
// tooling to generate mocks to satisfy the interfaces.
|
||||||
|
type SSOAPI interface {
|
||||||
|
GetRoleCredentials(*sso.GetRoleCredentialsInput) (*sso.GetRoleCredentialsOutput, error)
|
||||||
|
GetRoleCredentialsWithContext(aws.Context, *sso.GetRoleCredentialsInput, ...request.Option) (*sso.GetRoleCredentialsOutput, error)
|
||||||
|
GetRoleCredentialsRequest(*sso.GetRoleCredentialsInput) (*request.Request, *sso.GetRoleCredentialsOutput)
|
||||||
|
|
||||||
|
ListAccountRoles(*sso.ListAccountRolesInput) (*sso.ListAccountRolesOutput, error)
|
||||||
|
ListAccountRolesWithContext(aws.Context, *sso.ListAccountRolesInput, ...request.Option) (*sso.ListAccountRolesOutput, error)
|
||||||
|
ListAccountRolesRequest(*sso.ListAccountRolesInput) (*request.Request, *sso.ListAccountRolesOutput)
|
||||||
|
|
||||||
|
ListAccountRolesPages(*sso.ListAccountRolesInput, func(*sso.ListAccountRolesOutput, bool) bool) error
|
||||||
|
ListAccountRolesPagesWithContext(aws.Context, *sso.ListAccountRolesInput, func(*sso.ListAccountRolesOutput, bool) bool, ...request.Option) error
|
||||||
|
|
||||||
|
ListAccounts(*sso.ListAccountsInput) (*sso.ListAccountsOutput, error)
|
||||||
|
ListAccountsWithContext(aws.Context, *sso.ListAccountsInput, ...request.Option) (*sso.ListAccountsOutput, error)
|
||||||
|
ListAccountsRequest(*sso.ListAccountsInput) (*request.Request, *sso.ListAccountsOutput)
|
||||||
|
|
||||||
|
ListAccountsPages(*sso.ListAccountsInput, func(*sso.ListAccountsOutput, bool) bool) error
|
||||||
|
ListAccountsPagesWithContext(aws.Context, *sso.ListAccountsInput, func(*sso.ListAccountsOutput, bool) bool, ...request.Option) error
|
||||||
|
|
||||||
|
Logout(*sso.LogoutInput) (*sso.LogoutOutput, error)
|
||||||
|
LogoutWithContext(aws.Context, *sso.LogoutInput, ...request.Option) (*sso.LogoutOutput, error)
|
||||||
|
LogoutRequest(*sso.LogoutInput) (*request.Request, *sso.LogoutOutput)
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ SSOAPI = (*sso.SSO)(nil)
|
3119
vendor/github.com/aws/aws-sdk-go/service/sts/api.go
generated
vendored
Normal file
3119
vendor/github.com/aws/aws-sdk-go/service/sts/api.go
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
11
vendor/github.com/aws/aws-sdk-go/service/sts/customizations.go
generated
vendored
Normal file
11
vendor/github.com/aws/aws-sdk-go/service/sts/customizations.go
generated
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
package sts
|
||||||
|
|
||||||
|
import "github.com/aws/aws-sdk-go/aws/request"
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
initRequest = customizeRequest
|
||||||
|
}
|
||||||
|
|
||||||
|
func customizeRequest(r *request.Request) {
|
||||||
|
r.RetryErrorCodes = append(r.RetryErrorCodes, ErrCodeIDPCommunicationErrorException)
|
||||||
|
}
|
32
vendor/github.com/aws/aws-sdk-go/service/sts/doc.go
generated
vendored
Normal file
32
vendor/github.com/aws/aws-sdk-go/service/sts/doc.go
generated
vendored
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT.
|
||||||
|
|
||||||
|
// Package sts provides the client and types for making API
|
||||||
|
// requests to AWS Security Token Service.
|
||||||
|
//
|
||||||
|
// AWS Security Token Service (STS) enables you to request temporary, limited-privilege
|
||||||
|
// credentials for AWS Identity and Access Management (IAM) users or for users
|
||||||
|
// that you authenticate (federated users). This guide provides descriptions
|
||||||
|
// of the STS API. For more information about using this service, see Temporary
|
||||||
|
// Security Credentials (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html).
|
||||||
|
//
|
||||||
|
// See https://docs.aws.amazon.com/goto/WebAPI/sts-2011-06-15 for more information on this service.
|
||||||
|
//
|
||||||
|
// See sts package documentation for more information.
|
||||||
|
// https://docs.aws.amazon.com/sdk-for-go/api/service/sts/
|
||||||
|
//
|
||||||
|
// Using the Client
|
||||||
|
//
|
||||||
|
// To contact AWS Security Token Service with the SDK use the New function to create
|
||||||
|
// a new service client. With that client you can make API requests to the service.
|
||||||
|
// These clients are safe to use concurrently.
|
||||||
|
//
|
||||||
|
// See the SDK's documentation for more information on how to use the SDK.
|
||||||
|
// https://docs.aws.amazon.com/sdk-for-go/api/
|
||||||
|
//
|
||||||
|
// See aws.Config documentation for more information on configuring SDK clients.
|
||||||
|
// https://docs.aws.amazon.com/sdk-for-go/api/aws/#Config
|
||||||
|
//
|
||||||
|
// See the AWS Security Token Service client STS for more
|
||||||
|
// information on creating client for this service.
|
||||||
|
// https://docs.aws.amazon.com/sdk-for-go/api/service/sts/#New
|
||||||
|
package sts
|
82
vendor/github.com/aws/aws-sdk-go/service/sts/errors.go
generated
vendored
Normal file
82
vendor/github.com/aws/aws-sdk-go/service/sts/errors.go
generated
vendored
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT.
|
||||||
|
|
||||||
|
package sts
|
||||||
|
|
||||||
|
const (
|
||||||
|
|
||||||
|
// ErrCodeExpiredTokenException for service response error code
|
||||||
|
// "ExpiredTokenException".
|
||||||
|
//
|
||||||
|
// The web identity token that was passed is expired or is not valid. Get a
|
||||||
|
// new identity token from the identity provider and then retry the request.
|
||||||
|
ErrCodeExpiredTokenException = "ExpiredTokenException"
|
||||||
|
|
||||||
|
// ErrCodeIDPCommunicationErrorException for service response error code
|
||||||
|
// "IDPCommunicationError".
|
||||||
|
//
|
||||||
|
// The request could not be fulfilled because the identity provider (IDP) that
|
||||||
|
// was asked to verify the incoming identity token could not be reached. This
|
||||||
|
// is often a transient error caused by network conditions. Retry the request
|
||||||
|
// a limited number of times so that you don't exceed the request rate. If the
|
||||||
|
// error persists, the identity provider might be down or not responding.
|
||||||
|
ErrCodeIDPCommunicationErrorException = "IDPCommunicationError"
|
||||||
|
|
||||||
|
// ErrCodeIDPRejectedClaimException for service response error code
|
||||||
|
// "IDPRejectedClaim".
|
||||||
|
//
|
||||||
|
// The identity provider (IdP) reported that authentication failed. This might
|
||||||
|
// be because the claim is invalid.
|
||||||
|
//
|
||||||
|
// If this error is returned for the AssumeRoleWithWebIdentity operation, it
|
||||||
|
// can also mean that the claim has expired or has been explicitly revoked.
|
||||||
|
ErrCodeIDPRejectedClaimException = "IDPRejectedClaim"
|
||||||
|
|
||||||
|
// ErrCodeInvalidAuthorizationMessageException for service response error code
|
||||||
|
// "InvalidAuthorizationMessageException".
|
||||||
|
//
|
||||||
|
// The error returned if the message passed to DecodeAuthorizationMessage was
|
||||||
|
// invalid. This can happen if the token contains invalid characters, such as
|
||||||
|
// linebreaks.
|
||||||
|
ErrCodeInvalidAuthorizationMessageException = "InvalidAuthorizationMessageException"
|
||||||
|
|
||||||
|
// ErrCodeInvalidIdentityTokenException for service response error code
|
||||||
|
// "InvalidIdentityToken".
|
||||||
|
//
|
||||||
|
// The web identity token that was passed could not be validated by AWS. Get
|
||||||
|
// a new identity token from the identity provider and then retry the request.
|
||||||
|
ErrCodeInvalidIdentityTokenException = "InvalidIdentityToken"
|
||||||
|
|
||||||
|
// ErrCodeMalformedPolicyDocumentException for service response error code
|
||||||
|
// "MalformedPolicyDocument".
|
||||||
|
//
|
||||||
|
// The request was rejected because the policy document was malformed. The error
|
||||||
|
// message describes the specific error.
|
||||||
|
ErrCodeMalformedPolicyDocumentException = "MalformedPolicyDocument"
|
||||||
|
|
||||||
|
// ErrCodePackedPolicyTooLargeException for service response error code
|
||||||
|
// "PackedPolicyTooLarge".
|
||||||
|
//
|
||||||
|
// The request was rejected because the total packed size of the session policies
|
||||||
|
// and session tags combined was too large. An AWS conversion compresses the
|
||||||
|
// session policy document, session policy ARNs, and session tags into a packed
|
||||||
|
// binary format that has a separate limit. The error message indicates by percentage
|
||||||
|
// how close the policies and tags are to the upper size limit. For more information,
|
||||||
|
// see Passing Session Tags in STS (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html)
|
||||||
|
// in the IAM User Guide.
|
||||||
|
//
|
||||||
|
// You could receive this error even though you meet other defined session policy
|
||||||
|
// and session tag limits. For more information, see IAM and STS Entity Character
|
||||||
|
// Limits (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html)
|
||||||
|
// in the IAM User Guide.
|
||||||
|
ErrCodePackedPolicyTooLargeException = "PackedPolicyTooLarge"
|
||||||
|
|
||||||
|
// ErrCodeRegionDisabledException for service response error code
|
||||||
|
// "RegionDisabledException".
|
||||||
|
//
|
||||||
|
// STS is not activated in the requested region for the account that is being
|
||||||
|
// asked to generate credentials. The account administrator must use the IAM
|
||||||
|
// console to activate STS in that region. For more information, see Activating
|
||||||
|
// and Deactivating AWS STS in an AWS Region (https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html)
|
||||||
|
// in the IAM User Guide.
|
||||||
|
ErrCodeRegionDisabledException = "RegionDisabledException"
|
||||||
|
)
|
98
vendor/github.com/aws/aws-sdk-go/service/sts/service.go
generated
vendored
Normal file
98
vendor/github.com/aws/aws-sdk-go/service/sts/service.go
generated
vendored
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT.
|
||||||
|
|
||||||
|
package sts
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/client"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/client/metadata"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/request"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/signer/v4"
|
||||||
|
"github.com/aws/aws-sdk-go/private/protocol/query"
|
||||||
|
)
|
||||||
|
|
||||||
|
// STS provides the API operation methods for making requests to
|
||||||
|
// AWS Security Token Service. See this package's package overview docs
|
||||||
|
// for details on the service.
|
||||||
|
//
|
||||||
|
// STS methods are safe to use concurrently. It is not safe to
|
||||||
|
// modify mutate any of the struct's properties though.
|
||||||
|
type STS struct {
|
||||||
|
*client.Client
|
||||||
|
}
|
||||||
|
|
||||||
|
// Used for custom client initialization logic
|
||||||
|
var initClient func(*client.Client)
|
||||||
|
|
||||||
|
// Used for custom request initialization logic
|
||||||
|
var initRequest func(*request.Request)
|
||||||
|
|
||||||
|
// Service information constants
|
||||||
|
const (
|
||||||
|
ServiceName = "sts" // Name of service.
|
||||||
|
EndpointsID = ServiceName // ID to lookup a service endpoint with.
|
||||||
|
ServiceID = "STS" // ServiceID is a unique identifier of a specific service.
|
||||||
|
)
|
||||||
|
|
||||||
|
// New creates a new instance of the STS client with a session.
|
||||||
|
// If additional configuration is needed for the client instance use the optional
|
||||||
|
// aws.Config parameter to add your extra config.
|
||||||
|
//
|
||||||
|
// Example:
|
||||||
|
// mySession := session.Must(session.NewSession())
|
||||||
|
//
|
||||||
|
// // Create a STS client from just a session.
|
||||||
|
// svc := sts.New(mySession)
|
||||||
|
//
|
||||||
|
// // Create a STS client with additional configuration
|
||||||
|
// svc := sts.New(mySession, aws.NewConfig().WithRegion("us-west-2"))
|
||||||
|
func New(p client.ConfigProvider, cfgs ...*aws.Config) *STS {
|
||||||
|
c := p.ClientConfig(EndpointsID, cfgs...)
|
||||||
|
return newClient(*c.Config, c.Handlers, c.PartitionID, c.Endpoint, c.SigningRegion, c.SigningName)
|
||||||
|
}
|
||||||
|
|
||||||
|
// newClient creates, initializes and returns a new service client instance.
|
||||||
|
func newClient(cfg aws.Config, handlers request.Handlers, partitionID, endpoint, signingRegion, signingName string) *STS {
|
||||||
|
svc := &STS{
|
||||||
|
Client: client.New(
|
||||||
|
cfg,
|
||||||
|
metadata.ClientInfo{
|
||||||
|
ServiceName: ServiceName,
|
||||||
|
ServiceID: ServiceID,
|
||||||
|
SigningName: signingName,
|
||||||
|
SigningRegion: signingRegion,
|
||||||
|
PartitionID: partitionID,
|
||||||
|
Endpoint: endpoint,
|
||||||
|
APIVersion: "2011-06-15",
|
||||||
|
},
|
||||||
|
handlers,
|
||||||
|
),
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handlers
|
||||||
|
svc.Handlers.Sign.PushBackNamed(v4.SignRequestHandler)
|
||||||
|
svc.Handlers.Build.PushBackNamed(query.BuildHandler)
|
||||||
|
svc.Handlers.Unmarshal.PushBackNamed(query.UnmarshalHandler)
|
||||||
|
svc.Handlers.UnmarshalMeta.PushBackNamed(query.UnmarshalMetaHandler)
|
||||||
|
svc.Handlers.UnmarshalError.PushBackNamed(query.UnmarshalErrorHandler)
|
||||||
|
|
||||||
|
// Run custom client initialization if present
|
||||||
|
if initClient != nil {
|
||||||
|
initClient(svc.Client)
|
||||||
|
}
|
||||||
|
|
||||||
|
return svc
|
||||||
|
}
|
||||||
|
|
||||||
|
// newRequest creates a new request for a STS operation and runs any
|
||||||
|
// custom request initialization.
|
||||||
|
func (c *STS) newRequest(op *request.Operation, params, data interface{}) *request.Request {
|
||||||
|
req := c.NewRequest(op, params, data)
|
||||||
|
|
||||||
|
// Run custom request initialization if present
|
||||||
|
if initRequest != nil {
|
||||||
|
initRequest(req)
|
||||||
|
}
|
||||||
|
|
||||||
|
return req
|
||||||
|
}
|
96
vendor/github.com/aws/aws-sdk-go/service/sts/stsiface/interface.go
generated
vendored
Normal file
96
vendor/github.com/aws/aws-sdk-go/service/sts/stsiface/interface.go
generated
vendored
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
// Code generated by private/model/cli/gen-api/main.go. DO NOT EDIT.
|
||||||
|
|
||||||
|
// Package stsiface provides an interface to enable mocking the AWS Security Token Service service client
|
||||||
|
// for testing your code.
|
||||||
|
//
|
||||||
|
// It is important to note that this interface will have breaking changes
|
||||||
|
// when the service model is updated and adds new API operations, paginators,
|
||||||
|
// and waiters.
|
||||||
|
package stsiface
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/aws/aws-sdk-go/aws"
|
||||||
|
"github.com/aws/aws-sdk-go/aws/request"
|
||||||
|
"github.com/aws/aws-sdk-go/service/sts"
|
||||||
|
)
|
||||||
|
|
||||||
|
// STSAPI provides an interface to enable mocking the
|
||||||
|
// sts.STS service client's API operation,
|
||||||
|
// paginators, and waiters. This make unit testing your code that calls out
|
||||||
|
// to the SDK's service client's calls easier.
|
||||||
|
//
|
||||||
|
// The best way to use this interface is so the SDK's service client's calls
|
||||||
|
// can be stubbed out for unit testing your code with the SDK without needing
|
||||||
|
// to inject custom request handlers into the SDK's request pipeline.
|
||||||
|
//
|
||||||
|
// // myFunc uses an SDK service client to make a request to
|
||||||
|
// // AWS Security Token Service.
|
||||||
|
// func myFunc(svc stsiface.STSAPI) bool {
|
||||||
|
// // Make svc.AssumeRole request
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// func main() {
|
||||||
|
// sess := session.New()
|
||||||
|
// svc := sts.New(sess)
|
||||||
|
//
|
||||||
|
// myFunc(svc)
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// In your _test.go file:
|
||||||
|
//
|
||||||
|
// // Define a mock struct to be used in your unit tests of myFunc.
|
||||||
|
// type mockSTSClient struct {
|
||||||
|
// stsiface.STSAPI
|
||||||
|
// }
|
||||||
|
// func (m *mockSTSClient) AssumeRole(input *sts.AssumeRoleInput) (*sts.AssumeRoleOutput, error) {
|
||||||
|
// // mock response/functionality
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// func TestMyFunc(t *testing.T) {
|
||||||
|
// // Setup Test
|
||||||
|
// mockSvc := &mockSTSClient{}
|
||||||
|
//
|
||||||
|
// myfunc(mockSvc)
|
||||||
|
//
|
||||||
|
// // Verify myFunc's functionality
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// It is important to note that this interface will have breaking changes
|
||||||
|
// when the service model is updated and adds new API operations, paginators,
|
||||||
|
// and waiters. Its suggested to use the pattern above for testing, or using
|
||||||
|
// tooling to generate mocks to satisfy the interfaces.
|
||||||
|
type STSAPI interface {
|
||||||
|
AssumeRole(*sts.AssumeRoleInput) (*sts.AssumeRoleOutput, error)
|
||||||
|
AssumeRoleWithContext(aws.Context, *sts.AssumeRoleInput, ...request.Option) (*sts.AssumeRoleOutput, error)
|
||||||
|
AssumeRoleRequest(*sts.AssumeRoleInput) (*request.Request, *sts.AssumeRoleOutput)
|
||||||
|
|
||||||
|
AssumeRoleWithSAML(*sts.AssumeRoleWithSAMLInput) (*sts.AssumeRoleWithSAMLOutput, error)
|
||||||
|
AssumeRoleWithSAMLWithContext(aws.Context, *sts.AssumeRoleWithSAMLInput, ...request.Option) (*sts.AssumeRoleWithSAMLOutput, error)
|
||||||
|
AssumeRoleWithSAMLRequest(*sts.AssumeRoleWithSAMLInput) (*request.Request, *sts.AssumeRoleWithSAMLOutput)
|
||||||
|
|
||||||
|
AssumeRoleWithWebIdentity(*sts.AssumeRoleWithWebIdentityInput) (*sts.AssumeRoleWithWebIdentityOutput, error)
|
||||||
|
AssumeRoleWithWebIdentityWithContext(aws.Context, *sts.AssumeRoleWithWebIdentityInput, ...request.Option) (*sts.AssumeRoleWithWebIdentityOutput, error)
|
||||||
|
AssumeRoleWithWebIdentityRequest(*sts.AssumeRoleWithWebIdentityInput) (*request.Request, *sts.AssumeRoleWithWebIdentityOutput)
|
||||||
|
|
||||||
|
DecodeAuthorizationMessage(*sts.DecodeAuthorizationMessageInput) (*sts.DecodeAuthorizationMessageOutput, error)
|
||||||
|
DecodeAuthorizationMessageWithContext(aws.Context, *sts.DecodeAuthorizationMessageInput, ...request.Option) (*sts.DecodeAuthorizationMessageOutput, error)
|
||||||
|
DecodeAuthorizationMessageRequest(*sts.DecodeAuthorizationMessageInput) (*request.Request, *sts.DecodeAuthorizationMessageOutput)
|
||||||
|
|
||||||
|
GetAccessKeyInfo(*sts.GetAccessKeyInfoInput) (*sts.GetAccessKeyInfoOutput, error)
|
||||||
|
GetAccessKeyInfoWithContext(aws.Context, *sts.GetAccessKeyInfoInput, ...request.Option) (*sts.GetAccessKeyInfoOutput, error)
|
||||||
|
GetAccessKeyInfoRequest(*sts.GetAccessKeyInfoInput) (*request.Request, *sts.GetAccessKeyInfoOutput)
|
||||||
|
|
||||||
|
GetCallerIdentity(*sts.GetCallerIdentityInput) (*sts.GetCallerIdentityOutput, error)
|
||||||
|
GetCallerIdentityWithContext(aws.Context, *sts.GetCallerIdentityInput, ...request.Option) (*sts.GetCallerIdentityOutput, error)
|
||||||
|
GetCallerIdentityRequest(*sts.GetCallerIdentityInput) (*request.Request, *sts.GetCallerIdentityOutput)
|
||||||
|
|
||||||
|
GetFederationToken(*sts.GetFederationTokenInput) (*sts.GetFederationTokenOutput, error)
|
||||||
|
GetFederationTokenWithContext(aws.Context, *sts.GetFederationTokenInput, ...request.Option) (*sts.GetFederationTokenOutput, error)
|
||||||
|
GetFederationTokenRequest(*sts.GetFederationTokenInput) (*request.Request, *sts.GetFederationTokenOutput)
|
||||||
|
|
||||||
|
GetSessionToken(*sts.GetSessionTokenInput) (*sts.GetSessionTokenOutput, error)
|
||||||
|
GetSessionTokenWithContext(aws.Context, *sts.GetSessionTokenInput, ...request.Option) (*sts.GetSessionTokenOutput, error)
|
||||||
|
GetSessionTokenRequest(*sts.GetSessionTokenInput) (*request.Request, *sts.GetSessionTokenOutput)
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ STSAPI = (*sts.STS)(nil)
|
22
vendor/modules.txt
vendored
22
vendor/modules.txt
vendored
@ -1,27 +1,47 @@
|
|||||||
# github.com/aws/aws-sdk-go v1.35.24
|
# github.com/aws/aws-sdk-go v1.38.8
|
||||||
github.com/aws/aws-sdk-go/aws
|
github.com/aws/aws-sdk-go/aws
|
||||||
github.com/aws/aws-sdk-go/aws/awserr
|
github.com/aws/aws-sdk-go/aws/awserr
|
||||||
github.com/aws/aws-sdk-go/aws/awsutil
|
github.com/aws/aws-sdk-go/aws/awsutil
|
||||||
github.com/aws/aws-sdk-go/aws/client
|
github.com/aws/aws-sdk-go/aws/client
|
||||||
github.com/aws/aws-sdk-go/aws/client/metadata
|
github.com/aws/aws-sdk-go/aws/client/metadata
|
||||||
|
github.com/aws/aws-sdk-go/aws/corehandlers
|
||||||
github.com/aws/aws-sdk-go/aws/credentials
|
github.com/aws/aws-sdk-go/aws/credentials
|
||||||
|
github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds
|
||||||
|
github.com/aws/aws-sdk-go/aws/credentials/endpointcreds
|
||||||
|
github.com/aws/aws-sdk-go/aws/credentials/processcreds
|
||||||
|
github.com/aws/aws-sdk-go/aws/credentials/ssocreds
|
||||||
|
github.com/aws/aws-sdk-go/aws/credentials/stscreds
|
||||||
|
github.com/aws/aws-sdk-go/aws/csm
|
||||||
|
github.com/aws/aws-sdk-go/aws/defaults
|
||||||
|
github.com/aws/aws-sdk-go/aws/ec2metadata
|
||||||
github.com/aws/aws-sdk-go/aws/endpoints
|
github.com/aws/aws-sdk-go/aws/endpoints
|
||||||
github.com/aws/aws-sdk-go/aws/request
|
github.com/aws/aws-sdk-go/aws/request
|
||||||
|
github.com/aws/aws-sdk-go/aws/session
|
||||||
github.com/aws/aws-sdk-go/aws/signer/v4
|
github.com/aws/aws-sdk-go/aws/signer/v4
|
||||||
github.com/aws/aws-sdk-go/internal/context
|
github.com/aws/aws-sdk-go/internal/context
|
||||||
github.com/aws/aws-sdk-go/internal/ini
|
github.com/aws/aws-sdk-go/internal/ini
|
||||||
github.com/aws/aws-sdk-go/internal/sdkio
|
github.com/aws/aws-sdk-go/internal/sdkio
|
||||||
github.com/aws/aws-sdk-go/internal/sdkmath
|
github.com/aws/aws-sdk-go/internal/sdkmath
|
||||||
github.com/aws/aws-sdk-go/internal/sdkrand
|
github.com/aws/aws-sdk-go/internal/sdkrand
|
||||||
|
github.com/aws/aws-sdk-go/internal/sdkuri
|
||||||
github.com/aws/aws-sdk-go/internal/shareddefaults
|
github.com/aws/aws-sdk-go/internal/shareddefaults
|
||||||
github.com/aws/aws-sdk-go/internal/strings
|
github.com/aws/aws-sdk-go/internal/strings
|
||||||
github.com/aws/aws-sdk-go/internal/sync/singleflight
|
github.com/aws/aws-sdk-go/internal/sync/singleflight
|
||||||
github.com/aws/aws-sdk-go/private/protocol
|
github.com/aws/aws-sdk-go/private/protocol
|
||||||
github.com/aws/aws-sdk-go/private/protocol/ec2query
|
github.com/aws/aws-sdk-go/private/protocol/ec2query
|
||||||
|
github.com/aws/aws-sdk-go/private/protocol/json/jsonutil
|
||||||
|
github.com/aws/aws-sdk-go/private/protocol/jsonrpc
|
||||||
|
github.com/aws/aws-sdk-go/private/protocol/query
|
||||||
github.com/aws/aws-sdk-go/private/protocol/query/queryutil
|
github.com/aws/aws-sdk-go/private/protocol/query/queryutil
|
||||||
github.com/aws/aws-sdk-go/private/protocol/rest
|
github.com/aws/aws-sdk-go/private/protocol/rest
|
||||||
|
github.com/aws/aws-sdk-go/private/protocol/restjson
|
||||||
github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil
|
github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil
|
||||||
github.com/aws/aws-sdk-go/service/ec2
|
github.com/aws/aws-sdk-go/service/ec2
|
||||||
|
github.com/aws/aws-sdk-go/service/kms
|
||||||
|
github.com/aws/aws-sdk-go/service/sso
|
||||||
|
github.com/aws/aws-sdk-go/service/sso/ssoiface
|
||||||
|
github.com/aws/aws-sdk-go/service/sts
|
||||||
|
github.com/aws/aws-sdk-go/service/sts/stsiface
|
||||||
# github.com/beorn7/perks v1.0.1
|
# github.com/beorn7/perks v1.0.1
|
||||||
github.com/beorn7/perks/quantile
|
github.com/beorn7/perks/quantile
|
||||||
# github.com/blang/semver v3.5.1+incompatible
|
# github.com/blang/semver v3.5.1+incompatible
|
||||||
|
Loading…
Reference in New Issue
Block a user