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 種類の認証をサポートする環境変数を使用した認証が構成されます。 次の種類の認証から選択を行い、適切な環境変数を定義します。

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

変数名 Value
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>"

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

変数名 Value
AZURE_CLIENT_ID Microsoft Entra アプリケーションの ID
AZURE_TENANT_ID アプリケーションの Microsoft Entra テナントの ID
AZURE_CLIENT_CERTIFICATE_PATH 秘密キーを含む PEM または PKCS12 証明書ファイルへのパス
AZURE_CLIENT_CERTIFICATE_PASSWORD (省略可) 証明書ファイルのパスワード
export AZURE_TENANT_ID="<active_directory_tenant_id>"
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_CLIENT_CERTIFICATE_PATH="<azure_client_certificate_path>"

ユーザー名とパスワード

変数名 Value
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>"

構成は上記の順序で試みられます。 たとえば、クライアント シークレットと証明書の値が両方存在する場合、クライアント シークレットが使用されます。 サービス プリンシパルを使用した認証に関するエンド ツー エンドのチュートリアルについては、「サービス プリンシパルによる Azure SDK for Go 認証」を参照してください。

オプション 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 認証をサポートするリソースに接続すると、Azure でホストされるアプリケーションで、資格情報の代わりに Microsoft Entra トークンを使用できます。 マネージド ID は、ローカル開発ではサポートされていません。

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

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

export AZURE_CLIENT_ID="<user_assigned_managed_identity_client_id>"

環境変数 AZURE_CLIENT_ID が設定されていない場合、ホスティング リソースで有効になっている場合は、DefaultAzureCredentials はシステム割り当てマネージド ID を使用して認証を試みます。

Azure でホストされるアプリでのマネージド ID を使用した認証に関するエンド ツー エンドのチュートリアルについては、「マネージド ID を使用して Azure SDK for Go で認証を行う」を参照してください。

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

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

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

az login

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

ローカル開発では、ユーザーが Azure CLI にサインインしていない場合、DefaultAzureCredential は Azure Developer CLI にサインインしたユーザーとして認証できます。

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

azd auth login

Azure で実行されるアプリケーションに対して、Azure Developer 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 .
    

    Note

    ローカル システムでそのまま実行するには、Azure CLI または Azure Developer CLI を使用して Azure にサインインする必要があります。

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
}

トラブルシューティング

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

次のステップ