Terraform部署报错:插入DynamoDB表项时提示资源未找到
DynamoDB表未就绪时插入数据导致ResourceNotFoundException的解决办法
问题场景
使用Terraform创建DynamoDB表并插入初始数据时,执行terraform apply触发如下错误:
Error: creating DynamoDB Table Item: ResourceNotFoundException: Requested resource not found
原因是插入数据的操作在DynamoDB表完全创建(状态变为Active)前就被执行了。
原代码
module "dynamodb_table" { source = "terraform-aws-modules/dynamodb-table/aws" name = "${var.aws.region}-${var.config.dynamodb.table_name}" hash_key = var.config.dynamodb.hash_key attributes = [ { name = var.config.dynamodb.hash_key type = "S" } ] billing_mode = "PAY_PER_REQUEST" table_class = "STANDARD" } resource "random_string" "random" { length = 16 special = false } resource "aws_dynamodb_table_item" "table_item" { table_name = "${var.aws.region}-${var.config.dynamodb.table_name}" hash_key = var.config.dynamodb.hash_key item = <<ITEM { "${var.config.dynamodb.hash_key}": {"S": "${random_string.random.result}"}, "collections": {"M": {}} } ITEM }
解决办法
核心是让插入数据的资源明确依赖于DynamoDB表资源,确保表创建完成后再执行插入操作。
修改aws_dynamodb_table_item的table_name,从直接拼接变量改为引用模块输出的表名,Terraform会自动识别这个依赖关系,等待表创建完成(进入Active状态)后再执行插入操作:
resource "aws_dynamodb_table_item" "table_item" { table_name = module.dynamodb_table.name hash_key = var.config.dynamodb.hash_key item = <<ITEM { "${var.config.dynamodb.hash_key}": {"S": "${random_string.random.result}"}, "collections": {"M": {}} } ITEM }
原理说明
原代码中table_name是通过变量直接拼接生成,没有和module.dynamodb_table建立任何依赖关联,Terraform可能会并行执行创建表和插入数据的任务。改为引用module.dynamodb_table.name后,Terraform会感知到插入操作依赖于表的创建完成,因此会等待表资源完全就绪后再执行插入逻辑,从根本上避免了资源未找到的错误。
如果需要更显式的依赖声明,也可以添加depends_on参数(不过引用属性的方式更符合Terraform的最佳实践):
resource "aws_dynamodb_table_item" "table_item" { table_name = module.dynamodb_table.name hash_key = var.config.dynamodb.hash_key depends_on = [module.dynamodb_table] item = <<ITEM { "${var.config.dynamodb.hash_key}": {"S": "${random_string.random.result}"}, "collections": {"M": {}} } ITEM }
内容的提问来源于stack exchange,提问作者Avinash
相关产品推荐
相关产品推荐

