如何告诉 terraform 它应该尝试删除软删除的 azure keyvault 密钥(如果存在)?

Db0*_*Db0 5 azure soft-delete terraform azure-keyvault

默认情况下,Azure 对所有 keyvault 密钥强制执行清除保护,这在使用 terraform 时会引起一些麻烦。特别是,这可能会遇到这样的情况:您使用磁盘加密密钥删除了虚拟机,因此 terraform 也从密钥库中删除了磁盘加密密钥。

\n

如果稍后您尝试重新创建该虚拟机(当然,您使用相同的加密密钥名称,因为它基于虚拟机名称),则创建过程将始终失败

\n
azurerm_key_vault_key.disk_encryption[5]: Creating...\n\xe2\x95\xb7\n\xe2\x94\x82 Error: Creating Key: keyvault.BaseClient#CreateKey: Failure responding to request: StatusCode=409 -- Original Error: autorest/azure: Service returned an error. Status=409 Code="Conflict" Message="Key vmname-custom-disk-encryption is currently in a deleted but recoverable state, and its name cannot be reused; in this state, the key can only be recovered or purged." InnerError={"code":"ObjectIsDeletedButRecoverable"}\n\xe2\x94\x82 \n\xe2\x94\x82   with azurerm_key_vault_key.disk_encryption[5],\n\xe2\x94\x82   on encryption.tf line 12, in resource "azurerm_key_vault_key" "disk_encryption":\n\xe2\x94\x82   12: resource "azurerm_key_vault_key" "disk_encryption" {\n
Run Code Online (Sandbox Code Playgroud)\n

如果在这种情况下,terraform 在就地修改之前简单地恢复有问题的密钥,那么这个问题很容易解决。

\n

有没有办法做到这一点,或者以其他方式解决这个问题?

\n

是的,我知道理论上我可以创建一个具有不同名称的虚拟机,但在本例中,我使用 terraform 创建一个虚拟机作为集群的一部分,并在虚拟机名称中count使用。count.index我通过测试是否可以从集群中删除虚拟机节点然后重新添加它们来遇到这个问题,但由于它们保持相同的名称,我遇到了可恢复的密钥 terraform 似乎无法处理。

\n

编辑:通过反复试验,我发现了以下内容。

\n

如果我将以下内容放入我的 azurerm 提供程序中

\n
provider "azurerm" {\n  features {\n    key_vault {\n      purge_soft_delete_on_destroy = false\n    }\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我报告的问题将会发生。当发现软删除时,密钥不会自动恢复。

\n

但是如果我把

\n
provider "azurerm" {\n  features {}\n}\n
Run Code Online (Sandbox Code Playgroud)\n

然后密钥将被恢复并重新使用,没有问题,但是terraform 在销毁时会失败,因为它也会尝试清除它!

\n
\xe2\x94\x82 Error: purging of Key "vmname-custom-disk-encryption" (Key Vault "https://keyvaultname.vault.azure.net/") : keyvault.BaseClient#PurgeDeletedKey: Failure responding to request: StatusCode=403 -- Original Error: autorest/azure: Service returned an error. Status=403 Code="Forbidden" Message="Operation \\"purge\\" is not allowed because purge protection is enabled for this vault. Key Vault service will automatically purge it after \nthe retention period has passed.\\r\\nVault: keyvaultname;location=westeurope"\n
Run Code Online (Sandbox Code Playgroud)\n

我将打开一个错误报告,因为这对我来说似乎是一个错误(为什么会purge_soft_delete_on_destroy = false阻止密钥恢复?),但我很好奇是否有人有解决方法。

\n

Db0*_*Db0 3

这是一种解决方法而不是答案,但它可能对其他人有帮助:

\n

如果您将以下内容放入 azurerm 提供程序中

\n
provider "azurerm" {\n  features {\n    key_vault {\n      purge_soft_delete_on_destroy = false\n    }\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我报告的问题将会发生。当发现软删除时,密钥不会自动恢复。

\n

但是如果你把

\n
provider "azurerm" {\n  features {}\n}\n
Run Code Online (Sandbox Code Playgroud)\n

然后密钥将被恢复并重新使用,没有问题,但是terraform 在销毁时会失败,因为它也会尝试清除它!

\n
\xe2\x94\x82 Error: purging of Key "vmname-custom-disk-encryption" (Key Vault "https://keyvaultname.vault.azure.net/") : keyvault.BaseClient#PurgeDeletedKey: Failure responding to request: StatusCode=403 -- Original Error: autorest/azure: Service returned an error. Status=403 Code="Forbidden" Message="Operation \\"purge\\" is not allowed because purge protection is enabled for this vault. Key Vault service will automatically purge it after \nthe retention period has passed.\\r\\nVault: keyvaultname;location=westeurope"\n
Run Code Online (Sandbox Code Playgroud)\n

使用第二种方法,您可以忽略失败的销毁错误。下一次销毁运行应该不会出现问题(因为此时什么都不存在)

\n

我已经为 terraform azurerm 提供商打开了有关此问题的错误报告

\n