マネージド ID を使用して Azure SDK for Go で認証を行う
このチュートリアルでは、Azure SDK for Go を使用して Azure に対して認証を行うために、マネージド ID で Azure 仮想マシンを構成します。
マネージド ID を使用すると、Azure リソースに ID を直接提供することによって資格情報を管理する必要がなくなります。 ID に割り当てられたアクセス許可により、マネージド ID をサポートする他の Azure リソースへのアクセス権がリソースに付与され、アプリケーションで資格情報を渡す必要がなくなります。 マネージド ID を使用して、他の Azure リソースで Azure でホストされるアプリを認証および承認できます。
このチュートリアルでは、マネージド ID を仮想マシンに割り当て、マネージド ID を使用して Azure に対して認証を行います。
前提条件
- Azure サブスクリプション:Azure サブスクリプションをお持ちでない場合は、開始する前に無料アカウントを作成してください。
Azure CLI を使用してこの記事の手順に従う場合:
Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Azure Cloud Shell の Bash のクイックスタート」を参照してください。
CLI リファレンス コマンドをローカルで実行する場合、Azure CLI をインストールします。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。
ローカル インストールを使用する場合は、az login コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、Azure CLI でのサインインに関するページを参照してください。
初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、Azure CLI で拡張機能を使用する方法に関するページを参照してください。
az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。
Azure PowerShell を使用してこの記事の手順に従う場合:
- Azure PowerShell をローカルで使用する場合は、次のようにします。
- Az PowerShell モジュールの最新バージョンをインストールします。
- Connect-AzAccount コマンドレットを使用して、Azure アカウントに接続します。
- Azure Cloud Shell を使用する場合は、次のようにします。
- 詳細については、Azure Cloud Shell の概要に関するページを参照してください。
- Azure PowerShell をローカルで使用する場合は、次のようにします。
1. Azure リソースを作成する
開始する前に、新しいリソース グループ、仮想マシン、およびキー コンテナー インスタンスを作成する必要があります。
仮想マシンのデプロイ
仮想マシンを Azure にデプロイします。 Go コードを実行して、その仮想マシンから Azure キー コンテナーにシークレットを作成します。
Azure リソース グループを作成します。
az group create --name go-on-azure --location eastus
--location
パラメーターを、ご使用の環境に適した値に変更します。Azure 仮想マシンを作成します。
az vm create \ --resource-group go-on-azure \ --name go-on-azure-vm \ --image canonical:0001-com-ubuntu-server-jammy:22_04-lts:latest \ --admin-username azureuser \ --admin-password <password>
<password>
をパスワードに置き換えます。
マネージド ID をサポートするその他のサービスについて詳しくは、「Azure リソースのマネージド ID をサポートするサービス」を参照してください。
キー コンテナー インスタンスをデプロイする
次のコマンドを実行して、新しい Azure キー コンテナー インスタンスを作成します。
az keyvault create --location eastus --name <keyVaultName> --resource-group go-on-azure --enable-rbac-authorization
<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 GoUserIdentity
詳細については、「Azure CLI を使用して Azure VM 上に Azure リソースのマネージド ID を構成する」を参照してください。
3. マネージド ID にロールを割り当てる
マネージド ID を作成した後、ロールを割り当てて、他の Azure リソースにアクセスするためのアクセス許可をその ID に付与します。 このチュートリアルでは、Key Vault Secrets Officer
の組み込みロールをマネージド ID に割り当てて、Go アプリケーションがキー コンテナー インスタンス内でシークレットを作成できるようにします。
次のいずれかのオプションを選択します。
オプション 1: システム割り当て ID にロールを割り当てる
システム割り当てマネージド ID に Key Vault Secrets Officer
ロールを割り当てるには、次のコマンドを実行します。
#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
az keyvault show --name <keyVaultName> --query id -o tsv
az role assignment create --assignee <principalId> --role "Key Vault Secrets Officer" --scope <keyVaultId>
2 つ目のコマンドで、<keyVaultName>
を実際のキー コンテナーの名前に置き換えます。 最後のコマンドで、<principalId>
と <keyVaultId>
を最初の 2 つのコマンドからの出力と置き換えます。
オプション 2: ユーザー割り当て ID にロールを割り当てる
ユーザー割り当てマネージド ID に Key Vault Secrets Officer
ロールを割り当てるには、次のコマンドを実行します。
#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 <keyVaultName> --query id -o tsv
az role assignment create --assignee <principalId> --role "Key Vault Secrets Officer" --scope <keyVaultId>
2 つ目のコマンドで、<keyVaultName>
を実際のキー コンテナーの名前に置き換えます。 最後のコマンドで、<principalId>
と <keyVaultId>
を最初の 2 つのコマンドからの出力と置き換えます。
Azure キー コンテナーの組み込みロールの詳細については、「Azure のロールベースのアクセス制御を使用して Key Vault のキー、証明書、シークレットへのアクセス権を付与する」を参照してください。 Azure の組み込みロールの詳細については、「Azure 組み込みロール」を参照してください。
4. Go でキー コンテナーのシークレットを作成する
次に、Azure 仮想マシンに SSH 接続し、Go をインストールし、Go パッケージを作成します。
Azure VM に Go をインストールする
Azure 仮想マシンのパブリック IP アドレスを取得します。
az vm show -d -g go-on-azure -n go-on-azure-vm --query publicIps -o tsv
Azure VM に SSH 接続します。
ssh azureuser@<public-ip>
<public-ip>
は、Azure VM のパブリック IP アドレスに置き換えてください。Go をインストールする
sudo add-apt-repository ppa:longsleep/golang-backports; sudo apt update; sudo apt install golang-go -y
Go パッケージを作成する
ホーム ディレクトリ内に
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/security/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/security/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) } params := azsecrets.SetSecretParameters{Value: &secretValue} resp, err := client.SetSecret(context.TODO(), secretName, params, 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
という名前の環境変数を作成します。<keyVaultName>
を、Azure Key Vault インスタンスの名前に置き換えます。export KEY_VAULT_NAME=<keyVaultName>
go run
コマンドを実行して、キー コンテナーのシークレットを作成します。go run main.go
成功すると、出力は以下のようになります。
Name: https://<keyVaultName>.vault.azure.net/secrets/quickstart-secret/0e0b941824c4493bb3b83045a31b2bf7, Value: createdWithGO
Azure PowerShell、Azure CLI、または Azure portal を使用して、キー コンテナーのシークレットが作成されたことを確認できます。
Note
Azure CLI または Azure PowerShell を使用する場合は、Azure ユーザー アカウントに、"Key Vault Secrets Officer" や "Key Vault Secrets User" などのキー コンテナー内のシークレットの読み取りを許可するロールが割り当てられていることを確認する必要があります。
5.リソースをクリーンアップする
この記事で作成した Azure リソースを使用しなくなった場合は、それらを削除することをお勧めします。 使用しないリソースを削除すると、継続的な料金の発生が回避され、サブスクリプションを整った状態に保てます。 このチュートリアルで使用したリソースを削除するための最も簡単な方法は、リソース グループを削除することです。
az group delete --name go-on-azure --force-deletion-types Microsoft.Compute/virtualMachines --yes
force-deletion-type
引数は、リソース グループ内の VM を強制的に削除するようにコマンドに指示します。 --yes
引数は、確認を求めないようにコマンドに指示します。
上記のコマンドは、リソース グループ内のキー コンテナーに対して論理的な削除を実行します。 サブスクリプションから完全に削除するには、以下のコマンドを入力します。
az keyvault purge --name <keyVaultName> --no-wait
<keyVaultName>
は、実際のキー コンテナーの名前に置き換えます。