サービス プリンシパルによる Azure SDK for Go 認証

このチュートリアルでは、Azure SDK for Go を使用し、シークレットまたは証明書を使用して Azure サービス プリンシパルにより Azure に対して認証を行います。

Azure サービス プリンシパルにより、Microsoft Entra テナントでアクセス ポリシーとアクセス許可が定義されます。 サインオン時の認証、リソース アクセス時の承認など、コア機能を利用できるようになります。 個人アカウントを使用して Azure リソースにアクセスする必要がなくなります。 Azure SDK for Go の Azure ID モジュールは、環境変数、シークレット、または証明書を使用して、サービス プリンシパルにより Azure で認証を行うための便利な方法を提供します。

このチュートリアルに従って、作成を行い、サービス プリンシパルを使用して Azure SDK for Go で認証を行います。

前提条件

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

1. 環境を構成する

開始する前に、新しいリソース グループとキー コンテナー インスタンスを作成します。

az group create --name go-on-azure --location eastus

az keyvault create --location eastus --name `<keyVaultName>` --resource-group go-on-azure

<keyVaultName> は、グローバルに一意である名前に置き換えてください。 出力から Id をメモします。サービス アカウントのスコープに対してこれを使用します。

2. Azure サービス プリンシパルを作成する

次のいずれかの手法を使用して Azure サービス プリンシパルを作成します。

Azure サービス プリンシパルの詳細については、「サービス プリンシパル オブジェクト」を参照してください。

オプション 1: シークレットを使用する Azure サービス プリンシパルを作成する

次のコマンドを実行して、Azure サービス プリンシパルを作成します。

az ad sp create-for-rbac --name `<servicePrincipalName>` --role Contributor --scope <resourceGroupId>

<servicePrincipalName><resourceGroupId> を、適切な値に置き換えます。

password 値は必ずコピーしてください。この値は取得できません。 パスワードを忘れた場合は、サービス プリンシパルの資格情報をリセットします。

オプション 2: 証明書を使用する Azure サービス プリンシパルを作成する

az ad sp create-for-rbac --name <servicePrincipal> --create-cert --role Contributor --scope <resourceGroupId>

<servicePrincipalName><resourceGroupId> を、適切な値に置き換えます。

3. サービス プリンシパルを使用して Azure に対して認証を行う

DefaultAzureCredential を使用すると、Azure に対して認証を行うための環境固有のコードを記述しなくて済みます。

DefaultAzureCredential を使用して、環境変数を定義することで、サービス プリンシパルの資格情報を構成します。

サービス プリンシパルの資格情報を構成するには、次のいずれかのオプションを選択します。

DefaultAzureCredential の詳細については、「Azure SDK for Go での Azure 認証」を参照してください。

オプション 1: シークレットを使用して認証する

次の環境変数を定義します。

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

オプション 2: 証明書を使用して認証する

変数名
AZURE_CLIENT_ID Azure サービス プリンシパルのアプリケーション 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>"

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

Azure ID モジュールの NewDefaultAzureCredential 関数を使用して ResourceClient を認証します。

cred, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
    log.Fatalf("failed to obtain a credential: %v", err)
}

4. サンプル コード

次のコード サンプルを使用して、サービス プリンシパルが Azure に対して認証されること、およびリソース グループに対する適切なアクセス許可を持っていることを確認します。

  1. ホーム ディレクトリ内に go-on-azure という名前の新しいディレクトリを作成します。

    mkdir ~/go-on-azure
    
  2. go-on-azure ディレクトリに変更します。

    cd ~/go-on-azure
    
  3. go mod init を実行して、go.mod ファイルを作成します。

    go mod init go-on-azure
    
  4. go get を実行して、必須の Go モジュールをインストールします。

    go get "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
    go get "github.com/Azure/azure-sdk-for-go/sdk/keyvault/azsecrets"
    
  5. main.go という名前のファイルを作成し、次のコードを追加します。

    package main
    
    import (
    	"context"
    	"fmt"
    	"log"
    	"os"
    
    	"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
    	"github.com/Azure/azure-sdk-for-go/sdk/keyvault/azsecrets"
    )
    
    func createSecret(name, value string) {
    	keyVaultName := os.Getenv("KEY_VAULT_NAME")
    	keyVaultUrl := fmt.Sprintf("https://%s.vault.azure.net/", keyVaultName)
    
    	cred, err := azidentity.NewDefaultAzureCredential(nil)
    	if err != nil {
    		log.Fatalf("failed to obtain a credential: %v", err)
    	}
    
    	client, err := azsecrets.NewClient(keyVaultUrl, cred, nil)
    	if err != nil {
    		log.Fatalf("failed to create a client: %v", err)
    	}
    
    	resp, err := client.SetSecret(context.TODO(), name, value, nil)
    	if err != nil {
    		log.Fatalf("failed to create a secret: %v", err)
    	}
    
    	fmt.Printf("Name: %s, Value: %s\n", *resp.ID, *resp.Value)
    }
    
    func main() {
    	createSecret("ExamplePassword", "hVFkk965BuUv")
    }
    
    
  6. KEY_VAULT_NAME という名前の環境変数を作成します。 環境変数の値を、前に作成した Azure Key Vault の名前に設定します。

    export KEY_VAULT_NAME=<KeyVaultName>
    

    <KeyVaultName> を、Azure Key Vault インスタンスの名前に置き換えます。

  7. go run コマンドを実行して、新しいキー コンテナーのシークレットを作成します。

     go run main.go
    

次のステップ