あれ、これ本当なのか、という挙動になったのが複数Subscriptionを扱う場合。
例えば私のアカウント状況が以下のようになっているとします。
$ az account list | jq '.[] | { "env": .name, "mail": .user.name }' { "env": "Staging", "mail": "kiririmode_stg@example.com" } { "env": "Production", "mail": "kiririmode_prod@example.com" }
kiririmode_stg@example.com
にはProduction環境のリソース作成権限はありません。
しかし、kiririmode_stg@example.com
でログインしている状態で以下のようにSubscriptionを跨いでリソースを構築する記述は可能です。
この状態でterraform apply
すると、本来はProduction環境へのリソース作成は失敗して欲しいのですが、なんと成功してしまったのです。
provider "azurerm" { features {} subscription_id = "xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxx" # Production環境のSubscriptionID } resource "azurerm_resource_group" "tfstate" { location = "japaneast" name = var.rg_name }
この問題は、Production環境へのログインが残っているからのように見えます。
確認したこと
アクセストークンはローカルにキャッシュされている
TerraformのAzure Providerはaz account get_access_token
で
アクセストークンを取得しており、アクセストークンはローカルにキャッシュされています。
$ ls ~/.azure/accessTokens.json /Users/kiririmode/.azure/accessTokens.json
ログアウトするとキャッシュは消える
az logout
すると、ログアウトしたユーザーのアクセストークンはローカルキャッシュから消えていました。
$ cp -p ~/.azure/accessTokens.json $ az logout $ diff -u <(cat accessTokens.json | jq .) <(cat ~/.azure/accessTokens.json | jq .) | less
予想
このあたりの関連で、まだ有効なProduction環境用のアクセストークンが使われてしまったのかなぁと考えています。
一旦、使わなくなったらaz logout
しましょう。