Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add use_sts_region_from_client to AWS Auth Config #1963

Merged
merged 7 commits into from
Aug 14, 2023
Merged
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
## Unreleased
FEATURES:
* Add support for User ID configuration for PKI Secrets Engine: ([#1936](https://github.com/hashicorp/terraform-provider-vault/pull/1936))
* Add support for `use_sts_region_from_client` in `vault_aws_auth_backend_client` available in Vault v1.15.0+: ([#1963](https://github.com/hashicorp/terraform-provider-vault/pull/1963))

BUGS:
* auth/aws: enable namespace support for AWS backend config identity: ([#1961](https://github.com/hashicorp/terraform-provider-vault/pull/1961))
Expand Down
1 change: 1 addition & 0 deletions internal/consts/consts.go
Original file line number Diff line number Diff line change
Expand Up @@ -422,6 +422,7 @@ const (
VaultVersion112 = "1.12.0"
VaultVersion113 = "1.13.0"
VaultVersion114 = "1.14.0"
VaultVersion115 = "1.15.0"

/*
Vault auth methods
Expand Down
1 change: 1 addition & 0 deletions internal/provider/meta.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ var (
VaultVersion112 = version.Must(version.NewSemver(consts.VaultVersion112))
VaultVersion113 = version.Must(version.NewSemver(consts.VaultVersion113))
VaultVersion114 = version.Must(version.NewSemver(consts.VaultVersion114))
VaultVersion115 = version.Must(version.NewSemver(consts.VaultVersion115))

TokenTTLMinRecommended = time.Minute * 15
)
Expand Down
18 changes: 18 additions & 0 deletions vault/resource_aws_auth_backend_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ import (
"github.com/hashicorp/terraform-provider-vault/internal/provider"
)

const (
useSTSRegionFromClient = "use_sts_region_from_client"
)

func awsAuthBackendClientResource() *schema.Resource {
return &schema.Resource{
Create: awsAuthBackendWrite,
Expand Down Expand Up @@ -69,6 +73,11 @@ func awsAuthBackendClientResource() *schema.Resource {
Optional: true,
Description: "Region to override the default region for making AWS STS API calls.",
},
useSTSRegionFromClient: {
raymonstah marked this conversation as resolved.
Show resolved Hide resolved
Type: schema.TypeBool,
Optional: true,
Description: "If set, will override sts_region and use the region from the client request's header",
},
"iam_server_id_header_value": {
Type: schema.TypeString,
Optional: true,
Expand All @@ -91,6 +100,7 @@ func awsAuthBackendWrite(d *schema.ResourceData, meta interface{}) error {
iamEndpoint := d.Get("iam_endpoint").(string)
stsEndpoint := d.Get("sts_endpoint").(string)
stsRegion := d.Get("sts_region").(string)
stsRegionFromClient := d.Get("use_sts_region_from_client").(bool)

iamServerIDHeaderValue := d.Get("iam_server_id_header_value").(string)

Expand All @@ -110,6 +120,10 @@ func awsAuthBackendWrite(d *schema.ResourceData, meta interface{}) error {
data["secret_key"] = d.Get("secret_key").(string)
}

if provider.IsAPISupported(meta, provider.VaultVersion115) {
data[useSTSRegionFromClient] = stsRegionFromClient
}

// sts_endpoint and sts_region are required to be set together
if (stsEndpoint == "") != (stsRegion == "") {
return fmt.Errorf("both sts_endpoint and sts_region need to be set")
Expand Down Expand Up @@ -159,6 +173,10 @@ func awsAuthBackendRead(d *schema.ResourceData, meta interface{}) error {
d.Set("sts_endpoint", secret.Data["sts_endpoint"])
d.Set("sts_region", secret.Data["sts_region"])
d.Set("iam_server_id_header_value", secret.Data["iam_server_id_header_value"])
if provider.IsAPISupported(meta, provider.VaultVersion115) {
d.Set(useSTSRegionFromClient, secret.Data[useSTSRegionFromClient])
}

return nil
}

Expand Down
46 changes: 41 additions & 5 deletions vault/resource_aws_auth_backend_client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import (

func TestAccAWSAuthBackendClient_import(t *testing.T) {
backend := acctest.RandomWithPrefix("aws")
resource.Test(t, resource.TestCase{
resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { testutil.TestAccPreCheck(t) },
Providers: testProviders,
CheckDestroy: testAccCheckAWSAuthBackendClientDestroy,
Expand All @@ -39,7 +39,7 @@ func TestAccAWSAuthBackendClient_import(t *testing.T) {

func TestAccAWSAuthBackendClient_basic(t *testing.T) {
backend := acctest.RandomWithPrefix("aws")
resource.Test(t, resource.TestCase{
resource.ParallelTest(t, resource.TestCase{
Providers: testProviders,
PreCheck: func() { testutil.TestAccPreCheck(t) },
CheckDestroy: testAccCheckAWSAuthBackendClientDestroy,
Expand All @@ -58,7 +58,7 @@ func TestAccAWSAuthBackendClient_basic(t *testing.T) {

func TestAccAWSAuthBackendClient_nested(t *testing.T) {
backend := acctest.RandomWithPrefix("aws") + "/nested"
resource.Test(t, resource.TestCase{
resource.ParallelTest(t, resource.TestCase{
Providers: testProviders,
PreCheck: func() { testutil.TestAccPreCheck(t) },
CheckDestroy: testAccCheckAWSAuthBackendClientDestroy,
Expand All @@ -77,7 +77,7 @@ func TestAccAWSAuthBackendClient_nested(t *testing.T) {

func TestAccAWSAuthBackendClient_withoutSecretKey(t *testing.T) {
backend := acctest.RandomWithPrefix("aws")
resource.Test(t, resource.TestCase{
resource.ParallelTest(t, resource.TestCase{
Providers: testProviders,
PreCheck: func() { testutil.TestAccPreCheck(t) },
CheckDestroy: testAccCheckAWSAuthBackendClientDestroy,
Expand All @@ -104,7 +104,7 @@ func TestAccAWSAuthBackendClient_withoutSecretKey(t *testing.T) {

func TestAccAWSAuthBackendClientStsRegionNoEndpoint(t *testing.T) {
backend := acctest.RandomWithPrefix("aws")
resource.Test(t, resource.TestCase{
resource.ParallelTest(t, resource.TestCase{
PreCheck: func() { testutil.TestAccPreCheck(t) },
Providers: testProviders,
CheckDestroy: testAccCheckAWSAuthBackendClientDestroy,
Expand All @@ -117,6 +117,27 @@ func TestAccAWSAuthBackendClientStsRegionNoEndpoint(t *testing.T) {
})
}

func TestAccAWSAuthBackendClientStsRegionFromClient(t *testing.T) {
backend := acctest.RandomWithPrefix("aws")
resource.ParallelTest(t, resource.TestCase{
PreCheck: func() {
testutil.TestAccPreCheck(t)
SkipIfAPIVersionLT(t, testProvider.Meta(), provider.VaultVersion115)
},
Providers: testProviders,
CheckDestroy: testAccCheckAWSAuthBackendClientDestroy,
Steps: []resource.TestStep{
{
raymonstah marked this conversation as resolved.
Show resolved Hide resolved
Config: testAccAWSAuthBackendClientConfigSTSRegionFromClient(backend),
Check: resource.ComposeTestCheckFunc(
testAccAWSAuthBackendClientCheck_attrs(backend),
resource.TestCheckResourceAttr("vault_aws_auth_backend_client.client", useSTSRegionFromClient, "true"),
),
},
},
})
}

func testAccCheckAWSAuthBackendClientDestroy(s *terraform.State) error {
for _, rs := range s.RootModule().Resources {
if rs.Type != "vault_aws_auth_backend_client" {
Expand Down Expand Up @@ -286,3 +307,18 @@ resource "vault_aws_auth_backend_client" "client" {
iam_server_id_header_value = "vault.test"
}`, backend)
}

func testAccAWSAuthBackendClientConfigSTSRegionFromClient(backend string) string {
return fmt.Sprintf(`
resource "vault_auth_backend" "aws" {
path = "%s"
type = "aws"
description = "Test auth backend for AWS backend client config"
}

resource "vault_aws_auth_backend_client" "client" {
backend = vault_auth_backend.aws.path
access_key = "AWSACCESSKEY"
use_sts_region_from_client = true
}`, backend)
}