Azure でホストされるアプリを他の Azure リソースに対して認証する場合は、 マネージド ID を使用することをお勧めします。 このアプローチは、Azure App Service、Azure Container Apps、Azure Virtual Machines でホストされているアプリなど、ほとんどの Azure サービスで サポートされています。 認証の 概要 ページで、さまざまな認証手法と方法について詳しく説明します。 前のセクションでは、次の内容について説明します。
- マネージド ID の基本的な概念
- アプリのユーザー割り当てマネージド ID を作成する方法
- ユーザー割り当てマネージド ID にロールを割り当てる方法
- アプリ コードからユーザー割り当てマネージド ID を使用して認証する方法
マネージド ID の基本的な概念
マネージド ID を使用すると、シークレット キーやその他のアプリケーション シークレットを使用せずに、アプリを他の Azure リソースに安全に接続できます。 内部的には、Azure は ID と、接続先として許可されているリソースを追跡します。 Azure では、この情報を使用して、アプリの Microsoft Entra トークンを自動的に取得して、他の Azure リソースへの接続を許可します。
ホストされているアプリを構成する際に考慮すべきマネージド ID には、次の 2 種類があります。
- システム割り当て マネージド ID は、Azure リソースで直接有効になり、そのライフ サイクルに関連付けられます。 リソースが削除されると、その ID も Azure によって自動的に削除されます。 システム割り当て ID は、マネージド ID を使用するための最小限のアプローチを提供します。
- ユーザー割り当て マネージド ID はスタンドアロンの Azure リソースとして作成され、柔軟性と機能が向上します。 同じ ID とアクセス許可を共有する必要がある複数の Azure リソースを含むソリューションに最適です。 たとえば、複数の仮想マシンが同じ Azure リソースのセットにアクセスする必要がある場合、ユーザー割り当てマネージド ID は再利用性と最適化された管理を提供します。
ヒント
システム割り当てマネージド ID とユーザー割り当てマネージド ID の選択と管理の詳細については、 マネージド ID のベスト プラクティスに関する推奨事項 の記事を参照してください。
次のセクションでは、Azure でホストされるアプリに対してユーザー割り当てマネージド ID を有効にして使用する手順について説明します。 システム割り当てマネージド ID を使用する必要がある場合は、 システム割り当てマネージド ID に関する記事を参照してください。
ユーザー割り当てマネージド ID を作成する
ユーザー割り当てマネージド ID は、Azure portal または Azure CLI を使用して、Azure サブスクリプションにスタンドアロン リソースとして作成されます。 Azure CLI コマンドは、Azure Cloud Shell で実行することも、Azure CLI がインストールされているワークステーションで実行することもできます。
Azure portal で、メインの検索バーに 「マネージド ID」と 入力し、[ サービス ] セクションで一致する結果を選択します。
[ マネージド ID] ページで 、[ + 作成] を選択します。
[ ユーザー割り当てマネージド ID の作成] ページで、ユーザー割り当てマネージド ID のサブスクリプション、リソース グループ、リージョンを選択し、名前を指定します。
[ 確認と作成 ] を選択して、入力を確認して検証します。
[ 作成] を選択して、ユーザー割り当てマネージド ID を作成します。
ID が作成されたら、[ リソースに移動] を選択します。
新しい ID の [概要 ] ページで、後でアプリケーション コードを構成するときに使用する クライアント ID の値をコピーします。
マネージド ID をアプリに割り当てる
ユーザー割り当てマネージド ID は、1 つ以上の Azure リソースに関連付けることができます。 その ID を使用するすべてのリソースは、ID のロールを通じて適用されるアクセス許可を取得します。
Azure portal で、アプリ コードをホストするリソース (Azure App Service や Azure Container App インスタンスなど) に移動します。
リソースの [概要 ] ページで 、[設定] を 展開し、ナビゲーションから [ID] を 選択します。
[ID] ページで、[ユーザー割り当て済み] タブに切り替えます。
[ + 追加] を選択して、[ ユーザー割り当てマネージド ID の追加] パネルを 開きます。
[ ユーザー割り当てマネージド ID の追加 ] パネルで、[ サブスクリプション ] ドロップダウンを使用して、ID の検索結果をフィルター処理します。 [ユーザー割り当てマネージド ID] 検索ボックスを使用して、アプリをホストしている Azure リソースに対して有効にしたユーザー割り当てマネージド ID を見つけます。
ID を選択し、パネルの下部にある [追加 ] を選択して続行します。
マネージド ID にロールを割り当てる
次に、アプリで必要なロールを決定し、それらのロールをマネージド ID に割り当てます。 次のスコープで、マネージド ID にロールを割り当てることができます。
- リソース: 割り当てられたロールは、その特定のリソースにのみ適用されます。
- リソース グループ: 割り当てられたロールは、リソース グループに含まれるすべてのリソースに適用されます。
- サブスクリプション: 割り当てられたロールは、サブスクリプションに含まれるすべてのリソースに適用されます。
次の例は、多くのアプリが 1 つのリソース グループを使用して関連するすべての Azure リソースを管理するため、リソース グループ スコープでロールを割り当てる方法を示しています。
ユーザー割り当てマネージド ID を持つアプリを含むリソース グループの [概要 ] ページに移動します。
左側のナビゲーションで [アクセス制御 (IAM)] を選択します。
[ アクセス制御 (IAM)] ページで、上部メニューの [+ 追加 ] を選択し、[ ロールの割り当ての追加] を選択して [ ロールの割り当ての追加] ページに移動します。
[ ロールの割り当ての追加] ページには、ID にロールを割り当てるためのタブ付きのマルチステップ ワークフローが表示されます。 最初の [ロール ] タブで、上部にある検索ボックスを使用して、ID に割り当てるロールを見つけます。
結果からロールを選択し、[ 次へ ] を選択して [ メンバー ] タブに移動します。
[アクセス権の 割り当て] オプションで 、[ マネージド ID] を選択します。
[メンバー] オプションで 、[+ メンバーの選択] を選択し、[マネージド ID の選択] パネルを開きます。
[ マネージド ID の選択 ] パネルで、 サブスクリプション と マネージド ID のドロップダウンを使用して、ID の検索結果をフィルター処理します。 [検索の 選択 ] ボックスを使用して、アプリをホストしている Azure リソースに対して有効にしたユーザー割り当てマネージド ID を見つけます。
ID を選択し、パネルの下部にある [選択 ] を選択して続行します。
ページの下部にある [ 確認と割り当て ] を選択します。
最後の [ 校閲と割り当て ] タブで、[ 確認と割り当て ] を選択してワークフローを完了します。
アプリから Azure サービスに対して認証する
azidentity モジュールは、さまざまな資格情報を提供します。さまざまなシナリオと Microsoft Entra 認証フローのサポートに適応したTokenCredentialの実装です。 マネージド ID はローカルで実行するときに使用できないため、次の手順では、どのシナリオで使用する資格情報を示します。
-
ローカル開発環境: ローカル開発時にのみ、構成済みの資格情報チェーンに DefaultAzureCredential を使用します。
DefaultAzureCredentialは、Azure CLI などのローカル開発ツールからユーザー資格情報を検出します。 また、再試行の柔軟性と利便性、応答の待機時間、複数の認証オプションのサポートも提供します。 詳細については、 ローカル開発時の Azure サービスに対する認証 に関する記事を参照してください。 - Azure でホストされるアプリ: アプリが Azure で実行されている場合は、 ManagedIdentityCredential を使用して、アプリ用に構成されたマネージド ID を安全に検出します。 この正確な種類の資格情報を指定すると、他の使用可能な資格情報が予期せず取得されなくなります。
コードを実装する
azidentity モジュールを追加します。
選択したターミナルで、アプリケーション プロジェクト ディレクトリに移動し、次のコマンドを実行します。
go get github.com/Azure/azure-sdk-for-go/sdk/azidentity
Azure サービスには、さまざまな Azure SDK クライアント ライブラリの特殊なクライアントを使用してアクセスします。 アプリで Azure SDK クライアントをインスタンス化する Go コードの場合は、次のことが必要です。
-
azidentityパッケージをインポートします。 -
DefaultAzureCredential型のインスタンスを作成します。 -
DefaultAzureCredential型のインスタンスを Azure SDK クライアント コンストラクターに渡します。 - 環境変数
AZURE_CLIENT_IDをユーザー割り当て ID のクライアント ID に設定します。これらの手順の例は、Azure Storage Blob クライアントを使用した次のコード セグメントに示されています。
import (
"context"
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
)
const (
account = "https://<replace_with_your_storage_account_name>.blob.core.windows.net/"
containerName = "sample-container"
blobName = "sample-blob"
sampleFile = "path/to/sample/file"
)
func main() {
// create a credential
cred, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
// TODO: handle error
}
// create a client for the specified storage account
client, err := azblob.NewClient(account, cred, nil)
if err != nil {
// TODO: handle error
}
// TODO: perform some action with the azblob Client
// _, err = client.DownloadFile(context.TODO(), <containerName>, <blobName>, <target_file>, <DownloadFileOptions>)
}
Azure SDK for Go 認証の概要に関する記事で説明したように、DefaultAzureCredentialは複数の認証方法をサポートし、実行時に使用される認証方法を決定します。 この方法の利点は、環境固有のコードを実装しなくても、アプリが異なる環境で異なる認証方法を使用できることです。 上記のコードがローカル開発時にワークステーションで実行されている場合、 DefaultAzureCredential は、環境設定によって決定されるアプリケーション サービス プリンシパルまたは開発者ツールの資格情報を使用して、他の Azure リソースで認証します。 そのため、同じコードを使用して、ローカル開発時と Azure へのデプロイ時の両方で、Azure リソースに対してアプリを認証できます。
Important
DefaultAzureCredential は、Azure ホスティング環境で使用される資格情報とローカル開発で使用される資格情報を組み合わせることによって、Azure にデプロイするアプリケーションを開発する際に認証を簡略化します。 運用環境では、特定の資格情報の種類を使用して、認証をより予測可能でデバッグしやすくすることをお勧めします。
DefaultAzureCredentialの代わりに、ManagedIdentityCredentialを使用することもできます。
ManagedIdentityCredentialを使用する手順は、DefaultAzureCredential型の使用と同じです。
これらの手順の例は、Azure Storage Blob クライアントを使用した次のコード セグメントに示されています。
import (
"context"
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
)
const (
// Replace placeholder text with your storage account name
account = "https://<replace_with_your_storage_account_name>.blob.core.windows.net/"
containerName = "sample-container"
blobName = "sample-blob"
sampleFile = "path/to/sample/file"
)
func main() {
// create a credential
clientID := azidentity.ClientID("abcd1234-...")
opts := azidentity.ManagedIdentityCredentialOptions{ID: clientID}
cred, err := azidentity.NewManagedIdentityCredential(&opts)
if err != nil {
// TODO: handle error
}
// create a client for the specified storage account
client, err := azblob.NewClient(account, cred, nil)
if err != nil {
// TODO: handle error
}
// TODO: perform some action with the azblob Client
// _, err = client.DownloadFile(context.TODO(), <containerName>, <blobName>, <target_file>, <DownloadFileOptions>)
}
上記のコードは、実行されている環境によって動作が異なります。
- ローカル開発ワークステーションでは、
DefaultAzureCredentialは、アプリケーション サービス プリンシパルの環境変数、または Azure CLI などのローカルにインストールされた開発者ツールで、一連の開発者資格情報を検索します。 - Azure にデプロイすると、
ManagedIdentityCredentialは、他のサービスに対して自動的に認証するマネージド ID 構成を検出します。