[メモ] KeyVaultSecret 4.3.0 以上を使う場合の注意点

[前回の記事](https://qiita.com/tnishiki/items/7a959ae6be6f64c3de16)の続きでもあります。

Azure PaaS の KeyVault を使おうとすると AuthenticationFaildException エラーになるので、調べたところ、az コマンドでのログインが出来ていなかったのが前回の結論でした。
az cli でログインすれば、ちゃんと動作しました。

ところが、Azure.Security.KeyVault.Secrets パッケージを 4.1.0 から 4.4.0 にアップデートしたところ、再び AuthenticationFaildException エラーが発生しました。

コードはこんな感じです。
```c#:KeyVault サンプル
static string GetHimichuString()
{
  string keyVaultUrl = "https://himichumoji.vault.azure.net/"; //コンテナのURL
  try
  {
    var client = new SecretClient(new Uri(keyVaultUrl), new DefaultAzureCredential());
    KeyVaultSecret secret = client.GetSecret("himichu"); //<--ここでエラー
    return secret.Value;
  }
  catch(Exception ex){
  }
}
```

エラー内容としては、次の通りでした。

```:エラー
Azure.Identity.AuthenticationFailedException: 'Azure CLI authentication failed 
due to an unknown error. See the troubleshooting guide for more information.
https://aka.ms/azsdk/net/identity/azclicredential/troubleshoot 
ERROR: az: error: unrecognized arguments: --tenant 
```

最終行の「unrecognized arguments: --tenant」が妙に気になるところですが、ひとまず、パッケージのアップデートで発生していますので、どのバージョンから発生したかを調べます。

|バージョン|成否|
|-|-|
|4.1.0 |成功|
|4.2.0 |成功|
|4.3.0 |失敗|
|4.4.0 |失敗|

4.3.0 から失敗するようです。Changelog を見てみます。

https://github.com/Azure/azure-sdk-for-net/blob/main/sdk/keyvault/Azure.Security.KeyVault.Secrets/CHANGELOG.md

* 4.3.0 (2022-03-24)
  * Changes from both the last release and the last beta include:Features Added
Added KeyVaultSecretIdentifier.TryCreate to parse secret URIs without throwing an exception when invalid. (#23146)
Support multi-tenant authentication against Key Vault and Managed HSM when using Azure.Identity 1.5.0 or newer. (#18359)
Bugs Fixed
Added secret version to distributed tracing. (#12907)
Other Changes
The default service version is now "7.3".
* 4.3.0-beta.4 (2022-01-12)
  * Other Changes
Package metadata fixed
* 4.3.0-beta.3 (2022-01-11)
  * Other Changes
Bug fixes
* 4.3.0-beta.2 (2021-10-14)
  * Features Added
Added KeyVaultSecretIdentifier.TryCreate to parse secret URIs without throwing an exception when invalid. (#23146)
<b>Support multi-tenant authentication against Key Vault and Managed HSM when using Azure.Identity 1.5.0 or newer. (#18359)</b>
Bugs Fixed
Added secret version to distributed tracing. (#12907)
* 4.3.0-beta.1 (2021-08-10)
  * Fixed
The default service version is now "7.3-preview".

どうやら、4.3.0-beta.2 (2021-10-14) で multi-tenant での認証に対応したようで、これがキーになりそうです。


Azure.Security.KeyVault.Secrets は、バックグラウンドで python + azcli を起動して認証情報の処理を行っているようです。
ということは azcli も multi-tenant に対応したバージョンが必要ということになります。

次のページにある通り、az コマンドで multi-tenant に対応しているのは、2.38.0 以降のようです。

https://learn.microsoft.com/ja-jp/cli/azure/account/tenant?view=azure-cli-latest

ということで、自環境の az コマンドバージョンを見てみると。。。

```cmd
c:\> az --version
azure-cli (2.0.52)

acr (2.1.10)
　：
```

に、2.0.52 ？！古すぎる！
az upgrade でのバージョンアップにも対応していない古いバージョンでした。

ということで、最新版にアップグレードします。

```powershell:az コマンドのアップグレード
PS> winget install -e --id Microsoft.AzureCLI
```

次に、テナントが意識されるようになりましたので、環境変数として AZURE_TENANT_ID をセットします。

詳細はこちらが詳しいです。
https://azuresdkdocs.blob.core.windows.net/$web/dotnet/Azure.Security.KeyVault.Secrets/4.4.0/api/index.html

複数のテナントがある場合は、プログラム内で SecretClient を使う前に KeyVaul AZURE_TENANT_ID をセットします。

```c#:KeyVault サンプル
static string GetHimichuString()
{
  string keyVaultUrl = "https://himichumoji.vault.azure.net/"; //コンテナのURL
  try
  {
    Environment.SetEnvironmentVariable("AZURE_TENANT_ID", "aaaaaaaa-6800-9801-8801-bbbbbbbbbbbb");

    var client = new SecretClient(new Uri(keyVaultUrl), new DefaultAzureCredential());
    KeyVaultSecret secret = client.GetSecret("himichu"); 
    return secret.Value;
  }
  catch(Exception ex){
  }
}
```

プログラムを次項したところ、はい、うまく動きました。

# 学びのポイント

ツール類のバージョンアップはときどきちゃんとしておくべし。