使用 Terraform 更改 hash_key 会导致表已存在错误

Posted

技术标签:

【中文标题】使用 Terraform 更改 hash_key 会导致表已存在错误【英文标题】:Changing hash_key with Terraform causes Table already exists error 【发布时间】:2021-05-28 22:33:39 【问题描述】:

我有一个用这个 Terraform 创建的 DynamoDB 表:

resource "aws_dynamodb_table" "materials_table" 
  name              = "materials"
  hash_key          = "MATERIAL"
  billing_mode      = "PROVISIONED"
  read_capacity     = 5
  write_capacity    = 5
  
  attribute 
    name = "MATERIAL"
    type = "S"
  

表已成功填充(有 4 条记录,如 this post 中所述)但为了解决问题(在那篇文章中)我添加了一个字段 PK 并将其设置为 hash_key 字段,用这个:

resource "aws_dynamodb_table" "materials_table" 
  name              = "materials"
  hash_key          = "PK"
  billing_mode      = "PROVISIONED"
  read_capacity     = 5
  write_capacity    = 5
  
  attribute 
    name = "PK"
    type = "S"
  

这导致运行terraform apply时出现以下错误:

Error: error creating DynamoDB Table: ResourceInUseException: Table already exists: materials

我需要在.tf 中做什么才能让更改被接受?

【问题讨论】:

【参考方案1】:

不允许更改 DynamoDB 中的某些属性,例如更改分区键、添加本地二级索引等。

当发生此类更改时,它需要替换资源,并且要替换,它会尝试删除并重新创建资源。在这个过程中,如果表已经存在,就会失败。

唯一的选择是删除堆栈或手动删除 DynamoDB 表并让模板再次创建它。或者重命名表格。

Documentation表示会强制新资源

hash_key - (必需,强制使用新资源)用作 哈希(分区)键。

【讨论】:

我使用的是 Terraform,而不是 CloudFormation。 我原以为要删除该表,但该错误表明未尝试此操作。 我想,它会先尝试创建表然后删除它。 所以重命名表应该有助于删除它..? 100% 。重命名肯定会有所帮助。

以上是关于使用 Terraform 更改 hash_key 会导致表已存在错误的主要内容,如果未能解决你的问题,请参考以下文章

GKE terraform 的标签更改导致整个集群崩溃

如何通过 Terraform 管理 BigQuery 表的架构更改

等待 GCP 基础架构更改传播的 Terraform 问题

如何在terraform中更改GKE Cluster的节点池中的节点名称?

我们可以更改子模块“.terraform/modules”中的某些内容吗?

动态更改terraform中aws_elasticache_replication_group的配置