Go言語: Azureの資格情報取得時に使用するDefaultAzureCredentialに関するメモ
皆さん、Go言語でAzure使っていますか?私は使っています。
さて、今回はGo言語でのAzure ID認証のお話しです。
皆さん、以下のようにDefaultAzureCredentialを使うケースが多いと思います。
import (
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
)
// 認証の作成
credential, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
return nil, err
}
// Blobクライアントの作成
accountURL := "https://hoge.blob.core.windows.net"
client, err := azblob.NewClient(accountURL, credential, nil)
if err != nil {
return nil, err
}
DefaultAzureCredentialを使う理由としては、ローカルでの試験ではazコマンドのログイン情報を使い、実環境やクラウド上の試験環境では、Web AppsやACAに割り付けているManagedIDを使用したいが、そのたびにコードを書き換えたくないとか、同じ事をするコードを2つ書きたくないなどだと思います。DefaultAzureCredentialはそこをよしなにやってくれるのでありがたい存在です。
しかし、デメリットもあって、DefaultAzureCredentialでは複数の認証手段を順に探しに行く都合上、実際に使用する認証手段を見つけて初期化が完了するまでに時間がかかる場合があります。このため、ACAなどではコンテナの起動時間内に初期化が完了せず、コンテナが起動に失敗してしまう可能性があったため、DefaultAzureCredentialの使用が非推奨になっていたりしました。
しかしながら、azidentity モジュール バージョン 1.11.0以降ではここが改善されており、環境変数を設定し、コードを若干修正することで、優先的に使用する認証方式を指定できるようになりました。これにより、適切に設定すれば、問題となっていた初期化の時間の問題を回避することができます。
まず、環境変数AZURE_TOKEN_CREDENTIALSを設定します。設定する値は以下の通りです。
| 値 | 認証方式 |
|---|---|
AzureCLICredential |
az cli |
AzureDeveloperCLICredential |
azd cli |
AzurePowerShellCredential |
azure powershell |
EnvironmentCredential |
アプリ環境変数 |
ManagedIdentityCredential |
ManagedID |
WorkloadIdentityCredential |
AKS上のワークロードID |
参考: azidentity package - github.com/Azure/azure-sdk-for-go/sdk/azidentity - Go Packages
たとえば、azコマンドでのログイン情報を使用したい場合には以下のように設定します。
export AZURE_TOKEN_CREDENTIALS=AzureCLICredential
コードは以下のように修正します。
opts := azidentity.DefaultAzureCredentialOptions{RequireAzureTokenCredentials: true}
credential, err := azidentity.NewDefaultAzureCredential(&opts)
if err != nil {
return nil, err
}
本件は以上となります。
参照: Go 用 Azure ID ライブラリ内の資格情報チェーン - Go on Azure | Microsoft Learn
Discussion