結論
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:
Docs overview | Azure/azapi | Terraform Registry
use_msi
– (Optional) Should Managed Identity be used for Authentication? This can also be sourced from theARM_USE_MSI
Environment Variable. Defaults totrue
.
さらにazapiのGithubのissuesにも下記のコメントがありました。
The MSI has higher priority than azure cli login. Please check if there’re environment variables like
Ignores Az Login credentials and uses MSI · Issue #203 · Azure/terraform-provider-azapi · GitHubAZURE_CLIENT_SECRET
,ARM_CLIENT_ID
, and remove them.
そこで以下のようにazapiプロバイダーを構成すると無事テナントBへ認証を行い、リソースの作成に成功しました。
provider "azapi" {
use_msi = false
}
余談
azurermプロバイダーではなぜ問題が発生しなかったのでしょうか。それもドキュメントに答えが記載されていました。
Docs overview | hashicorp/azurerm | Terraform Registry
use_msi
– (Optional) Should Managed Identity be used for Authentication? This can also be sourced from theARM_USE_MSI
Environment Variable. Defaults tofalse
.
MSI認証はデフォルトでfalseに設定されているのでazurermでは問題ありませんでした。プロバイダー作成元が違うとはいえ、同じ設定にしてほしいものです。
コメント