Terraform忽略aws_dynamodb_table_item的AWS副本属性变更失败
解决Terraform忽略DynamoDB副本属性变更的问题
问题描述
使用以下Terraform代码创建DynamoDB表项:
resource "aws_dynamodb_table_item" "docroot" { count = length(XXX) table_name = XXXX hash_key = XXXXX item = <<EOF { "XXXX": { "S": "XXXX${count.index}" }, "XXXX": { "S": "XXXX${count.index}" }, "XXXX": { "S": "XXXX${count.index}" } } EOF }
代码可正常运行,但每次执行terraform plan或terraform apply时,Terraform都会检测到AWS自动注入的副本属性变更:
# aws_dynamodb_table_item.docroot[0] will be updated in-place ~ resource "aws_dynamodb_table_item" "docroot" { ~ item = jsonencode( ~ { - aws:rep:deleting = { - BOOL = false } -> null - aws:rep:updateregion = { - S = "us-west-2" } -> null - aws:rep:updatetime = { - N = "1682511411.190001" } -> null # (3 unchanged elements hidden) } ) # (2 unchanged attributes hidden) }
尝试添加生命周期规则忽略这些属性时,出现语法错误:
lifecycle { ignore_changes=[ "item.aws:rep:deleting", ] }
报错信息:
│ Error: Invalid character │ │ on xxx.tf line 21, in resource "aws_dynamodb_table_item" "docroot": │ 21: "item.aws:rep:deleting", │ │ Expected an attribute access or an index operator.
环境版本:
- Terraform v1.1.6
- provider registry.terraform.io/hashicorp/aws v4.64.0
错误原因
属性键中的冒号(:)属于Terraform语法的特殊字符,使用点语法(item.aws:rep:deleting)会被Terraform误解析为属性访问分隔符,导致语法错误。
解决方案
使用字符串索引的方式指定包含特殊字符的属性键,修改后的完整配置如下:
resource "aws_dynamodb_table_item" "docroot" { count = length(XXX) table_name = XXXX hash_key = XXXXX item = <<EOF { "XXXX": { "S": "XXXX${count.index}" }, "XXXX": { "S": "XXXX${count.index}" }, "XXXX": { "S": "XXXX${count.index}" } } EOF lifecycle { ignore_changes = [ item["aws:rep:deleting"], item["aws:rep:updateregion"], item["aws:rep:updatetime"], ] } }
验证
配置完成后,执行terraform plan,Terraform将不再检测这三个AWS副本属性的变更,也不会提示需要更新表项。
内容的提问来源于stack exchange,提问作者Nega
相关产品推荐
相关产品推荐

