Skip to content

Commit

Permalink
added AWS enpoint handling (#3416)
Browse files Browse the repository at this point in the history
  • Loading branch information
ror6ax authored and jefferai committed Nov 6, 2017
1 parent cc55e6f commit 81e18ae
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 9 deletions.
17 changes: 14 additions & 3 deletions builtin/logical/aws/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,9 @@ import (
"github.com/hashicorp/vault/logical"
)

func getRootConfig(s logical.Storage) (*aws.Config, error) {
func getRootConfig(s logical.Storage, clientType string) (*aws.Config, error) {
credsConfig := &awsutil.CredentialsConfig{}
var endpoint string

entry, err := s.Get("config/root")
if err != nil {
Expand All @@ -29,6 +30,12 @@ func getRootConfig(s logical.Storage) (*aws.Config, error) {
credsConfig.AccessKey = config.AccessKey
credsConfig.SecretKey = config.SecretKey
credsConfig.Region = config.Region
switch {
case clientType == "iam" && config.IAMEndpoint != "":
endpoint = *aws.String(config.IAMEndpoint)
case clientType == "sts" && config.STSEndpoint != "":
endpoint = *aws.String(config.STSEndpoint)
}
}

if credsConfig.Region == "" {
Expand All @@ -51,28 +58,32 @@ func getRootConfig(s logical.Storage) (*aws.Config, error) {
return &aws.Config{
Credentials: creds,
Region: aws.String(credsConfig.Region),
Endpoint: &endpoint,
HTTPClient: cleanhttp.DefaultClient(),
}, nil
}

func clientIAM(s logical.Storage) (*iam.IAM, error) {
awsConfig, err := getRootConfig(s)
awsConfig, err := getRootConfig(s, "iam")
if err != nil {
return nil, err
}

client := iam.New(session.New(awsConfig))

if client == nil {
return nil, fmt.Errorf("could not obtain iam client")
}
return client, nil
}

func clientSTS(s logical.Storage) (*sts.STS, error) {
awsConfig, err := getRootConfig(s)
awsConfig, err := getRootConfig(s, "sts")
if err != nil {
return nil, err
}
client := sts.New(session.New(awsConfig))

if client == nil {
return nil, fmt.Errorf("could not obtain sts client")
}
Expand Down
26 changes: 20 additions & 6 deletions builtin/logical/aws/path_config_root.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,14 @@ func pathConfigRoot() *framework.Path {
Type: framework.TypeString,
Description: "Region for API calls.",
},
"iam_endpoint": &framework.FieldSchema{
Type: framework.TypeString,
Description: "Endpoint to custom IAM server URL",
},
"sts_endpoint": &framework.FieldSchema{
Type: framework.TypeString,
Description: "Endpoint to custom STS server URL",
},
},

Callbacks: map[logical.Operation]framework.OperationFunc{
Expand All @@ -37,11 +45,15 @@ func pathConfigRoot() *framework.Path {
func pathConfigRootWrite(
req *logical.Request, data *framework.FieldData) (*logical.Response, error) {
region := data.Get("region").(string)
iamendpoint := data.Get("iam_endpoint").(string)
stsendpoint := data.Get("sts_endpoint").(string)

entry, err := logical.StorageEntryJSON("config/root", rootConfig{
AccessKey: data.Get("access_key").(string),
SecretKey: data.Get("secret_key").(string),
Region: region,
AccessKey: data.Get("access_key").(string),
SecretKey: data.Get("secret_key").(string),
IAMEndpoint: iamendpoint,
STSEndpoint: stsendpoint,
Region: region,
})
if err != nil {
return nil, err
Expand All @@ -55,9 +67,11 @@ func pathConfigRootWrite(
}

type rootConfig struct {
AccessKey string `json:"access_key"`
SecretKey string `json:"secret_key"`
Region string `json:"region"`
AccessKey string `json:"access_key"`
SecretKey string `json:"secret_key"`
IAMEndpoint string `json:"iam_endpoint"`
STSEndpoint string `json:"sts_endpoint"`
Region string `json:"region"`
}

const pathConfigRootHelpSyn = `
Expand Down
4 changes: 4 additions & 0 deletions website/source/api/secret/aws/index.html.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,10 @@ valid AWS credentials with proper permissions.
will use the `AWS_REGION` env var, `AWS_DEFAULT_REGION` env var, or
`us-east-1` in that order.

- `iam_endpoint` `(string: <optional>)` – Specifies a custom HTTP IAM endpoint to use.

- `sts_endpoint` `(string: <optional>)` – Specifies a custom HTTP STS endpoint to use.

### Sample Payload

```json
Expand Down

0 comments on commit 81e18ae

Please sign in to comment.