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

Zha*_* Yi 5 terraform

我正在使用 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 状态文件,但这需要我导入所有资源。我该如何解决这个问题?我使用的是本地状态而不是远程状态。

Kum*_*kaj 132

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

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

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


Jho*_*los 23

  1. 列出状态

    $ terraform state list
    
    data.terraform_remote_state.rg
    
    azurerm_subnet.vsubnet
    
    azurerm_virtual_network.vnet
    
    Run Code Online (Sandbox Code Playgroud)
  2. 删除选定状态。

    $ terraform state rm azurerm_subnet.vsubnet
    
    Removed azurerm_subnet.vsubnet
    
    Successfully removed 1 resource instance(s).
    
    Run Code Online (Sandbox Code Playgroud)


Piy*_*too 12

首先,您需要通过运行从状态文件中删除资源terraform state rm <resource-id>,然后需要从代码库中删除关联的配置。该运行后initplan你会看到不需要改变


小智 8

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

terraform state rm -dry-run $(terraform state list)
Run Code Online (Sandbox Code Playgroud)

之后删除-dry-run以应用更改。


bec*_*man 6

我想补充几件事,

  1. 在运行 terraform 命令从状态中删除资源时,请确保'正确引用()资源 ID,如下所示,
terraform state rm 'module.s3.module.s3_bucket["my-s3-bucket-name"].aws_s3_bucket.this[0]'  
Run Code Online (Sandbox Code Playgroud)

看起来很傻,但我不敢相信,我只是浪费了最后 10 分钟在这件事上摸不着头脑。

  1. Terraform 状态列表通常可能很长。如果您需要删除一组共享通用名称的资源,您可以使用以下 bash oneliner,
terraform state rm $(terraform state list | grep production-files)
Run Code Online (Sandbox Code Playgroud)

例如,上面的命令将删除 aws_s3_bucket、aws_s3_bucket_policy、aws_s3_bucket_cors_configuration 等。

  1. -dry-run在执行此类潜在破坏性操作之前请使用该标志。
terraform state rm 'resource_id' -dry-run
Run Code Online (Sandbox Code Playgroud)

输出:

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...
Run Code Online (Sandbox Code Playgroud)