Azure SDK for Go を使用して Azure Resource Manager テンプレートをデプロイする

このチュートリアルでは、Azure SDK for Go を使用して Azure Resource Manager テンプレートをデプロイします。

Azure Resource Manager は、Azure のデプロイおよび管理サービスです。 これにより、Azure アカウント内のリソースを作成、更新、削除できます。 Azure Resource Manager テンプレートは、JSON ドキュメントのコードとしてインフラストラクチャを宣言的に記述します。

このチュートリアルの終わりまでに、Go を使用して Azure Resource Manager テンプレートを作成してデプロイします。

[前提条件]

  • Azure サブスクリプション: Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。

新しいモジュールを作成する

このセクションでは、新しい Go モジュールを作成し、必要な Azure SDK パッケージをインストールします。 次に、メイン アプリケーション ファイルを作成し、Azure Resource Manager テンプレートをデプロイするコードを追加します。

  1. deployARM-how-toという名前の新しいディレクトリを作成します。 その後、そのディレクトリに移動します。

    mkdir deployARM-how-to
    cd deployARM-how-to
    
  2. go mod init コマンドを実行して、go.modファイルとgo.sum ファイルを作成します。

    go mod init deployARM-how-to
    
  3. Azure SDK for Go には、Azure を操作するためのいくつかのパッケージが含まれています。 このチュートリアルでは、 azcore/to、 azidentity、 armresources パッケージが必要です。

    go get コマンドを実行して、次のパッケージをダウンロードします。

    go get github.com/Azure/azure-sdk-for-go/sdk/azcore/to
    go get github.com/Azure/azure-sdk-for-go/sdk/azidentity
    go get github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources
    
  4. main.go という名前でファイルを作成します。

    touch main.go
    
  5. エディターで main.go を開き、Azure に対する認証、リソース グループの作成、Azure Resource Manager テンプレートのデプロイを行う次のコードを追加します。

    package main
    
    import (
    	"context"
    	"encoding/json"
    	"fmt"
    	"log"
    	"os"
    
    	"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"
    )
    
    const (
    	resourceGroupName     = "deployARM-how-to"
    	resourceGroupLocation = "eastus"
    	deploymentName        = "deployARM-how-to"
    	templateFile          = "template.json"
    )
    
    var (
    	ctx = context.Background()
    )
    
    // Read a JSON file from the given path.
    
    func readJSON(path string) (map[string]interface{}, error) {
    	data, err := os.ReadFile(path)
    	if err != nil {
    		log.Fatalf("failed to read file: %v", err)
    	}
    	contents := make(map[string]interface{})
    	_ = json.Unmarshal(data, &contents)
    	return contents, nil
    }
    
    func main() {
    	subscriptionId := os.Getenv("AZURE_SUBSCRIPTION_ID")
    
    	// Authenticate to Azure
    
    	cred, err := azidentity.NewDefaultAzureCredential(nil)
    	if err != nil {
    		log.Fatalf("failed to obtain a credential: %v", err)
    	}
    
     	// Create a resource group.
    
    	client, err := armresources.NewResourceGroupsClient(subscriptionId, cred, nil)
    	if err != nil {
    		log.Fatalf("failed to create client: %v", err)
    	}
    	resp, err := client.CreateOrUpdate(context.Background(), resourceGroupName, armresources.ResourceGroup{
    		Location: to.Ptr(resourceGroupLocation),
    	}, nil)
    	if err != nil {
    		log.Fatalf("failed to obtain a response: %v", err)
    	}
    	log.Printf("resource group ID: %s\n", *resp.ResourceGroup.ID)
    
    	// Read the template file.
    
    	template, err := readJSON(templateFile)
    	if err != nil {
    		return
    	}
    
    	// Deploy the Azure Resource Manager template.
    
    	deploymentsClient, err := armresources.NewDeploymentsClient(subscriptionId, cred, nil)
    	if err != nil {
    		log.Fatalf("failed to create client: %v", err)
    	}
    	deploy, err := deploymentsClient.BeginCreateOrUpdate(
    		ctx,
    		resourceGroupName,
    		deploymentName,
    		armresources.Deployment{
    			Properties: &armresources.DeploymentProperties{
    				Template: template,
    				Mode:     to.Ptr(armresources.DeploymentModeIncremental),
    			},
    		},
    		nil,
    	)
    	if err != nil {
    		log.Fatalf("failed to deploy template: %v", err)
    	}
    
    	fmt.Println(deploy)
    }
    

Azure Resource Manager テンプレートを作成する

  1. deployARM-how-to ディレクトリで、template.jsonという名前の別のファイルを作成します。

  2. template.json ファイルを開き、Azure ストレージ アカウントを作成する次の Azure Resource Manager テンプレート コードを追加します。

    {
        "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
        "contentVersion": "1.0.0.0",
        "parameters": {
        },
        "functions": [],
        "variables": {},
        "resources": [{
            "name": "<StorageAccountName>",
            "type": "Microsoft.Storage/storageAccounts",
            "apiVersion": "2021-04-01",
            "tags": {
                "displayName": "<StorageAccountDisplayName>"
            },
            "location": "EastUS",
            "kind": "StorageV2",
            "sku": {
                "name": "Premium_LRS",
                "tier": "Premium"
            }
        }],
        "outputs": {}
    }
    
  3. <StorageAccountName>と<StorageAccountDisplayName>を有効なストレージ名の値に置き換えます。

Azure Resource Manager テンプレートの詳細については、「 Azure Resource Manager テンプレートの概要」を参照してください。

Azure にサインインする

