理系学生日記

おまえはいつまで学生気分なのか

Azureの複数Subscriptionを扱う場合は頻繁にaz logoutすべき

あれ、これ本当なのか、という挙動になったのが複数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しましょう。