コントロール プレーン操作に Go のAzure SDKを使用する

Go 管理ライブラリのAzure SDKを使用して、Azure リソースをプログラムでプロビジョニング、構成、管理する方法について説明します。 一般的なコントロール プレーン ワークフローには、リソース グループの作成、ストレージとネットワーク インフラストラクチャの管理、作成、開始、停止、サイズ変更、更新、削除などの仮想マシン (VM) ライフサイクル操作の処理が含まれます。 管理ライブラリを Go のAzure SDKにどのように適合させるかについてのより高度な概要が必要な場合は、go 管理ライブラリのAzure SDKのOverview から始めます。 この記事では、サービス間で再利用する Go コントロール プレーン パターンと、ランタイム パスがリソース管理からサービス データの操作に移行するときの データ プレーン ガイダンス へのリンクについて説明します。

Azureコントロールプレーンとは?

Azure コントロール プレーンは、リソースの作成、更新、構成、削除など、Azureリソースのライフサイクルを制御する API のセットです。 Azure ポータル、Azure CLI、またはコードとしてのインフラストラクチャ ツールで実行するすべての操作は、最終的にこれらのコントロール プレーン API を呼び出します。

go のAzure SDKは、arm* の下にある github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/ パッケージのファミリを介してコントロール プレーンを公開します。 各パッケージは、Azure リソース プロバイダーにマップされ、一貫したパターンに従います。

  1. azidentity パッケージを使用して認証します。
  2. 管理するリソースに対する型指定クライアントを作成します。
  3. クライアントでメソッドを呼び出して、リソースの作成、読み取り、更新、または削除を行います。
  4. ポーラーを使用して実行時間の長い操作を処理します。

Go コントロール プレーンの自動化の一般的なシナリオは次のとおりです。

  • デプロイ パイプラインのプロビジョニング インフラストラクチャ
  • 作成、更新、削除、開始、停止、サイズ変更などの VM ライフサイクル操作の管理
  • プラットフォーム チーム用のカスタム CLI とオペレーターの構築
  • GitOps スタイルのインフラストラクチャ調整の実装
  • コンプライアンス監査とドリフト検出の自動化

認証

すべての管理操作には、azidentity パッケージから認証された資格情報が必要です。 このパッケージは、ローカル開発、CI/CD パイプライン、Azureで実行されている運用ワークロードなど、すべての環境に資格情報の種類を提供します。 すべての資格情報の種類は同じ azcore.TokenCredential インターフェイスを実装するため、クライアント コードを変更せずに入れ替えることができます。

資格情報を取得したら、パッケージのクライアント ファクトリを作成し、必要な型指定されたクライアントを要求します。

// Create credential that auto-discovers authentication (Azure CLI, env vars, managed identity)
cred, err := azidentity.NewDefaultAzureCredential(nil)

// Construct a client factory, then the typed client for management operations
clientFactory, err := armresources.NewClientFactory(subscriptionID, cred, nil)
rgClient := clientFactory.NewResourceGroupsClient()

現在の arm* パッケージ ドキュメントでは、通常、関連するクライアントの共有構成が一元化されるため、クライアント ファクトリ パターンが表示されます。 多くのパッケージでは、直接 New<ResourceType>Client(subscriptionID, credential, options) コンストラクターも公開されていますが、 NewClientFactory(...).New<ResourceType>Client() は、pkg.go.dev でよく見られるパターンです。 ローカル開発の場合、DefaultAzureCredential は通常、Azure CLI サインインを認識して使用します。 CI/CD およびデプロイされたワークロードでは、クライアント コードの残りの部分を変更することなく、環境ベースの資格情報またはマネージド ID に切り替えることができます。

資格情報の種類とベスト プラクティスに関する完全なガイドについては、Authentication with the Azure SDK for Go および azidentity パッケージのドキュメントを参照してください。

クライアント パッケージと型指定されたクライアント

