问题描述
使用Terraform设置了一个Redis集群,现在希望在不丢失状态的情况下,向集群添加分片。目前在使用Terraform更新分片数量时,会导致Terraform创建新资源而不是执行原地更新。用户想知道是否有方法在Terraform中执行原地更新,或者是否可以使用Terraform在不丢失数据库状态的情况下添加分片。用户还尝试使用terraform refresh
命令来同步状态,但是terraform apply
仍然认为资源需要更改。
解决方案
请注意以下操作可能涉及版本差异及风险。建议在操作前做好备份并仔细阅读官方文档。
使用数据源来获取实际节点数量
您可以在创建aws_elasticache_replication_group
资源时,使用数据源aws_elasticache_cluster
来检索实际节点数量。这样您就不需要使用ignore_changes
来忽略更改。
下面是在Terraform中执行此操作的步骤:
- 在Terraform配置文件中,定义
aws_elasticache_replication_group
资源,与您目前的配置类似。 - 添加一个数据源定义,以检索实际节点数量。这将帮助Terraform了解当前部署的节点数量。
- 在资源定义中,使用获取的节点数量作为分片数目。
以下是示例代码:
# 定义aws_elasticache_replication_group资源
resource "aws_elasticache_replication_group" "instance" {
replication_group_id = "test"
# 其他配置项
}
# 定义aws_elasticache_cluster数据源
data "aws_elasticache_cluster" "existing_cluster" {
cluster_id = aws_elasticache_replication_group.instance.primary_endpoint_address
}
# 使用数据源中的节点数量作为分片数目
resource "aws_elasticache_replication_group" "instance" {
replication_group_id = "test"
# 其他配置项
cluster_mode {
num_node_groups = data.aws_elasticache_cluster.existing_cluster.num_cache_nodes
}
}
通过上述步骤,您可以使用数据源中实际节点数量作为新分片的数量,从而避免在Terraform中创建新资源。
Terraform中的原地更新
此部分基于最佳答案的用户投票。但请根据您的情况自行验证。
幸运的是,Terraform现在支持对分片数量进行原地更新,不再会导致问题。根据更新后的Terraform文档,您可以看到以下描述:
num_node_groups
指定此Redis复制组的节点组(分片)数量。更改此数字将在其他设置修改之前触发在线调整操作。
在此之前的文档中,描述为:
更改此数字将强制创建新资源。
这意味着您现在可以安全地使用Terraform在不丢失数据库状态的情况下,更新分片的数量。不再需要手动更改或使用AWS UI。
总结
通过使用Terraform的数据源来检索实际节点数量,您可以避免创建新资源,从而保留数据库状态。此外,Terraform现在已经支持对分片数量进行原地更新,您可以放心地使用Terraform来管理Redis集群的分片配置,无需担心丢失状态。
请注意,根据您的实际情况和环境,建议您在执行任何更改之前,仔细查阅官方文档并在非生产环境中进行测试。