Open7

Check! Terraform on Microsoft Azure スクラップブック

問題

terraform destroy で Azure Key Vault のシークレットが消せなくなった。

terraform --version

Terraform v0.14.3
+ provider registry.terraform.io/hashicorp/azurerm v2.41.0
Error: purging Secret "my-secret" (Key Vault "https://my-key-vault.vault.azure.net/"): keyvault.BaseClient#PurgeDeletedSecret: Failure responding to request: StatusCode=400 -- Original Error: autorest/azure: Service returned an error. Status=400 Code="NotSupported" Message="Operation \"purge\" is not enabled for this vault."

解決工程

この issue ぽいので確認していく。 (違いました)

https://github.com/terraform-providers/terraform-provider-azurerm/issues/9984

ドキュメントを見ると、

https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/key_vault

As of 2020-12-15 Azure now requires that Soft Delete is enabled on Key Vaults and this can no longer be disabled. Version v2.42 of the Azure Provider and later ignore the value of the soft_delete_enabled field and force this value to be true - as such this field can be safely removed from your Terraform Configuration. This field will be removed in version 3.0 of the Azure Provider.

とあるので、 2.42 で解消されるのかも。 (違いました)

ちょうど、21 hours ago に azurerm 2.42.0 がリリースされたので試してみる。リリースノートには soft_delete_enabled をデフォルトで true にする対処が入っている。

と思ったんだけど、試す前に削除成功してしまった…

結論

access_policy.secret_permissions"purge" を入れてないと発生する。含めてると発生しない。azurerm のバージョンは関係なかったです。

purge 指定してても消せない現象は発生していて、もう一度 terraform destroy すると発生せず消せる。謎。

問題

azurerm_key_vault で、シークレットを消しそびれたり、手動で消しちゃったりすると(↑の検証時など)、terraform apply などで変更を加えるとき下記のエラーが出ました。

Error: keyvault.BaseClient#RecoverDeletedSecret: Failure responding to request: StatusCode=403 -- Original Error: autorest/azure: Service returned an error. Status=403 Code="Forbidden" Message="The user, group or application 'appid=;oid=;numgroups=1;iss=https://sts.windows.net/' does not have secrets recover permission on key vault 'my-key-vault;location=japaneast'. For help resolving this issue, please see https://go.microsoft.com/fwlink/?linkid=2125287" InnerError={"code":"ForbiddenByPolicy"}

対処

access_policy.secret_permissions"recover" を含めることで解決。

resource "azurerm_key_vault" "example" {
  name                = "kv-test"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  sku_name            = "standard"
  tenant_id           = data.azurerm_client_config.current.tenant_id

  access_policy {
    tenant_id = data.azurerm_client_config.current.tenant_id
    object_id = data.azurerm_client_config.current.object_id

    secret_permissions = [
      "get",
      "set",
      "recover",
      "delete"
    ]
  }
}

Terraform の data は、「まだ存在しないリソースに対しては使えない」ので、別のモジュールだけど同時に作成するから最初からはないリソースを参照できずに困っていたのですが、 depends_on 使えばリソース出来上がってから参照できることに気付きました!!!

https://www.terraform.io/docs/configuration/blocks/resources/behavior.html#resource-dependencies

見つからないとこうなる

Error: Error: Subnet "snet-xxx" (Virtual Network "vnet-xxx" / Resource Group "rg-xxx") was not found

  on modules/module/virtual_network_subnet.tf line 9, in data "azurerm_subnet" "xxx":
   9: data "azurerm_subnet" "xxx" {

Remote State について勉強する

https://www.terraform.io/docs/language/state/remote.html

remote state

  • Azure Blob Storage などの、リモートのデータストアに状態を保持できる
  • 他の人の状態をシェアするのに便利
  • backend で実装されている

State Storage and Locking

https://www.terraform.io/docs/language/state/backends.html#manual-state-pull-push
  • backend は、デフォルトではローカルディスクに JSON ファイルで状態を保持する
  • 手動で状態を pull / push できる → terraform state push pull

Null Resource の triggers

https://registry.terraform.io/providers/hashicorp/null/latest/docs/resources/resource

私が探している解法はこれかもしれない!(モジュール間の依存をスマートに解きたくて苦戦している
→ 私の用途には使えなかったけど、いつか使えるかもしれない

ログインするとコメントできます