管理パッケージは、github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/<service>/arm<service> の下にあります。 ID パッケージと、使用する予定の arm* パッケージのみをインストールします。 たとえば、VM とリソース グループのみを管理する場合は、 armcomputearmresourcesのみが必要です。 各パッケージには、そのサービス内のリソースのクライアントが含まれています。 たとえば、 armcompute には、仮想マシン、ディスク、イメージ、および関連するコンピューティング リソース用のクライアントがあります。

多くの場合、1 つの管理パッケージには複数のクライアントが含まれています。各クライアントは、1 つのリソースの種類または操作グループに重点を置きます。 たとえば、 armcompute には、仮想マシン、ディスク、イメージ、および関連リソースのクライアントが含まれます。 サービスのパッケージを選択したら、1 つのクライアント ファクトリを作成し、それを再利用して、管理するリソースに一致する型指定されたクライアントを作成します。

clientFactory, err := armcompute.NewClientFactory(subscriptionID, cred, nil)
if err != nil {
	return err
}
vmClient := clientFactory.NewVirtualMachinesClient()

このパッケージとクライアント ファクトリのパターンは、 resourcemanager モジュール間で一貫しています。 pkg.go.dev を調べる際や、エージェントにタスクに適したクライアントを見つけるよう頼む際に便利なショートカットです。

長時間実行される操作

クラスターの作成、リソース グループの削除、インフラストラクチャのアップグレードなど、多くの管理操作は非同期的に実行されます。 Beginプレフィックスが付いたメソッドは、サーバー側の作業を開始し、ポーリングプログラムを直ちに返します。 コードは、他の作業を待機するか継続するかを決定できます。

// Start an asynchronous operation (returns immediately)
poller, err := client.BeginCreateOrUpdate(ctx, resourceGroupName, parameters, nil)
if err != nil {
	return err
}

// Block until the operation completes or fails
result, err := poller.PollUntilDone(ctx, nil)
if err != nil {
	return err
}

成功した Begin* 呼び出しは、要求Azure受け入れられたことのみを意味します。 ポーリングが実行されている間も、操作は後で失敗する可能性があります。 そのため、最初の呼び出しと PollUntilDone の両方でエラー処理が必要です。 最も単純なフローが必要な場合は、 PollUntilDone を使用します。 カスタム待機ロジックまたは進行状況レポートが必要な場合は、 poller.Pollpoller.Done を使用します。

パターンの詳細については、「Azure SDK for Go の共通使用パターン」を参照してください。

エラー処理

管理操作では、特定のエラー コードを検査できる構造化エラーが返されます。

import "github.com/Azure/azure-sdk-for-go/sdk/azcore"

// Check if the error is an Azure service error with structured details
var respErr *azcore.ResponseError
if errors.As(err, &respErr) {
	fmt.Printf("Error code: %s\n", respErr.ErrorCode)
	fmt.Printf("Status code: %d\n", respErr.StatusCode)
}

ほとんどの CreateOrUpdate 操作は冪等性を持っています。 既存のリソースでこれらを呼び出すと、失敗するのではなく、リソースが更新されます。

リソース例のプロビジョニング

この例では、一般的なコントロール プレーン パターン (認証、タグとタイムアウトを使用したリソースの作成、結果の確認) を示します。 資格情報、コンテキスト、サブスクリプション ID のパターンはすべての arm* クライアントに適用されるため、このパターンをすべての管理操作のテンプレートとして使用します。

package main

import (
	"context"
	"fmt"
	"log"
	"os"
	"time"

	"github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
	"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
	"github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources"
)

