Skip to content

Commit d45a5fd

Browse files
authored
Merge pull request #42148 from stefanfreitag/f-aws_msk_serverless_cluster-expose-broker-endpoints
feat: add `bootstrap_brokers_sasl_iam` attribute for `aws_msk_serverless_cluster`
2 parents 412cbb4 + a396abe commit d45a5fd

9 files changed

+56
-33
lines changed

.changelog/42148.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
resource/aws_msk_serverless_cluster: Add `bootstrap_brokers_sasl_iam` attribute. This functionality requires the `kafka:GetBootstrapBrokers` IAM permission
3+
```

internal/service/kafka/bootstrap_brokers_data_source.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -81,16 +81,16 @@ func dataSourceBootstrapBrokersRead(ctx context.Context, d *schema.ResourceData,
8181
}
8282

8383
d.SetId(clusterARN)
84-
d.Set("bootstrap_brokers", SortEndpointsString(aws.ToString(output.BootstrapBrokerString)))
85-
d.Set("bootstrap_brokers_public_sasl_iam", SortEndpointsString(aws.ToString(output.BootstrapBrokerStringPublicSaslIam)))
86-
d.Set("bootstrap_brokers_public_sasl_scram", SortEndpointsString(aws.ToString(output.BootstrapBrokerStringPublicSaslScram)))
87-
d.Set("bootstrap_brokers_public_tls", SortEndpointsString(aws.ToString(output.BootstrapBrokerStringPublicTls)))
88-
d.Set("bootstrap_brokers_sasl_iam", SortEndpointsString(aws.ToString(output.BootstrapBrokerStringSaslIam)))
89-
d.Set("bootstrap_brokers_sasl_scram", SortEndpointsString(aws.ToString(output.BootstrapBrokerStringSaslScram)))
90-
d.Set("bootstrap_brokers_tls", SortEndpointsString(aws.ToString(output.BootstrapBrokerStringTls)))
91-
d.Set("bootstrap_brokers_vpc_connectivity_sasl_iam", SortEndpointsString(aws.ToString(output.BootstrapBrokerStringVpcConnectivitySaslIam)))
92-
d.Set("bootstrap_brokers_vpc_connectivity_sasl_scram", SortEndpointsString(aws.ToString(output.BootstrapBrokerStringVpcConnectivitySaslScram)))
93-
d.Set("bootstrap_brokers_vpc_connectivity_tls", SortEndpointsString(aws.ToString(output.BootstrapBrokerStringVpcConnectivityTls)))
84+
d.Set("bootstrap_brokers", sortEndpointsString(aws.ToString(output.BootstrapBrokerString)))
85+
d.Set("bootstrap_brokers_public_sasl_iam", sortEndpointsString(aws.ToString(output.BootstrapBrokerStringPublicSaslIam)))
86+
d.Set("bootstrap_brokers_public_sasl_scram", sortEndpointsString(aws.ToString(output.BootstrapBrokerStringPublicSaslScram)))
87+
d.Set("bootstrap_brokers_public_tls", sortEndpointsString(aws.ToString(output.BootstrapBrokerStringPublicTls)))
88+
d.Set("bootstrap_brokers_sasl_iam", sortEndpointsString(aws.ToString(output.BootstrapBrokerStringSaslIam)))
89+
d.Set("bootstrap_brokers_sasl_scram", sortEndpointsString(aws.ToString(output.BootstrapBrokerStringSaslScram)))
90+
d.Set("bootstrap_brokers_tls", sortEndpointsString(aws.ToString(output.BootstrapBrokerStringTls)))
91+
d.Set("bootstrap_brokers_vpc_connectivity_sasl_iam", sortEndpointsString(aws.ToString(output.BootstrapBrokerStringVpcConnectivitySaslIam)))
92+
d.Set("bootstrap_brokers_vpc_connectivity_sasl_scram", sortEndpointsString(aws.ToString(output.BootstrapBrokerStringVpcConnectivitySaslScram)))
93+
d.Set("bootstrap_brokers_vpc_connectivity_tls", sortEndpointsString(aws.ToString(output.BootstrapBrokerStringVpcConnectivityTls)))
9494

9595
return diags
9696
}

internal/service/kafka/cluster.go

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -653,16 +653,16 @@ func resourceClusterRead(ctx context.Context, d *schema.ResourceData, meta any)
653653

654654
clusterARN := aws.ToString(cluster.ClusterArn)
655655
d.Set(names.AttrARN, clusterARN)
656-
d.Set("bootstrap_brokers", SortEndpointsString(aws.ToString(output.BootstrapBrokerString)))
657-
d.Set("bootstrap_brokers_public_sasl_iam", SortEndpointsString(aws.ToString(output.BootstrapBrokerStringPublicSaslIam)))
658-
d.Set("bootstrap_brokers_public_sasl_scram", SortEndpointsString(aws.ToString(output.BootstrapBrokerStringPublicSaslScram)))
659-
d.Set("bootstrap_brokers_public_tls", SortEndpointsString(aws.ToString(output.BootstrapBrokerStringPublicTls)))
660-
d.Set("bootstrap_brokers_sasl_iam", SortEndpointsString(aws.ToString(output.BootstrapBrokerStringSaslIam)))
661-
d.Set("bootstrap_brokers_sasl_scram", SortEndpointsString(aws.ToString(output.BootstrapBrokerStringSaslScram)))
662-
d.Set("bootstrap_brokers_tls", SortEndpointsString(aws.ToString(output.BootstrapBrokerStringTls)))
663-
d.Set("bootstrap_brokers_vpc_connectivity_sasl_iam", SortEndpointsString(aws.ToString(output.BootstrapBrokerStringVpcConnectivitySaslIam)))
664-
d.Set("bootstrap_brokers_vpc_connectivity_sasl_scram", SortEndpointsString(aws.ToString(output.BootstrapBrokerStringVpcConnectivitySaslScram)))
665-
d.Set("bootstrap_brokers_vpc_connectivity_tls", SortEndpointsString(aws.ToString(output.BootstrapBrokerStringVpcConnectivityTls)))
656+
d.Set("bootstrap_brokers", sortEndpointsString(aws.ToString(output.BootstrapBrokerString)))
657+
d.Set("bootstrap_brokers_public_sasl_iam", sortEndpointsString(aws.ToString(output.BootstrapBrokerStringPublicSaslIam)))
658+
d.Set("bootstrap_brokers_public_sasl_scram", sortEndpointsString(aws.ToString(output.BootstrapBrokerStringPublicSaslScram)))
659+
d.Set("bootstrap_brokers_public_tls", sortEndpointsString(aws.ToString(output.BootstrapBrokerStringPublicTls)))
660+
d.Set("bootstrap_brokers_sasl_iam", sortEndpointsString(aws.ToString(output.BootstrapBrokerStringSaslIam)))
661+
d.Set("bootstrap_brokers_sasl_scram", sortEndpointsString(aws.ToString(output.BootstrapBrokerStringSaslScram)))
662+
d.Set("bootstrap_brokers_tls", sortEndpointsString(aws.ToString(output.BootstrapBrokerStringTls)))
663+
d.Set("bootstrap_brokers_vpc_connectivity_sasl_iam", sortEndpointsString(aws.ToString(output.BootstrapBrokerStringVpcConnectivitySaslIam)))
664+
d.Set("bootstrap_brokers_vpc_connectivity_sasl_scram", sortEndpointsString(aws.ToString(output.BootstrapBrokerStringVpcConnectivitySaslScram)))
665+
d.Set("bootstrap_brokers_vpc_connectivity_tls", sortEndpointsString(aws.ToString(output.BootstrapBrokerStringVpcConnectivityTls)))
666666
if cluster.BrokerNodeGroupInfo != nil {
667667
if err := d.Set("broker_node_group_info", []any{flattenBrokerNodeGroupInfo(cluster.BrokerNodeGroupInfo)}); err != nil {
668668
return sdkdiag.AppendErrorf(diags, "setting broker_node_group_info: %s", err)
@@ -717,8 +717,8 @@ func resourceClusterRead(ctx context.Context, d *schema.ResourceData, meta any)
717717
d.Set("open_monitoring", nil)
718718
}
719719
d.Set("storage_mode", cluster.StorageMode)
720-
d.Set("zookeeper_connect_string", SortEndpointsString(aws.ToString(cluster.ZookeeperConnectString)))
721-
d.Set("zookeeper_connect_string_tls", SortEndpointsString(aws.ToString(cluster.ZookeeperConnectStringTls)))
720+
d.Set("zookeeper_connect_string", sortEndpointsString(aws.ToString(cluster.ZookeeperConnectString)))
721+
d.Set("zookeeper_connect_string_tls", sortEndpointsString(aws.ToString(cluster.ZookeeperConnectStringTls)))
722722

723723
setTagsOut(ctx, cluster.Tags)
724724

internal/service/kafka/cluster_data_source.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -236,13 +236,13 @@ func dataSourceClusterRead(ctx context.Context, d *schema.ResourceData, meta any
236236

237237
d.SetId(clusterARN)
238238
d.Set(names.AttrARN, clusterARN)
239-
d.Set("bootstrap_brokers", SortEndpointsString(aws.ToString(bootstrapBrokersOutput.BootstrapBrokerString)))
240-
d.Set("bootstrap_brokers_public_sasl_iam", SortEndpointsString(aws.ToString(bootstrapBrokersOutput.BootstrapBrokerStringPublicSaslIam)))
241-
d.Set("bootstrap_brokers_public_sasl_scram", SortEndpointsString(aws.ToString(bootstrapBrokersOutput.BootstrapBrokerStringPublicSaslScram)))
242-
d.Set("bootstrap_brokers_public_tls", SortEndpointsString(aws.ToString(bootstrapBrokersOutput.BootstrapBrokerStringPublicTls)))
243-
d.Set("bootstrap_brokers_sasl_iam", SortEndpointsString(aws.ToString(bootstrapBrokersOutput.BootstrapBrokerStringSaslIam)))
244-
d.Set("bootstrap_brokers_sasl_scram", SortEndpointsString(aws.ToString(bootstrapBrokersOutput.BootstrapBrokerStringSaslScram)))
245-
d.Set("bootstrap_brokers_tls", SortEndpointsString(aws.ToString(bootstrapBrokersOutput.BootstrapBrokerStringTls)))
239+
d.Set("bootstrap_brokers", sortEndpointsString(aws.ToString(bootstrapBrokersOutput.BootstrapBrokerString)))
240+
d.Set("bootstrap_brokers_public_sasl_iam", sortEndpointsString(aws.ToString(bootstrapBrokersOutput.BootstrapBrokerStringPublicSaslIam)))
241+
d.Set("bootstrap_brokers_public_sasl_scram", sortEndpointsString(aws.ToString(bootstrapBrokersOutput.BootstrapBrokerStringPublicSaslScram)))
242+
d.Set("bootstrap_brokers_public_tls", sortEndpointsString(aws.ToString(bootstrapBrokersOutput.BootstrapBrokerStringPublicTls)))
243+
d.Set("bootstrap_brokers_sasl_iam", sortEndpointsString(aws.ToString(bootstrapBrokersOutput.BootstrapBrokerStringSaslIam)))
244+
d.Set("bootstrap_brokers_sasl_scram", sortEndpointsString(aws.ToString(bootstrapBrokersOutput.BootstrapBrokerStringSaslScram)))
245+
d.Set("bootstrap_brokers_tls", sortEndpointsString(aws.ToString(bootstrapBrokersOutput.BootstrapBrokerStringTls)))
246246
if cluster.BrokerNodeGroupInfo != nil {
247247
if err := d.Set("broker_node_group_info", []any{flattenBrokerNodeGroupInfo(cluster.BrokerNodeGroupInfo)}); err != nil {
248248
return sdkdiag.AppendErrorf(diags, "setting broker_node_group_info: %s", err)
@@ -255,8 +255,8 @@ func dataSourceClusterRead(ctx context.Context, d *schema.ResourceData, meta any
255255
d.Set("cluster_uuid", clusterUUID)
256256
d.Set("kafka_version", cluster.CurrentBrokerSoftwareInfo.KafkaVersion)
257257
d.Set("number_of_broker_nodes", cluster.NumberOfBrokerNodes)
258-
d.Set("zookeeper_connect_string", SortEndpointsString(aws.ToString(cluster.ZookeeperConnectString)))
259-
d.Set("zookeeper_connect_string_tls", SortEndpointsString(aws.ToString(cluster.ZookeeperConnectStringTls)))
258+
d.Set("zookeeper_connect_string", sortEndpointsString(aws.ToString(cluster.ZookeeperConnectString)))
259+
d.Set("zookeeper_connect_string_tls", sortEndpointsString(aws.ToString(cluster.ZookeeperConnectStringTls)))
260260

261261
if err := d.Set(names.AttrTags, KeyValueTags(ctx, cluster.Tags).IgnoreAWS().IgnoreConfig(ignoreTagsConfig).Map()); err != nil {
262262
return sdkdiag.AppendErrorf(diags, "setting tags: %s", err)

internal/service/kafka/exports_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,6 @@ var (
2222
FindSingleSCRAMSecretAssociationByTwoPartKey = findSingleSCRAMSecretAssociationByTwoPartKey
2323
FindServerlessClusterByARN = findServerlessClusterByARN
2424
FindVPCConnectionByARN = findVPCConnectionByARN
25+
26+
SortEndpointsString = sortEndpointsString
2527
)

internal/service/kafka/serverless_cluster.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1616
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
1717
"github.com/hashicorp/terraform-provider-aws/internal/conns"
18+
"github.com/hashicorp/terraform-provider-aws/internal/errs"
1819
"github.com/hashicorp/terraform-provider-aws/internal/errs/sdkdiag"
1920
"github.com/hashicorp/terraform-provider-aws/internal/flex"
2021
tftags "github.com/hashicorp/terraform-provider-aws/internal/tags"
@@ -45,6 +46,10 @@ func resourceServerlessCluster() *schema.Resource {
4546
Type: schema.TypeString,
4647
Computed: true,
4748
},
49+
"bootstrap_brokers_sasl_iam": {
50+
Type: schema.TypeString,
51+
Computed: true,
52+
},
4853
"client_authentication": {
4954
Type: schema.TypeList,
5055
Required: true,
@@ -184,6 +189,17 @@ func resourceServerlessClusterRead(ctx context.Context, d *schema.ResourceData,
184189
return sdkdiag.AppendErrorf(diags, "setting vpc_config: %s", err)
185190
}
186191

192+
output, err := findBootstrapBrokersByARN(ctx, conn, d.Id())
193+
194+
switch {
195+
case errs.IsA[*types.ForbiddenException](err):
196+
d.Set("bootstrap_brokers_sasl_iam", nil)
197+
case err != nil:
198+
return sdkdiag.AppendErrorf(diags, "reading MSK Cluster (%s) bootstrap brokers: %s", clusterARN, err)
199+
default:
200+
d.Set("bootstrap_brokers_sasl_iam", sortEndpointsString(aws.ToString(output.BootstrapBrokerStringSaslIam)))
201+
}
202+
187203
setTagsOut(ctx, cluster.Tags)
188204

189205
return diags

internal/service/kafka/serverless_cluster_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ func TestAccKafkaServerlessCluster_basic(t *testing.T) {
3737
Check: resource.ComposeAggregateTestCheckFunc(
3838
testAccCheckServerlessClusterExists(ctx, resourceName, &v),
3939
acctest.MatchResourceAttrRegionalARN(ctx, resourceName, names.AttrARN, "kafka", regexache.MustCompile(`cluster/.+$`)),
40+
resource.TestCheckResourceAttrSet(resourceName, "bootstrap_brokers_sasl_iam"),
4041
resource.TestCheckResourceAttr(resourceName, "client_authentication.#", "1"),
4142
resource.TestCheckResourceAttr(resourceName, "client_authentication.0.sasl.#", "1"),
4243
resource.TestCheckResourceAttr(resourceName, "client_authentication.0.sasl.0.iam.#", "1"),

internal/service/kafka/sort.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ const (
1212
endpointSeparator = ","
1313
)
1414

15-
// SortEndpointsString sorts a comma-separated list of endpoints.
16-
func SortEndpointsString(s string) string {
15+
// sortEndpointsString sorts a comma-separated list of endpoints.
16+
func sortEndpointsString(s string) string {
1717
parts := strings.Split(s, endpointSeparator)
1818
slices.Sort(parts)
1919
return strings.Join(parts, endpointSeparator)

website/docs/r/msk_serverless_cluster.html.markdown

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ This resource supports the following arguments:
6464
This resource exports the following attributes in addition to the arguments above:
6565

6666
* `arn` - The ARN of the serverless cluster.
67+
* `bootstrap_brokers_sasl_iam` - One or more DNS names (or IP addresses) and SASL IAM port pairs. For example, `boot-abcdefg.c2.kafka-serverless.eu-central-1.amazonaws.com:9098`. The resource sorts the list alphabetically. AWS may not always return all endpoints so the values may not be stable across applies.
6768
* `cluster_uuid` - UUID of the serverless cluster, for use in IAM policies.
6869
* `tags_all` - A map of tags assigned to the resource, including those inherited from the provider [`default_tags` configuration block](https://registry.terraform.io/providers/hashicorp/aws/latest/docs#default_tags-configuration-block).
6970

0 commit comments

Comments
 (0)