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

Posted

技术标签:

【中文标题】如何从 terraform 状态中删除资源?【英文标题】:How can I remove a resource from terraform state? 【发布时间】:2020-08-01 11:32:36 【问题描述】:

我正在使用 terraform 来管理 AWS 上的 IaC。我的 terraform 项目创建了一个 s3 存储桶,后来我将 s3 存储桶 terraform 移到了另一个项目。所以我删除了我项目中所有与 s3 相关的代码。当我运行terraform apply 时,我收到一条错误消息Error: error deleting S3 Bucket (xxxx): BucketNotEmpty: The bucket you tried to delete is not empty

我了解 terraform 试图删除存储桶,因为我从那里删除了代码。

我尝试使用terraform refresh,但出现禁止错误:Error: Forbidden: Forbidden status code: 403, request id: 8351F9C3663AF8FB, host id:

我知道我可以从本地删除 terraform 状态文件,但这需要我导入所有资源。我该如何解决这个问题?我使用的是本地状态而不是远程状态。

【问题讨论】:

【参考方案1】:

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

【讨论】:

如另一个答案所述,您也可以使用名称而不是 id【参考方案2】:

您可以通过以下方式删除添加到 Terraform 的任何资源:-

    列出所有状态:- terraform state list

    删除您想要的状态:- terraform state rm <name>

【讨论】:

【参考方案3】:

    列出状态

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

    移除选中状态。

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

【讨论】:

【参考方案4】:

经过一番搜索,我发现解决方案是使用 terraform state rm 从我的本地状态文件中删除 s3 资源。

【讨论】:

以上是关于如何从 terraform 状态中删除资源?的主要内容,如果未能解决你的问题,请参考以下文章

Terraform不断强制重新创建资源(先删除再创建)]]

Terraform:删除身份块不会删除从资源天蓝色逻辑应用程序分配的身份

将现有资源导入 Terraform 状态文件时出错

Terraform 初始状态文件创建

如果 Terraform 重新创建在另一个状态中引用的资源怎么办?

如何从 terraform 状态设置打包程序变量