func main() {
	// Read subscription ID from environment (avoid hardcoding)
	subscriptionID := os.Getenv("AZURE_SUBSCRIPTION_ID")
	if subscriptionID == "" {
		log.Fatal("AZURE_SUBSCRIPTION_ID not set")
	}

	// Create credential that auto-discovers authentication
	cred, err := azidentity.NewDefaultAzureCredential(nil)
	if err != nil {
		log.Fatalf("failed to create credential: %v", err)
	}

	// Set a timeout for the entire operation (prevents hanging indefinitely)
	ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute)
	defer cancel()

	// Create a client factory for this management package
	clientFactory, err := armresources.NewClientFactory(subscriptionID, cred, nil)
	if err != nil {
		log.Fatalf("failed to create client factory: %v", err)
	}

	// Create the typed client for resource groups
	rgClient := clientFactory.NewResourceGroupsClient()

	// Many ARM models use pointer fields for optional values.
	resp, err := rgClient.CreateOrUpdate(ctx, "example-rg", armresources.ResourceGroup{
		Location: to.Ptr("eastus"),
		Tags: map[string]*string{
			"env":  to.Ptr("dev"),
			"team": to.Ptr("platform"),
		},
	}, nil)
	if err != nil {
		log.Fatalf("failed to create or update resource group: %v", err)
	}

	fmt.Printf("resource group %s ready in %s\n", *resp.Name, *resp.Location)
}

リソース グループ

armresources パッケージは、リソース グループ (Azureの基本的な組織のコンテナー) を管理します。 すべてのAzureリソースがリソース グループ内に存在するため、プロビジョニング ワークフローの開始点となります。

これを使用して、場所とタグを使用してリソース グループを作成および更新し、サブスクリプション全体のグループを一覧表示し、含まれるすべてのリソースと共にグループを削除します。 リソースグループの作成は同期的であり、べき等性があります。 削除は非同期で永続的です。

リソース グループを一覧表示すると、重要なコントロール プレーン パターンも導入されます。多くの読み取り操作では、ページーが使用されます。 リソース グループまたはその他の大きな ARM コレクションを列挙する場合は、ポケットベルを作成し、 pager.More()falseを返すまで反復処理します。

pager := rgClient.NewListPager(nil)
for pager.More() {
	page, err := pager.NextPage(ctx)
	if err != nil {
		return err
	}

	for _, group := range page.ResourceGroupListResult.Value {
		fmt.Println(*group.Name)
	}
}

リソース グループ管理コードサンプル

ファースト ステップ ガイドについては、armresources パッケージのドキュメントを参照してください。

仮想マシン

armcompute パッケージは標準的なコントロール プレーンの例です。これは、VM の管理は、VM の作成または更新、起動または停止、サイズ変更、削除など、ほとんどのライフサイクル作業であるためです。 Go では、これらのワークフローはリソース グループの例に示されているのと同じ DefaultAzureCredentialcontext.Context、およびクライアント ファクトリ パターンを使用するため、そのパターンが設定されたら、認証方法を変更せずにコンピューティング操作全体に適用できます。

クイック スタート ポイントが必要な場合は、コンピューティング クライアント ファクトリを作成し、型指定された VM クライアントを要求します。

clientFactory, err := armcompute.NewClientFactory(subscriptionID, cred, nil)
if err != nil {
	return err
}
vmClient := clientFactory.NewVirtualMachinesClient()

完全な VM サンプルと操作固有のガイダンスについては、既存の 仮想マシン管理のサンプルおよび armcompute パッケージドキュメントを参照してください。 これらの参照は、この記事の大規模な VM テンプレートを複製するのではなく、完全な要求モデルと実行時間の長い操作の詳細に使用してください。

Key Vault

armkeyvault パッケージは、Azure Key Vault インスタンスのライフサイクルを管理します。 このパッケージは、ボールト インフラストラクチャのコントロールプレーンを処理します。 個別の azsecretsazkeys、および azcertificates データ プレーン パッケージを使用して、シークレット、キー、証明書の読み取りと書き込みを行います。

