マネージド ID を使用して Azure SDK for Go で認証を行う

このチュートリアルでは、Azure SDK for Go を使用して Azure に対して認証を行うために、Azure 仮想マシンとマネージド ID を構成します。

マネージド ID を使用すると、Azure リソースに ID を直接提供することによって資格情報を管理する必要がなくなります。 ID に割り当てられたアクセス許可により、マネージド ID をサポートする他の Azure リソースへのアクセス権がリソースに付与されます。 アプリケーションに資格情報を渡す必要がなくなります。

このチュートリアルでは、マネージド ID を仮想マシンに割り当て、マネージド ID を使用して Azure に対して認証を行います。

前提条件

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

1. 環境を構成する

開始する前に、環境を構成する必要があります。

仮想マシンのデプロイ

仮想マシンを Azure にデプロイします。 Go コードを実行して、その仮想マシンから Azure Key Vault にシークレットを作成します。

  1. Azure リソース グループを作成します。

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

    --location パラメーターを、ご使用の環境に適した値に変更します。

  2. Azure 仮想マシンを作成します。

    az vm create \
    --resource-group go-on-azure \
    --name go-on-azure-vm \
    --image canonical:ubuntuserver:19.04:latest \
    --admin-username azureuser \
    --admin-password <password>
    

    <password> をパスワードに置き換えます。

マネージド ID をサポートするその他のサービスについて詳しくは、「Azure リソースのマネージド ID をサポートするサービス」を参照してください。

キー コンテナー インスタンスをデプロイする

次のコマンドを実行して、新しい Azure キー コンテナー インスタンスを作成します。

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

<keyVaultName> は、グローバルに一意である名前に置き換えてください。

2. マネージド ID を作成する

Azure では、2 種類のマネージド ID (システム割り当てとユーザー割り当て) がサポートされています。

システム割り当て ID は、Azure リソースに直接アタッチされ、そのリソースのみに制限されます。 ユーザー割り当て ID は、スタンドアロン リソースであり、1 つ以上の Azure リソースに割り当てることができます。

システム割り当てとユーザー割り当ての違いについて詳しくは、「マネージド ID の種類」を参照してください。

次のいずれかのオプションを選択します。

オプション 1: システム割り当て ID を作成する

システム割り当てマネージド ID を作成するには、次のコマンドを実行します。

az vm identity assign -g go-on-azure -n go-on-azure-vm

オプション 2: ユーザー割り当て ID を作成する

ユーザー割り当てマネージド ID を作成するには、次のコマンドを実行します。

az identity create -g go-on-azure -n GoUserIdentity

az vm identity assign -g go-on-azure -n go-on-azure-vm --identities <UserIdentityId>

<UserIdentityId> は、マネージド ユーザー ID の ID に置き換えてください。

詳細については、「Azure CLI を使用して Azure VM 上に Azure リソースのマネージド ID を構成する」を参照してください。

3. マネージド ID にロールを割り当てる

マネージド ID を作成した後、ロールを割り当てて、他の Azure リソースにアクセスするためのアクセス許可をその ID に付与します。 このチュートリアルでは、Key Vault Contributor の組み込みロールをマネージド ID に割り当てて、Go アプリケーションがキー コンテナー インスタンス内でシークレットを作成できるようにします。

次のいずれかのオプションを選択します。

オプション 1: システム割り当て ID にロールを割り当てる

システム割り当てマネージド ID に Key Vault Contributor ロールを割り当てるには、次のコマンドを実行します。

#output system identity principal ID
az vm identity show --name go-on-azure-vm --resource-group go-on-azure --query 'principalId' -o tsv

#output key vault ID
scope=$(az keyvault show --name go-on-azure-kv --query id -o tsv)

az role assignment create --assignee '<principalId>' --role 'Key Vault Contributor' --scope '<keyVaultId>'

オプション 2: ユーザー割り当て ID にロールを割り当てる

ユーザー割り当てマネージド ID に Key Vault Contributor ロールを割り当てるには、次のコマンドを実行します。

#output user identity principal ID
az identity show --resource-group go-on-azure --name GoUserIdentity --query 'principalId' -o tsv

#output key vault ID
az keyvault show --name go-on-azure-kv --query id -o tsv

az role assignment create --assignee '<principalId>' --role 'Key Vault Contributor' --scope '<keyVaultId>'

組み込みロールの詳細については、「Azure 組み込みロール」を参照してください。

4. Go でキー コンテナーのシークレットを作成する

次に、Azure 仮想マシンに SSH 接続し、Go をインストールし、Go パッケージを作成します。

Azure VM に Go をインストールする

  1. Azure 仮想マシンのパブリック IP アドレスを取得します。

    az vm show -d -g go-on-azure -n go-on-azure-vm --query publicIps -o tsv
    
  2. Azure VM に SSH 接続します。

    ssh azureuser@<public-ip>
    

    <public-ip> は、Azure VM のパブリック IP アドレスに置き換えてください。

  3. Go をインストールする

    sudo add-apt-repository ppa:longsleep/golang-backports;
    sudo apt update;
    sudo apt install golang-go -y
    

Go パッケージを作成する

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

    mkidr ~/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() {
        keyVaultName := os.Getenv("KEY_VAULT_NAME")
        secretName := "quickstart-secret"
        secretValue := "createdWithGO"
        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(), secretName, secretValue, 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()
    }
    
    

コードを実行する前に、KEY_VAULT_NAMEという名前の環境変数を作成します。 環境変数の値を、前に作成した Azure Key Vault の名前に設定します。 <KeyVaultName> を、Azure Key Vault インスタンスの名前に置き換えます。

export KEY_VAULT_NAME=<KeyVaultName>

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

go run main.go

Azure PowerShell、Azure CLI、または Azure portal を使用して、キー コンテナーのシークレットが作成されたことを確認します。

次のステップ