😊

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

株式会社BALEEN STUDIO

Discussion