このパッケージを使用して、適切な SKU とセキュリティ設定 (ソフト削除や消去保護など) を使用してボールトをプロビジョニングします。 また、プリンシパルのアクセス ポリシーを管理したり、ネットワーク アクセスとプライベート エンドポイントを構成したり、診断ログを有効にしたりすることもできます。 ボールトのプロビジョニングをアプリケーションのオンボード ワークフローに統合できます。

Key Vault管理コード サンプル

ランタイム側のKey Vaultクライアントについては、「データ プレーン操作の Go のAzure SDKを使用するを参照してください。

ファースト ステップ ガイドについては、armkeyvault パッケージのドキュメントを参照してください。

AKS クラスター

armcontainerservice パッケージは、Azure Kubernetes Serviceクラスターをライフサイクル全体にわたって管理します。

このパッケージを使用して、構成可能なネットワーク、Kubernetes バージョン、およびマネージド ID を持つクラスターを作成します。 ノード プールの追加とスケーリング、コントロール プレーンとノード バージョンのアップグレード、Azure Policyや監視などのアドオンの有効化、運用ダッシュボードのクラスターの正常性のクエリを実行できます。 すべてのクラスター操作は長時間実行され、ポーラーパターンに従います。

AKS 管理コード サンプル

ファースト ステップ ガイドについては、armcontainerservice パッケージのドキュメントを参照してください。

RBAC と認可

armauthorization パッケージはAzure Role-Based Access Controlを管理します。 これを使用して、サブスクリプションとリソース グループ全体の最小特権アクセス ポリシーを自動化します。

組み込みロールの一覧表示と検索、任意のスコープでのプリンシパル (ユーザー、サービス プリンシパル、マネージド ID、またはグループ) へのロールの割り当て、きめ細かなアクセス許可を持つカスタム ロール定義の作成、コンプライアンス レポートと誤差検出のための監査割り当てを行うために使用します。 個人ではなくグループにロールを割り当て、可能な場合は組み込みのロールを使用します。

ファースト ステップ ガイドについては、armauthorization パッケージのドキュメントを参照してください。

仮想ネットワークとネットワーク セキュリティ

armnetwork パッケージは、仮想ネットワーク インフラストラクチャAzure管理します。

これを使用して、仮想ネットワークとサブネットの作成、受信規則と送信規則を使用したネットワーク セキュリティ グループの構成、PaaS サービスのプライベート エンドポイントの設定、リージョン間のネットワーク ピアリングの自動化、プログラムによるハブアンドスポーク トポロジの実装を行います。

Network 管理コード サンプル

ファースト ステップ ガイドについては、armnetwork パッケージのドキュメントを参照してください。

コンテナー レジストリ

armcontainerregistry パッケージはAzure Container Registryインスタンスを管理します。

これを使用して、適切な SKU と geo レプリケーションを使用してレジストリをプロビジョニングし、認証 (管理者、サービス プリンシパル、またはマネージド ID) を構成し、CI/CD の Webhook を管理し、脆弱性スキャンを有効にして、イメージに保持ポリシーを適用します。 コンテナー レジストリは、多くの場合、Azure Kubernetes Serviceと共に使用します。 まず、レジストリをプロビジョニングしてから、クラスターの作成時にそれを参照します。

Container Registry 管理コード サンプル

ファースト ステップ ガイドについては、armcontainerregistry パッケージのドキュメントを参照してください。

ストレージアカウント

armstorage パッケージはAzure Storageアカウントを管理します。

これを使用して、適切なパフォーマンスレベルと冗長性を備えたストレージ アカウントの作成、アクセス キーと Shared Access Signature の管理、BLOB ライフサイクル ポリシーの構成、診断ログの設定を行います。 ストレージ アカウントは多くのアプリケーションに共通の依存関係であるため、プロビジョニングと構成の自動化は一般的なコントロール プレーン シナリオです。

Storage アカウント管理コード サンプル

ファースト ステップ ガイドについては、armstorage パッケージのドキュメントを参照してください。

次のステップ