サービス プリンシパルによる 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 に対して認証されること、およびリソース グループに対する適切なアクセス許可を持っていることを確認します。
ホーム ディレクトリ内に
go-on-azure
という名前の新しいディレクトリを作成します。mkdir ~/go-on-azure
go-on-azure
ディレクトリに変更します。cd ~/go-on-azure
go mod init
を実行して、go.mod
ファイルを作成します。go mod init go-on-azure
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"
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") }
KEY_VAULT_NAME
という名前の環境変数を作成します。 環境変数の値を、前に作成した Azure Key Vault の名前に設定します。export KEY_VAULT_NAME=<KeyVaultName>
<KeyVaultName>
を、Azure Key Vault インスタンスの名前に置き換えます。go run
コマンドを実行して、新しいキー コンテナーのシークレットを作成します。go run main.go
次のステップ
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示