Go 用 Azure ID モジュールを使用した Azure の認証

このチュートリアルでは、Go 用 Azure ID モジュールから DefaultAzureCredential を使用して Azure に対する認証を行います。 Azure ID モジュールには、Microsoft Entra ID を使用した OAuth に焦点を当てた資格情報の種類がいくつか用意されています。

DefaultAzureCredential では、一般的に使用される種類の資格情報を組み合わせることで認証が簡素化されます。 これにより、Azure にデプロイされたアプリケーションを認証するために使用される認証情報の種類と、開発環境で認証のために使用される認証情報の種類が連結されます。

前提条件

  • Azure サブスクリプション:Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。
  • Go がインストールされていること: バージョン 1.18 またはそれ以上

1. Go 用の Azure ID モジュールをインストールする

次のコマンドを実行して azidentity モジュールをダウンロードします。

go get -u github.com/Azure/azure-sdk-for-go/sdk/azidentity

2. Azure で認証する

DefaultAzureCredential を使用して、次のいずれかの手法により Azure に対して認証を行います。

さまざまな種類の資格情報について詳しくは、「資格情報の種類」を参照してください。

オプション 1: 環境変数を定義する

DefaultAzureCredential では、EnvironmentCredential 型を使用して、3 種類の認証をサポートする環境変数を使用した認証が構成されます。 次の種類の認証から選択を行い、適切な環境変数を定義します。

シークレットを使用したサービス プリンシパル

変数名
AZURE_CLIENT_ID Azure サービス プリンシパルのアプリケーション ID
AZURE_TENANT_ID アプリケーションの Microsoft Entra テナントの ID
AZURE_CLIENT_SECRET Azure サービス プリンシパルのパスワード
export AZURE_TENANT_ID="<active_directory_tenant_id"
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_CLIENT_SECRET="<service_principal_password>"

証明書を使用したサービス プリンシパル

変数名
AZURE_CLIENT_ID Microsoft Entra アプリケーションの ID
AZURE_TENANT_ID アプリケーションの Microsoft Entra テナントの ID
AZURE_CLIENT_CERTIFICATE_PATH (パスワード保護のない) 秘密キーを含む証明書ファイルへのパス
export AZURE_TENANT_ID="<active_directory_tenant_id>"
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_CLIENT_CERTIFICATE_PATH="<azure_client_certificate_path>"

ユーザー名とパスワード

変数名
AZURE_CLIENT_ID Microsoft Entra アプリケーションの ID
AZURE_USERNAME ユーザー名 (通常は電子メール アドレス)
AZURE_PASSWORD そのユーザーのパスワード
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_USERNAME="<azure_username>"
export AZURE_PASSWORD="<azure_user_password>"

構成は上記の順序で試みられます。 たとえば、クライアント シークレットと証明書の値が両方存在する場合、クライアント シークレットが使用されます。

オプション 2: ワークロード ID を使用する

Microsoft Entra ワークロード ID を使用すると、Kubernetes クラスター内のポッドで Kubernetes ID (サービス アカウント) を使用できます。 Kubernetes トークンが発行され、OIDC フェデレーションにより、Kubernetes アプリケーションは Microsoft Entra ID を使用して Azure リソースに安全にアクセスできるようになります。

EnvironmentCredential の必要な環境変数が存在しない場合、DefaultAzureCredential では WorkloadIdentityCredential を使用して認証を試みます。 WorkloadIdentityCredential は、ワークロード ID webhook によって設定された環境変数からサービス プリンシパルの構成の読み取りを試みます。

オプション 3: マネージド ID を使用する

マネージド ID により、開発者は資格情報を管理する必要がなくなります。 Microsoft Entra 認証をサポートするリソースに接続することで、アプリケーションで、資格情報の代わりに Microsoft Entra トークンを使用できます。

WorkloadIdentityCredential の必要な環境変数が存在しない場合、DefaultAzureCredentialManagedIdentityCredential を使用して認証を試みます。

ユーザー割り当てのマネージド ID を使用する場合は、次のコマンドを実行して AZURE_CLIENT_ID 環境変数を設定してください。

export AZURE_CLIENT_ID="<user_assigned_managed_identity_client_id>"

オプション 4: Azure CLI を使用してサインインする

ローカル開発の摩擦を減らすために、DefaultAzureCredential では、Azure CLI にサインインしたユーザーとして認証を行うことができます。

次のコマンドを実行して Azure CLI にサインインします。

az login

Azure で実行されるアプリケーションに対して、Azure CLI 認証は推奨されていません。

3. DefaultAzureCredential を使用して ResourceClient を認証する

DefaultAzureCredential を使用した Azure に対する認証をテストするために、azure-auth という名前の新しいサンプル Go モジュールを作成してください。

  1. サンプル Go コードをテストおよび実行するためのディレクトリを作成し、そのディレクトリに変更します。

  2. go mod init を実行してモジュールを作成します。

    go mod init azure-auth
    
  3. go get を実行して、必要な Azure SDK for Go モジュールをダウンロード、ビルド、インストールします。

    go get "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
    go get "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/subscription/armsubscription"
    
  4. main.go という名前のファイルを作成し、次のコードを挿入します。

    package main
    
    import (
      "context"
    
      "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
      "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/subscription/armsubscription"
    )
    
    const subscriptionID = "<subscription ID>"
    
    func main() {
      cred, err := azidentity.NewDefaultAzureCredential(nil)
      if err != nil {
        // TODO: handle error
      }
      // Azure SDK Resource Management clients accept the credential as a parameter.
      // The client will authenticate with the credential as necessary.
      client, err := armsubscription.NewSubscriptionsClient(cred, nil)
      if err != nil {
        // TODO: handle error
      }
      _, err = client.Get(context.TODO(), subscriptionID, nil)
      if err != nil {
        // TODO: handle error
      }
    }   
    
    

    <subscription ID> は、サブスクリプション ID で置き換えてください。

  5. go run を実行し、アプリケーションをビルドして実行してください。

    go run .
    

DefaultAzureCredential を使用して Azure に対して認証を行う

DefaultAzureCredential を使用して、Azure ID モジュールで Azure に対して認証を行うには、アプリケーションで次のコードを使用します。

// This credential type checks environment variables for configuration.
cred, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
  // handle error
}

// Azure Resource Management clients accept the credential as a parameter
client, err := armresources.NewClient("<subscriptionId>", cred, nil)
if err != nil {
  // handle error
}

トラブルシューティング

特定の資格情報の種類によるエラーの解決に関するガイダンスについては、トラブルシューティング ガイドを参照してください。

次のステップ