この記事のコードでは、Go が Azure に対して認証されるように、Azure ID モジュールの DefaultAzureCredential 型を使用します。 DefaultAzureCredential では、Microsoft Entra ID を使用した OAuth を使用した Azure での認証に関する多くの資格情報の種類がサポートされています。 この記事では、Azure CLI にサインインするときに使用するユーザー資格情報を使用します。

まだサインインしていない場合は、Azure CLI にサインインします。

az login

複数のサブスクリプションがアカウントに関連付けられている場合は、 az account list コマンドを使用して、それらのサブスクリプションの一覧を取得します。 az account set コマンドを使用して、アクティブなサブスクリプションを設定します。 アクティブなサブスクリプションを設定すると、この記事の残りの部分で実行するすべての CLI コマンドが、目的のサブスクリプションに対して実行されます。

注

ローカルで実行する場合、 DefaultAzureCredential では、環境変数で構成する Azure Developer CLI (AZD) サインイン資格情報または Azure サービス プリンシパルもサポートされます。 サポートされているすべての資格情報の種類の詳細については、 Go 用の Azure ID モジュールを使用した Azure 認証に関するページを参照してください。

アプリケーションを実行する

テンプレートをデプロイする前に、環境変数として Azure サブスクリプション ID を定義する必要があります。

  1. サブスクリプション ID を取得するには、次の az account show コマンドを実行します。

    az account show --query id --output tsv
    
  2. AZURE_SUBSCRIPTION_ID環境変数をサブスクリプション ID で設定します。 <AzureSubscriptionId> は、サブスクリプション ID で置き換えてください。

    export AZURE_SUBSCRIPTION_ID=<AzureSubscriptionId>
    
  3. go run コマンドを実行してテンプレートをデプロイします。

    go run main.go
    

Troubleshoot

ストレージ アカウントのデプロイが失敗した場合は、 有効なストレージ名の値を使用したかどうかを確認します。 ストレージ アカウント名の長さは 3 から 24 文字にする必要があり、使用できるのは小文字と数字のみです。

認証または承認に関連するエラーがプログラムから返された場合は、次の項目を確認します。

  • エラーがタイムスタンプで始まり、"応答の取得に失敗しました: DefaultAzureCredential: トークンの取得に失敗しました"というテキストで始まる場合は、前の手順に従って Azure CLI にサインインしていることを確認してください。

  • エラーが承認エラーまたは禁止エラー (状態コード 401 または 403) の場合は、ユーザー アカウントが Azure ロールにあることを確認します。このロールでは、リソース グループを作成し、サブスクリプションにリソースを追加する権限が付与されます。 たとえば、 共同作成者 または 所有者の Azure 組み込みロールがあります。 ユーザーに Azure ロールを割り当てる方法については、「Azure CLI を使用して Azure ロールを割り当てる」を参照してください。

トラブルシューティングの詳細なガイダンスについては、 Azure ID 認証に関する問題のトラブルシューティングを参照してください。

Azure 上のリソースを確認する

複数の Azure CLI コマンドを使用して、リソースが Azure に正常に作成されたことを確認できます。 次のコマンドは、いくつかの例です。

リソース グループが存在することを確認するには、 az group exists コマンドを 実行します。

az group exists --name deployARM-how-to

az resource list コマンドを使用して、グループ内のリソースを一覧表示できます。

az resource list --resource-group deployARM-how-to

az deployment group show コマンドを使用して、デプロイ結果 (outputResources) とプロパティを確認できます。

az deployment group show -g deployARM-how-to -n deployARM-how-to

リソースをクリーンアップする

Azure のリソースには、継続的な料金が発生する可能性があります。 この記事で作成したリソースは必ずクリーンアップしてください。

空のテンプレートを完全モードでデプロイすると、リソース グループ内のすべてのリソースが削除されます。 リソース グループ自体を削除せずにリソースをクリーンアップする簡単な方法です。

  1. empty-template.jsonという名前の新しい空のテンプレートを作成します。

  2. エディターで empty-template.json を開き、次のコードを追加します。

    {
        "$schema": "https://schema.management.azure.com/schemas/2019-08-01/deploymentTemplate.json#",
        "contentVersion": "1.0.0.0",
        "parameters": {},
        "variables": {},
        "resources": [],
        "outputs": {}
    }
    
  3. main.go ファイルを開きます。

  4. templateFile定数値をempty-template.jsonに更新します。

    const (
    	resourceGroupName     = "deployARM-how-to"
    	resourceGroupLocation = "eastus"
    	deploymentName        = "deployARM-how-to"
    	templateFile          = "empty-template.json"
    )
    
  5. 展開モードのプロパティをに変更して、展開時間を増分からDeploymentModeCompleteに変更します。 デプロイ モードの詳細については、 Azure Resource Manager のデプロイ モードに関するページを参照してください。

    deploy, err = deploymentsClient.BeginCreateOrUpdate(
    	ctx,
    	resourceGroupName,
    	deploymentName,
    	armresources.Deployment{
    		Properties: &armresources.DeploymentProperties{
    			Template: template,
    			Mode:     to.Ptr(armresources.DeploymentModeComplete), //Deployment Mode is here
    		},
    	},
    	nil,
    )
    
  6. go run コマンドを実行して空のテンプレートをデプロイし、前に作成したストレージ アカウントを削除します。

    go run main.go
    

デプロイを使用する代わりに、次の Azure CLI コマンドを実行して、リソース グループとそのすべてのリソースを削除できます。

az group delete --resource-group deployARM-how-to

次のステップ