Azure Blob Storage とのパスワードレス接続を使用するようにアプリケーションを移行する
- [アーティクル]
-
-
Azure サービスへのアプリケーション要求は、アカウント アクセス キーまたはパスワードレス接続などの構成を使用して認証される必要があります。 ただしアプリケーションには、可能であればパスワードレス接続を優先的に使用することをお勧めします。 パスワードや秘密鍵を使用する従来の認証方法は、セキュリティ リスクと複雑さが生じます。 パスワードレス接続に移行する利点の詳細については、「Azure サービスのパスワードレス接続」ハブを参照してください。
次のチュートリアルでは、既存のアプリケーションを、パスワードレス接続を使用して接続するように移行する方法について説明します。 アクセス キー、接続文字列、または他のシークレットベースのアプローチのどれを使用しているかに関係なく、これと同じ移行手順が適用される必要があります。
ローカルで開発する場合は、BLOB データにアクセスするユーザー アカウントに正しいアクセス許可があることを確認します。 BLOB データの読み取りと書き込みを行うには、ストレージ BLOB データ共同作成者が必要です。 このロールを自分に割り当てるには、ユーザー アクセス管理者ロール、または Microsoft.Authorization/roleAssignments/write アクションを含む別のロールに割り当てられている必要があります。 Azure portal、Azure CLI、または Azure PowerShell を使用して、ユーザーに Azure RBAC ロールを割り当てることができます。 ロールの割り当てに使用できるスコープの詳細は、スコープの概要ページでご覧いただけます。
このシナリオでは、最小限の特権の原則に従って、ストレージ アカウントに限定したアクセス許可をユーザー アカウントに割り当てます。 この方法を使って、ユーザーに必要最小限のアクセス許可のみを与え、より安全な運用環境を作成します。
次の例では、ストレージ BLOB データ共同作成者ロールを自分のユーザー アカウントに割り当てます。これにより、そのストレージ アカウント内の BLOB データに対する読み取りと書き込みの両方のアクセス権が付与されます。
重要
ほとんどの場合、ロールの割り当てが Azure に反映されるまでの時間は 1 分から 2 分ですが、まれに 8 分程度までかかる場合があります。 初めてコードを実行したときに認証エラーを受け取る場合は、しばらく待ってから再試行してください。
Azure portal で、メインの検索バーまたは左側のナビゲーションを使ってストレージ アカウントを見つけます。
ストレージ アカウントの概要ページで、左側のメニューから [アクセス制御 (IAM)] を選びます。
[アクセス制御 (IAM)] ページで、[ロールの割り当て] タブを選びます。
上部のメニューから [+ 追加] を選択し、次に結果のドロップダウン メニューから [ロールの割り当ての追加] を選択します。
検索ボックスを使って、結果を目的のロールに絞り込みます。 この例では、ストレージ BLOB データ共同作成者を検索し、一致する結果を選び、[次へ] を選びます。
[アクセスの割り当て先] で、[ユーザー、グループ、またはサービス プリンシパル] を選び、[+ メンバーの選択] を選びます。
ダイアログで、自分の Microsoft Entra ユーザー名 (通常は user@domain メール アドレス) を検索し、ダイアログの下部にある [選択] を選びます。
[レビューと割り当て] を選んで最終ページに移動し、もう一度 [レビューと割り当て] を行ってプロセスを完了します。
Azure CLI を使ってリソース レベルでロールを割り当てるには、まず az storage account show
コマンドを使ってリソース ID を取得する必要があります。 --query
パラメーターを使って、出力プロパティをフィルター処理することができます。
az storage account show --resource-group '<your-resource-group-name>' --name '<your-storage-account-name>' --query id
前のコマンドからの出力 Id
をコピーします。 これで、Azure CLI の az role コマンドを使ってロールを割り当てることができます。
az role assignment create --assignee "<user@domain>" \
--role "Storage Blob Data Contributor" \
--scope "<your-resource-id>"
Azure PowerShell を使ってリソース レベルでロールを割り当てるには、まず Get-AzResource
コマンドを使ってリソース ID を取得する必要があります。
Get-AzResource -ResourceGroupName "<yourResourceGroupname>" -Name "<yourStorageAccountName>"
前のコマンドの出力から Id
の値をコピーします。 これで、PowerShell の New-AzRoleAssignment コマンドを使ってロールを割り当てることができます。
New-AzRoleAssignment -SignInName <user@domain> `
-RoleDefinitionName "Storage Blob Data Contributor" `
-Scope <yourStorageAccountId>
サインインしてパスワードレス接続を使用するようにアプリ コードを移行する
ローカル開発には、ロールを割り当てたのと同じ Microsoft Entra アカウントで認証を受けるようにしてください。 Azure CLI や Azure PowerShell などの一般的な開発ツールを使用して認証できます。 認証に使用できる開発ツールは、言語によって異なります。
Azure CLI で次のコマンドを使って Azure にサインインします。
az login
Visual Studio の右上隅にある [サインイン] ボタンを選びます。
以前にロールを割り当てた Microsoft Entra アカウントを使用してサインインします。
Visual Studio Code から DefaultAzureCredential
を操作するには、Azure CLI をインストールする必要があります。
Visual Studio Code のメイン メニューで、[ターミナル] > [新しいターミナル] に移動します。
Azure CLI で次のコマンドを使って Azure にサインインします。
az login
PowerShell で次のコマンドを使って Azure にサインインします。
Connect-AzAccount
次に、パスワードレス接続を使用するようにコードを更新します。
.NET アプリケーションで DefaultAzureCredential
を使用するには、Azure.Identity
パッケージをインストールします:
dotnet add package Azure.Identity
ファイルの先頭に、次のコードを追加します:
using Azure.Identity;
Azure Blob Storage に接続する BlobServiceClient
を作成する箇所を、コード内で識別します。 次の例に合わせてコードを更新します。
DefaultAzureCredential credential = new();
BlobServiceClient blobServiceClient = new(
new Uri($"https://{storageAccountName}.blob.core.windows.net"),
credential);
Go アプリケーションで DefaultAzureCredential
を使用するには、azidentity
モジュールをインストールします:
go get -u github.com/Azure/azure-sdk-for-go/sdk/azidentity
ファイルの先頭に、次のコードを追加します:
import (
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
)
Azure Blob Storage に接続する Client
インスタンスを作成する箇所を、コード内で識別します。 次の例に合わせてコードを更新します。
cred, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
// handle error
}
serviceURL := fmt.Sprintf("https://%s.blob.core.windows.net", storageAccountName)
client, err := azblob.NewClient(serviceURL, cred, nil)
if err != nil {
// handle error
}
Java アプリケーションで DefaultAzureCredential
を使用するには、次のいずれかの方法で azure-identity
パッケージをインストールします。
- BOM ファイルを含める。
- 直接依存関係を含める。
ファイルの先頭に、次のコードを追加します:
import com.azure.identity.DefaultAzureCredentialBuilder;
Azure Blob Storage に接続する BlobServiceClient
オブジェクトを作成する箇所を、コード内で識別します。 次の例に合わせてコードを更新します。
DefaultAzureCredential credential = new DefaultAzureCredentialBuilder()
.build();
String endpoint =
String.format("https://%s.blob.core.windows.net", storageAccountName);
BlobServiceClient blobServiceClient = new BlobServiceClientBuilder()
.endpoint(endpoint)
.credential(credential)
.buildClient();
Node.js アプリケーションで DefaultAzureCredential
を使用するには、@azure/identity
パッケージをインストールします。
npm install --save @azure/identity
ファイルの先頭に、次のコードを追加します:
import { DefaultAzureCredential } from "@azure/identity";
Azure Blob Storage に接続する BlobServiceClient
オブジェクトを作成する箇所を、コード内で識別します。 次の例に合わせてコードを更新します。
const credential = new DefaultAzureCredential();
const blobServiceClient = new BlobServiceClient(
`https://${storageAccountName}.blob.core.windows.net`,
credential
);
Python アプリケーションで DefaultAzureCredential
を使用するには、azure-identity
パッケージをインストールします:
pip install azure-identity
ファイルの先頭に、次のコードを追加します:
from azure.identity import DefaultAzureCredential
Azure Blob Storage に接続する BlobServiceClient
オブジェクトを作成する箇所を、コード内で識別します。 次の例に合わせてコードを更新します。
credential = DefaultAzureCredential()
blob_service_client = BlobServiceClient(
account_url = "https://%s.blob.core.windows.net" % storage_account_name,
credential = credential
)
必ず、BlobServiceClient
の URI のストレージ アカウント名を更新してください。 ストレージ アカウント名は、Azure portal の概要ページで確認できます。
アプリをローカルで実行する
これらの変更をコードに対して行った後、アプリケーションをローカルで実行します。 新しい構成では、Azure CLI、Visual Studio、IntelliJ などのローカルの資格情報を取得する必要があります。 アプリは、Azure のローカル開発ユーザーに割り当てられたロールを使用して、Azure サービスにローカルから接続できます。
パスワードレス接続を使用するようにアプリケーションを構成し、ローカルから実行しました。そのアプリケーションを Azure にデプロイすれば、同じコードで Azure サービスに対する認証を行うことができます。 以下のセクションでは、マネージド ID を使用してAzure Blob Storage に接続するようにデプロイされたアプリケーションを構成する方法について説明します。
マネージド ID を作成する
ユーザー割り当てマネージド ID は、Azure portal または Azure CLI を使用して作成できます。 アプリケーションでは、ID を使用して他のサービスに対する認証が行われます。
- Azure portal の上部で、"マネージド ID" を検索します。 [マネージド ID] の結果を選択します。
- [マネージド ID] 概要ページの上部にある [+ 作成] を選択します。
- [基本] タブで、次の値を入力します。
- サブスクリプション: 目的のサブスクリプションを選択します。
- リソース グループ: 目的のリソース グループを選択します。
- リージョン: ご自分の場所に近いリージョンを選びます。
- 名前: MigrationIdentity など、ID のわかりやすい名前を入力します。
- ページ下部にある [確認と作成] を選択します。
- 検証チェックが完了したら、[作成] を選択します。 Azure で、新しいユーザー割り当て ID が作成されます。
リソースが作成されたら、[Go to resource] (リソースに移動) を選択して、マネージド ID の詳細を表示します。
ユーザー割り当てマネージド ID を作成するには、az identity create コマンドを使用します。
az identity create --name MigrationIdentity --resource-group <your-resource-group>
マネージド ID を Web アプリに関連付ける
作成したマネージド ID を使用するように Web アプリを構成する必要があります。 Azure portal または Azure CLI を使用して、アプリに ID を割り当てます。
ID をアプリに関連付けるには、Azure portal で次の手順を実行します。 これらの同じ手順は、次の Azure サービスに適用されます。
- Azure Spring Apps
- Azure Container Apps
- Azure の仮想マシン
- Azure Kubernetes Service
Web アプリの概要ページに移動します。
左側のナビゲーションから、[ID] を選択します。
[ID] ページで、[ユーザー割り当て済み] タブに切り替えます。
[+ 追加] を選択して、[ユーザー割り当てマネージド ID の追加] ポップアップを開きます。
ID を作成するために使用したサブスクリプションを選択します。
名前で MigrationIdentity を検索し、検索結果から選択します。
[追加] を選択して、ID をアプリに関連付けます。
次の Azure CLI コマンドを使用して、ID をアプリに関連付けます。
az identity show コマンドを使用して、作成したマネージド ID の ID を取得します。 次の手順で使用する出力値をコピーします。
az identity show --name MigrationIdentity -g <your-identity-resource-group-name> --query id
Azure App Service インスタンスにマネージド ID を割り当てるには、az webapp identity assign コマンドを使用します。
az webapp identity assign \
--resource-group <resource-group-name> \
--name <webapp-name>
--identities <managed-identity-id>
Azure Spring Apps インスタンスにマネージド ID を割り当てるには、az spring app identity assign コマンドを使用します。
az spring app identity assign \
--resource-group <resource-group-name> \
--name <app-name> \
--service <service-name>
--user-assigned <managed-identity-id>
仮想マシンにマネージド ID を割り当てるには、az containerapp identity assign コマンドを使用します。
az containerapp identity assign \
--resource-group <resource-group-name> \
--name <app-name>
--user-assigned <managed-identity-id>
仮想マシンにマネージド ID を割り当てるには、az vm identity assign コマンドを使用します。
az vm identity assign \
--resource-group <resource-group-name> \
--name <virtual-machine-name>
--identities <managed-identity-id>
Azure Kubernetes Service (AKS) インスタンスにマネージド ID を割り当てるには、az aks update コマンドを使用します。
az aks update \
--resource-group <resource-group-name> \
--name <cluster-name> \
--enable-managed-identity \
--assign-identity <managed-identity-id> \
--assign-kubelet-identity <managed-identity-id>
Azure CLI を使用して、Azure Compute ホスティング環境とターゲット サービスとの間でサービス接続をできます。 Service Connector CLI コマンドは、ID に適切なロールを自動的に割り当てます。 サービス コネクタの詳細とサポートされるシナリオについては、概要ページを参照してください。
az identity show
コマンドを使用して、作成したマネージド ID のクライアント ID を取得します。 後で使用するために値をコピーします。
az identity show --name MigrationIdentity --resource-group <your-resource-group> --query clientId
適切な CLI コマンドを使用して、サービス接続を確立します。
Azure App Service を使用している場合は、az webapp connection コマンドを使用します。
az webapp connection create storage-blob \
--resource-group <resource-group-name> \
--name <webapp-name> \
--target-resource-group <target-resource-group-name> \
--account <target-storage-account-name> \
--user-identity "client-id=<your-identity-client-id>" "subs-id=<your-subscription-id>"
Azure Spring Apps を使用している場合は、az spring connection コマンドを使用します。
az spring connection create storage-blob \
--resource-group <resource-group-name> \
--service <service-instance-name> \
--app <app-name> \
--deployment <deployment-name> \
--target-resource-group <target-resource-group> \
--account <target-storage-account-name> \
--user-identity "client-id=<your-identity-client-id>" "subs-id=<your-subscription-id>"
Azure Container Apps を使用している場合は、az containerapp connection コマンドを使用します。
az containerapp connection create storage-blob \
--resource-group <resource-group-name> \
--name <containerapp-name> \
--target-resource-group <target-resource-group-name> \
--account <target-storage-account-name> \
--user-identity "client-id=<your-identity-client-id>" "subs-id=<your-subscription-id>"
マネージド ID にロールを割り当てる
次に、作成したマネージド ID に、ストレージ アカウントへのアクセス許可を付与する必要があります。 ローカル開発ユーザーの場合と同じように、マネージド ID にロールを割り当ててアクセス許可を付与します。
ストレージ アカウントの概要ページに移動し、左側のナビゲーションから [アクセス制御 (IAM)] を選択します。
[ロールの割り当ての追加] を選択します
[ロール] 検索ボックスで「ストレージ BLOB データ共同作成者」を検索します。これは BLOB のデータ操作を管理する目的で一般的に使用されるロールです。 ユース ケースに合った適切なロールであれば何でも割り当てることができます。 一覧から [ストレージ BLOB データ共同作成者] を選択し、[次へ] を選択します。
[ロールの割り当てを追加] 画面の [アクセスの割り当て先] オプションで [マネージド ID] を選択します。 次に、[+ メンバーの選択] を選択します。
ポップアップで、作成したマネージド ID を名前で検索し、結果から選択します。 [選択] を選択してポップアップ メニューを閉じます。
[次へ] を何度か選択して [レビューと割り当て] を選択すれば、ロールの割り当ては完了です。
Azure CLI を使ってリソース レベルでロールを割り当てるには、まず az storage account show コマンドを使ってリソース ID を取得する必要があります。 --query
パラメーターを使って、出力プロパティをフィルター処理することができます。
az storage account show \
--resource-group '<your-resource-group-name>' \
--name '<your-storage-account-name>' \
--query id
前のコマンドからの出力 ID をコピーします。 これで、Azure CLI の az role assignment コマンドを使ってロールを割り当てることができます。
az role assignment create \
--assignee "<your-username>" \
--role "Storage Blob Data Contributor" \
--scope "<your-resource-id>"
Service Connector を使用してサービスを接続した場合は、この手順を行う必要はありません。 Service Connector CLI コマンドを実行した際に、必要なロール構成が処理されました。
アプリケーション コードを更新する
Azure にデプロイする際に作成した特定のマネージド ID を検索するように、アプリケーション コードを構成する必要があります。 シナリオによっては、アプリのマネージド ID を明示的に設定することで、他の環境 ID が誤って検出されて自動的に使用されるのを防ぐこともできます。
マネージド ID の概要ページで、クライアント ID の値をクリップボードにコピーします。
次の言語固有の変更を適用します。
DefaultAzureCredentialOptions
オブジェクトを作成し、それを DefaultAzureCredential
に渡します。 ManagedIdentityClientId プロパティをクライアント ID に設定します。
DefaultAzureCredential credential = new(
new DefaultAzureCredentialOptions
{
ManagedIdentityClientId = managedIdentityClientId
});
AZURE_CLIENT_ID
環境変数をマネージド ID クライアント ID に設定します。 DefaultAzureCredential
は、この環境変数を読み取ります。
managedIdentityClientId メソッドを呼び出します。 クライアント ID を渡します。
DefaultAzureCredential credential = new DefaultAzureCredentialBuilder()
.managedIdentityClientId(managedIdentityClientId)
.build();
managedIdentityClientId プロパティをクライアント ID に設定して、DefaultAzureCredentialClientIdOptions
オブジェクトを作成します。 そのオブジェクトを DefaultAzureCredential
コンストラクターに渡します。
const credential = new DefaultAzureCredential({
managedIdentityClientId
});
DefaultAzureCredential
コンストラクターの managed_identity_client_id パラメーターをクライアント ID に設定します。
credential = DefaultAzureCredential(
managed_identity_client_id = managed_identity_client_id
)
構成の更新を適用するために、この変更を行った後にコードを Azure に再デプロイします。
アプリをテストする
更新したコードをデプロイしたら、ホストされているアプリケーションにブラウザーでアクセスします。 ストレージ アカウントに対してアプリから正常に接続できるはずです。 Azure 環境にロールの割り当てが反映されるまでに数分かかる場合があることに留意してください。 これでローカル環境と運用環境のどちらでも動作するようにアプリケーションが構成されました。開発者がアプリケーション自体でシークレットを管理する必要はありません。
次の手順
このチュートリアルでは、アプリケーションをパスワードレス接続に移行する方法について説明しました。
この記事で説明されている概念の詳細については、次のリソースを参照してください。