cloudposse / terraform-aws-elasticache-redis

Terraform module to provision an ElastiCache Redis Cluster
https://cloudposse.com/accelerate
Apache License 2.0
141 stars 246 forks source link

null reader endpoint address #236

Open bbeesley opened 3 weeks ago

bbeesley commented 3 weeks ago

Describe the Bug

Since version 1.3.0, terraform plan fails with an existing cluster (running in cluster mode) as all the reader endpoint options are null.

Expected Behavior

Terraform plan with no changes to an existing cluster should just successfully plan and show no changes.

Steps to Reproduce

Create a cluster using version 1.2.0 of this module. Update to version 1.3.0. Run terraform plan.

Screenshots

Error observed during terraform plan

Error: Error in function call
  on .terraform/modules/redis.redis/main.tf line 119, in locals:
 119:   reader_endpoint_address = coalesce(local.reader_endpoint_serverless, local.reader_endpoint_cluster, local.reader_endpoint_instance)
    ├────────────────
    │ while calling coalesce(vals...)
    │ local.reader_endpoint_cluster is null
    │ local.reader_endpoint_instance is null
    │ local.reader_endpoint_serverless is null
Call to function "coalesce" failed: no non-null, non-empty-string arguments.

Environment

TERRAFORM_VERSION: 1.5.6 OS: ubuntu (github actions) terraform-aws-elasticache-redis version: 1.3.0

Additional Context

Elasticache doesn't give you a reader endpoint when using redis in cluster mode, only a configuration endpoint, so

coalesce(local.reader_endpoint_serverless, local.reader_endpoint_cluster, local.reader_endpoint_instance)

is always going to be coalesce(null, null, null) if you're using cluster mode, and is always going to throw this error.

nitrocode commented 1 week ago

I see 2 coalesce statements. From your description only the reader endpoint is affected when in cluster mode.

https://github.com/cloudposse/terraform-aws-elasticache-redis/blob/23723ddb716f07e7dbcbd080b9841cadcba8b04a/main.tf#L113

https://github.com/cloudposse/terraform-aws-elasticache-redis/blob/23723ddb716f07e7dbcbd080b9841cadcba8b04a/main.tf#L119

The docs say to use the configuration endpoint

Redis (cluster mode enabled) clusters, use the cluster's Configuration Endpoint for all operations that support cluster mode enabled commands. You must use a client that supports Redis Cluster (Redis 3.2). You can still read from individual node endpoints (In the API/CLI these are referred to as Read Endpoints).

https://docs.aws.amazon.com/AmazonElastiCache/latest/red-ug/Endpoints.html

Since we use the aws_elasticache_replication_group resource we can add this output to the coalesce

configuration_endpoint_address - Address of the replication group configuration endpoint when cluster mode is enabled

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/elasticache_replication_group#configuration_endpoint_address

What do you think?