Terraformのazapiプロバイダー認証の優先順位

Azure

結論

azapiプロバイダーでAzure認証を行う時、Azure CLIとMSIがともに設定されている場合はMSIが優先される。CLIを優先する場合は「use_msi = false」を設定する。

問題発生経緯

作業環境は以下の構成です。

  • 2つのテナントを使用している
  • テナントAのVMからテナントBにAzureリソースを作成する
  • テナントAのVMにはテナントAのサブスクリプションに対するContributor権限が付与されている
  • テナントAのVM上でテナントBのサブスクリプションに対してAzure CLIでログインしている

上記のような開発構成でかつazapiプロバイダーを利用するという非常に特殊な環境でterraformの開発を行っていました。azurermプロバイダーだけで作業していた時は問題なくAzure CLI認証でリソースを作成できていました。しかし、azapiでリソースを追加し作成しようとしたとき以下のエラーが発生しました。

--------------------------------------------------------------------------------
│ RESPONSE 401: 401 Unauthorized
│ ERROR CODE: InvalidAuthenticationTokenTenant
│ --------------------------------------------------------------------------------
│ {
│   "error": {
│     "code": "InvalidAuthenticationTokenTenant",
│     "message": "The access token is from the wrong issuer 'https://sts.windows.net/テナントAのID/'. It must match the tenant 'https://sts.windows.net/テナントBのID/' associated with this subscription. Please use the authority (URL) 'https://login.windows.net/テナントBのID' to get the token.
(略)"

テナントBに対して認証を行いたいが、テナントAに対して行ってしまっているようでした。

対処方法

azapiのドキュメントを眺めていると以下の記載に気づきました。

When authenticating using Managed Identity, the following fields can be set:

  • use_msi – (Optional) Should Managed Identity be used for Authentication? This can also be sourced from the ARM_USE_MSI Environment Variable. Defaults to true.
Docs overview | Azure/azapi | Terraform Registry

さらにazapiのGithubのissuesにも下記のコメントがありました。

The MSI has higher priority than azure cli login. Please check if there’re environment variables like AZURE_CLIENT_SECRETARM_CLIENT_ID, and remove them.

Ignores Az Login credentials and uses MSI · Issue #203 · Azure/terraform-provider-azapi · GitHub

そこで以下のようにazapiプロバイダーを構成すると無事テナントBへ認証を行い、リソースの作成に成功しました。

provider "azapi" {
  use_msi = false
}

余談

azurermプロバイダーではなぜ問題が発生しなかったのでしょうか。それもドキュメントに答えが記載されていました。

use_msi – (Optional) Should Managed Identity be used for Authentication? This can also be sourced from the ARM_USE_MSI Environment Variable. Defaults to false.

Docs overview | hashicorp/azurerm | Terraform Registry

MSI認証はデフォルトでfalseに設定されているのでazurermでは問題ありませんでした。プロバイダー作成元が違うとはいえ、同じ設定にしてほしいものです。

コメント