diff --git a/template/interpolate/aws/secretsmanager/secretsmanager.go b/template/interpolate/aws/secretsmanager/secretsmanager.go index 67ec3b90..b7e77ab5 100644 --- a/template/interpolate/aws/secretsmanager/secretsmanager.go +++ b/template/interpolate/aws/secretsmanager/secretsmanager.go @@ -6,6 +6,7 @@ import ( "encoding/json" "errors" "fmt" + "strconv" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" @@ -76,7 +77,7 @@ func (c *Client) GetSecret(spec *SecretSpec) (string, error) { } func getSecretValue(s *SecretString, spec *SecretSpec) (string, error) { - var secretValue map[string]string + var secretValue map[string]interface{} blob := []byte(s.SecretString) //For those plaintext secrets just return the value @@ -96,13 +97,24 @@ func getSecretValue(s *SecretString, spec *SecretSpec) (string, error) { if spec.Key == "" { for _, v := range secretValue { - return v, nil + return getStringSecretValue(v) } } if v, ok := secretValue[spec.Key]; ok { - return v, nil + return getStringSecretValue(v) } return "", fmt.Errorf("No secret found for key %q", spec.Key) } + +func getStringSecretValue(v interface{}) (string, error) { + switch valueType := v.(type) { + case string: + return valueType, nil + case float64: + return strconv.FormatFloat(valueType, 'f', 0, 64), nil + default: + return "", fmt.Errorf("Unsupported secret value type: %T", valueType) + } +} diff --git a/template/interpolate/aws/secretsmanager/secretsmanager_test.go b/template/interpolate/aws/secretsmanager/secretsmanager_test.go index 31cb3e08..eacd41f8 100644 --- a/template/interpolate/aws/secretsmanager/secretsmanager_test.go +++ b/template/interpolate/aws/secretsmanager/secretsmanager_test.go @@ -118,6 +118,16 @@ func TestGetSecret(t *testing.T) { want: "ThisIsThePassword", ok: true, }, + { + description: "input as secret stored with 'String: int' value", + arg: &SecretSpec{Name: "test"}, + mock: secretsmanager.GetSecretValueOutput{ + Name: aws.String("test"), + SecretString: aws.String(`{"port": 5432}`), + }, + want: "5432", + ok: true, + }, } for _, test := range testCases {