terraform-aws-elasticache-redis icon indicating copy to clipboard operation
terraform-aws-elasticache-redis copied to clipboard

null reader endpoint address

Open bbeesley opened this issue 1 year ago • 1 comments
trafficstars

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.

bbeesley avatar Jun 12 '24 10:06 bbeesley

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?

nitrocode avatar Jun 22 '24 10:06 nitrocode

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

It also fails when var.enabled is false:

│ Error: Error in function call
│ 
│   on .terraform/modules/[REDACTED]/main.tf line 113, in locals:
│  113:   endpoint_address = coalesce(local.endpoint_serverless, local.endpoint_cluster, local.endpoint_instance)
│     ├────────────────
│     │ while calling coalesce(vals...)
│     │ local.endpoint_cluster is null
│     │ local.endpoint_instance is null
│     │ local.endpoint_serverless is null
│ 
│ Call to function "coalesce" failed: no non-null, non-empty-string arguments.
╵
╷
│ Error: Error in function call
│ 
│   on .terraform/modules/[REDACTED]/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.

marcuz avatar Jul 08 '24 14:07 marcuz

as cluster_endpoint doesn't have reader endpoint, that's why when you try to read try(aws_elasticache_replication_group.default[0].reader_endpoint_address, null) it return null workaround for me is to update reader_endpoint_cluster = try(aws_elasticache_replication_group.default[0].reader_endpoint_address, null) to reader_endpoint_cluster = try(aws_elasticache_replication_group.default[0].configuration_endpoint_address, null) just do it after your terraform init. good if someone can verify it's good and create a merge request in, I'm unable to push and raised a merge request for review.

chunboontangov avatar Jul 17 '24 05:07 chunboontangov