エラーの概要

Azure リソースへのアクセスが拒否されたことを示す HTTP 403 エラーです。このエラーは、ユーザーやアプリケーションが認証には成功(401 ではなく)したものの、対象リソースに対する操作権限がないことを意味します。Azure では RBAC(ロールベースアクセス制御)、Azure Policy、ネットワーク設定などの複数のレイヤーで権限チェックが行われるため、403 が頻繁に発生します。

実際のエラーメッセージ例

Azure Portal や Azure CLI を通じて 403 エラーが出力される場合、以下のような形式で表示されます。

{
  "error": {
    "code": "AuthorizationFailed",
    "message": "The client 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' with object id 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' does not have authorization to perform action 'Microsoft.Compute/virtualMachines/write' over scope '/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.Compute/virtualMachines/<vm-name>'."
  }
}
$ az vm create --resource-group <resource-group> --name <vm-name> ...
(AuthorizationFailed) The client 'user@example.com' with object id '...' 
does not have authorization to perform action 'Microsoft.Compute/virtualMachines/write'

よくある原因と解決手順

原因 1:RBAC で必要なロールが割り当てられていない

Azure RBAC により、ユーザーやサービスプリンシパルに対して明示的にロールを割り当てない限り、リソースへの操作は拒否されます。例えば、仮想マシンの作成には「仮想マシン共同作成者」や「共同作成者」ロールが必要です。サブスクリプションやリソースグループレベルでロールが割り当てられていなければ、その配下のすべてのリソース操作が 403 で拒否されます。

修正例:

# 1. ユーザーのオブジェクト ID を取得
OBJECT_ID=$(az ad user show --id user@example.com --query id -o tsv)

# 2. サブスクリプションレベルで "Virtual Machine Contributor" ロールを割り当て
az role assignment create \
  --assignee $OBJECT_ID \
  --role "Virtual Machine Contributor" \
  --scope /subscriptions/<subscription-id>

# 3. その後、VM 作成を実行
$ az vm create \
  --resource-group myResourceGroup \
  --name myVM \
  --image UbuntuLTS

原因 2:Azure Policy が操作を制限している

Azure Policy により、特定の操作やリソースタイプの作成が組織レベルで制限されていることがあります。例えば、「本番環境では D シリーズ以上の VM のみ許可」といったポリシーが適用されている場合、B シリーズ VM の作成は 403 で拒否されます。ユーザーが十分な RBAC 権限を持っていても、Policy の制約により操作は失敗します。

修正例:

# 1. 適用されている Policy を確認
$ az policy assignment list \
  --scope /subscriptions/<subscription-id> \
  --query "[].displayName" -o table

# 2. 制限されている操作を確認
$ az policy definition show \
  --name <policy-name> \
  --query "properties.policyRule"

# 3. ポリシーに準拠したリソース設定で実行
$ az storage account create \
  --name mystorageaccount \
  --resource-group myResourceGroup \
  --location eastus \
  --sku Standard_GRS

原因 3:リソースのネットワーク設定でアクセスが制限されている

リソースが仮想ネットワーク内に配置されていたり、プライベートエンドポイント経由のアクセスのみに制限されていたり、ファイアウォール設定で特定の IP 範囲のみを許可しているケースです。管理者側の RBAC は正しくても、ネットワークレベルで接続そのものが遮断されると、403 で拒否されます。例えば、Azure SQL Database にファイアウォール設定があり、クライアント IP が許可リストに含まれていない場合、認証後も操作は 403 となります。

修正例:

# 1. ファイアウォール規則を確認
$ az sql server firewall-rule list \
  --resource-group myResourceGroup \
  --server myserver

# 2. 自分のクライアント IP を許可リストに追加
$ az sql server firewall-rule create \
  --resource-group myResourceGroup \
  --server myserver \
  --name AllowMyIP \
  --start-ip-address <your-ip> \
  --end-ip-address <your-ip>

# 3. その後、SQL DB の操作を再実行
$ az sql db show \
  --resource-group myResourceGroup \
  --server myserver \
  --name mydb

ツール固有の注意点

Azure Portal での RBAC 確認方法: リソースに対して直接アクセス制御(IAM)を設定することで、より細粒度な権限管理が可能です。Azure Portal でリソースを選択し、左側メニューから「アクセス制御(IAM)」を開き、「ロールの割り当てを確認」をクリックすることで、現在の割り当て状況を視覚的に確認できます。

Azure CLI での権限確認コマンド

# 特定ユーザーに割り当てられたすべてのロール(サブスクリプション配下)を表示
$ az role assignment list \
  --assignee <object-id-or-email> \
  --subscription <subscription-id>

# リソースグループレベルで確認する場合
$ az role assignment list \
  --assignee <object-id-or-email> \
  --scope /subscriptions/<subscription-id>/resourceGroups/<resource-group>

マネージドアイデンティティの場合: Azure VM や App Service などがマネージドアイデンティティを使用する場合、そのマネージドアイデンティティに対して RBAC ロールを割り当てる必要があります。サービスプリンシパルのオブジェクト ID(通常は Azure AD 上の名前)を確認し、同様に az role assignment create でロール割り当てを行います。

Terraform での RBAC 設定例

# Terraform を使用して RBAC ロール割り当てを自動化
resource "azurerm_role_assignment" "example" {
  scope              = azurerm_resource_group.example.id
  role_definition_name = "Virtual Machine Contributor"
  principal_id       = data.azurerm_client_config.current.object_id
}

それでも解決しない場合

Azure のアクティビティログを確認し、より詳細なエラーメッセージを取得してください。

# Azure Activity Log からエラーの詳細を検索
$ az monitor activity-log list \
  --resource-group <resource-group> \
  --query "[?contains(properties.eventName, 'Write')].{Time:eventTimestamp, Message:properties.statusMessage}" \
  --output table

Azure Portal の「監視」→「アクティビティログ」からも、リアルタイムでエラーイベントを追跡できます。403 エラーが発生した時刻を基準に、対応するログエントリを検索し、「状態」「リクエスト」タブから詳細な JSON レスポンスを確認することで、Policy が拒否しているのか、RBAC か、ネットワーク設定かを判定できます。

サービスプリンシパルやマネージドアイデンティティを使用する場合、Azure AD の Application Registration から該当オブジェクトのオブジェクト ID が正しいか再確認してください。az ad sp show --id <client-id> で確認できます。

最新の Azure RBAC ロール定義や Policy については、Microsoft Learn - Azure RBAC のドキュメントおよび Azure Policy の公式ページを参照してください。


免責事項:本記事の内容は、執筆時点の公開情報をもとに作成したものです。ソフトウェアの仕様は予告なく変更されることがあります。最新の情報は各ツールの公式サポートページをご確認ください。本記事の情報を利用した結果生じたいかなる損害についても、著者および運営者は責任を負いかねます。