如何从Terraform状态中删除资源?

79

我正在使用 terraform 管理 AWS 上的基础设施代码。之前我的 terraform 项目创建了一个 S3 存储桶,后来我将这个 S3 存储桶从该项目中移动到了另一个项目中。因此,我在我的项目中删除了所有与 S3 相关的代码。但是,当我运行 terraform apply 时,出现错误提示:Error: error deleting S3 Bucket (xxxx): BucketNotEmpty: The bucket you tried to delete is not empty

我知道这是因为 Terraform 尝试从 S3 存储桶中删除资源,但实际上这些资源已经被我从项目中删除了。

我尝试使用 terraform refresh 命令,但却遇到了“禁止访问”错误:Error: Forbidden: Forbidden status code: 403, request id: 8351F9C3663AF8FB, host id:

我知道我可以从本地删除 Terraform 状态文件,但这需要我手动导入所有资源。有什么方法可以解决这个问题吗?我使用的是本地状态,不是远程状态。


在使用 dry run 命令之前,您可以先查看资源的情况:terraform state rm -dry-run <name> - Rajesh Swarnkar
7个回答

120

您可以像这样从Terraform中删除任何已添加的资源:

  1. 列出所有状态: terraform state list

  2. 从状态中删除所需的资源: terraform state rm <name>


46

首先,您需要通过运行terraform state rm <resource-id>从状态文件中删除该资源,然后您需要从代码库中删除相关配置。之后运行initplan,您将看到不需要进行任何更改。


1
如另一个答案所述,您可以选择使用名称而不是ID。 - Alejandro B.

23
  1. List states

    $ terraform state list
    
    data.terraform_remote_state.rg
    
    azurerm_subnet.vsubnet
    
    azurerm_virtual_network.vnet
    
  2. Remove selected state.

    $ terraform state rm azurerm_subnet.vsubnet
    
    Removed azurerm_subnet.vsubnet
    
    Successfully removed 1 resource instance(s).
    

7

如果您想从状态文件中删除所有资源,请运行:

terraform state rm -dry-run $(terraform state list)

在更改生效之前,请删除-dry-run


6

我想要补充几件事情:

  1. 在运行terraform命令移除某个资源的状态时,请确保适当地使用引号(')引用资源ID,例如:
terraform state rm 'module.s3.module.s3_bucket["my-s3-bucket-name"].aws_s3_bucket.this[0]'  

看起来很傻,但我简直不敢相信,我刚刚浪费了过去的10分钟在这个问题上。

  1. Terraform状态列表通常非常长。如果您需要删除共享公共名称的一组资源,则可以使用以下Bash oneliner:
terraform state rm $(terraform state list | grep production-files)

例如,上述命令将删除 aws_s3_bucket、aws_s3_bucket_policy、aws_s3_bucket_cors_configuration 等内容。
在执行此类可能具有破坏性的操作之前,请使用 -dry-run 标志。
terraform state rm 'resource_id' -dry-run

输出:

Acquiring state lock. This may take a few moments...
Would remove module.s3.module.s3_bucket["production-files"].aws_s3_bucket.this[0]
Releasing state lock. This may take a few moments...

1
引号(')的超级有用提示。 - undefined

3
在经过一些搜索之后,我发现解决方法是使用terraform state rm 命令将S3资源从本地状态文件中删除。

1
  1. 列出当前状态中的资源。 terraform state list
  2. 从状态中删除资源。 terraform state rm '<resource_name>'
  3. 从代码库中删除资源定义。
  4. Terraform apply 应该不显示任何更改。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接