Azure Policy の使用に関するエラーをトラブルシューティングする

ポリシー定義を作成したり、SDK を操作したり、Kubernetes 用の Azure Policy アドオンを設定したりするときに、エラーが発生することがあります。 この記事では、発生する可能性があるさまざまな一般的エラーについて説明し、その解決方法を示します。

エラーの詳細を見つける

エラーの詳細の場所は、操作している Azure Policy の側面によって異なります。

  • カスタム ポリシーを操作している場合は、Azure portal に移動し、リンティングによるスキーマに関するフィードバックを取得するか、結果のコンプライアンス データを確認して、リソースがどのように評価されたかを確認してください。
  • さまざまな SDK を操作している場合は、SDK によって、関数が失敗した理由に関する詳細が提供されます。
  • Kubernetes のアドオンを操作している場合は、クラスター内のログから開始します。

一般エラー

シナリオ:エイリアスが見つからない

問題

正しくないまたは存在しないエイリアスがポリシー定義で使用されています。 Azure Policy がエイリアスを使用して、Azure Resource Manager のプロパティにマップしています。

原因

正しくないまたは存在しないエイリアスがポリシー定義で使用されています。

解像度

まず、Resource Manager プロパティにエイリアスがあることを確認します。 使用可能なエイリアスを検索するには、Visual Studio Code 用の Azure Policy 拡張機能、または SDK にアクセスします。 Resource Manager プロパティのエイリアスが存在しない場合は、サポート チケットを作成します。

シナリオ:評価の詳細が最新ではない

問題

リソースが "Not Started (未開始) " 状態であるか、またはコンプライアンスの詳細が最新ではありません。

原因

新しいポリシーまたはイニシアチブの割り当ては、適用されるまでに約 5 分かかります。 既存の割り当てのスコープ内の新規または更新されたリソースは、約 15 分で使用できるようになります。 標準のコンプライアンス スキャンは、24 時間ごとに行われます。 詳細については、「評価のトリガー」を参照してください。

解像度

まず、評価が完了して Azure portal または SDK でコンプライアンスの結果を利用できるようになるまで、適切な時間待機します。 Azure PowerShell または REST API を使用して新しい評価スキャンを開始するには、「オンデマンドの評価スキャン」を参照してください。

シナリオ:コンプライアンスが想定どおりでない

問題

リソースが、そのリソースに対して想定されている Compliant または Not-Compliant のいずれの評価状態でもありません。

原因

リソースがポリシー割り当ての正しいスコープに含まれていないか、ポリシー定義が意図したとおりに動作していません。

解決方法

ポリシー定義をトラブルシューティングするには、次のことを実行します。

  1. まず、評価が完了して Azure portal または SDK でコンプライアンスの結果を利用できるようになるまで、適切な時間待機します。

  2. Azure PowerShell または REST API を使用して新しい評価スキャンを開始するには、「オンデマンドの評価スキャン」を参照してください。

  3. 割り当てパラメーターと割り当てスコープが正しく設定されていることを確認します。

  4. ポリシー定義モードを確認します。

    • モードは、すべてのリソースの種類に対して all である必要があります。
    • ポリシー定義によってタグや場所が確認される場合は、モードは indexed である必要があります。
  5. リソースのスコープが除外対象または適用除外対象でないことを確認します。

  6. ポリシー割り当ての準拠に 0/0 リソースが表示されている場合は、割り当てスコープ内で適用できると判断されたリソースはありません。 ポリシー定義と割り当てスコープの両方を確認してください。

  7. 準拠していると予期されていた非準拠のリソースについては、非準拠である理由の特定に関するページを参照してください。 定義と、評価されたプロパティ値を比較することで、リソースが非準拠であった理由がわかります。

    • 対象の値が間違っている場合は、ポリシー定義を修正します。
    • 現在の値が間違っている場合は、resources.azure.com を介してリソース ペイロードを検証します。
  8. RegEx 文字列パラメーターをサポートするリソース プロバイダー モード定義 (Microsoft.Kubernetes.Data や組み込み定義の "コンテナー イメージは信頼されたレジストリからのみデプロイする必要がある" など) の場合、RegEx 文字列パラメーターが正しいことを確認します。

  9. その他の一般的な問題と解決策については、トラブルシューティング: 適用が想定どおりでないに関する記事を参照してください。

複製してカスタマイズした組み込みのポリシー定義またはカスタム定義で引き続き問題が発生する場合は、問題が適切に転送されるように、"ポリシーの作成" についてサポート チケットを作成してください。

シナリオ:適用が想定どおりでない

問題

Azure Policy によって処理されると予想されているリソースが処理されておらず、Azure アクティビティ ログにエントリがありません。

原因

ポリシー割り当ては、DisabledenforcementMode 設定に対して構成されています。 enforcementMode が無効になっていると、ポリシー効果は適用されず、アクティビティ ログにエントリはありません。

解決方法

ポリシー割り当ての適用をトラブルシューティングするには、次のことを実行します。

  1. まず、評価が完了して Azure portal または SDK でコンプライアンスの結果を利用できるようになるまで、適切な時間待機します。

  2. Azure PowerShell または REST API を使用して新しい評価スキャンを開始するには、「オンデマンドの評価スキャン」を参照してください。

  3. 割り当てパラメーターと割り当てスコープが正しく設定されていること、および enforcementMode が "有効" になっていることを確認します。

  4. ポリシー定義モードを確認します。

    • モードは、すべてのリソースの種類に対して all である必要があります。
    • ポリシー定義によってタグや場所が確認される場合は、モードは indexed である必要があります。
  5. リソースのスコープが除外対象または適用除外対象でないことを確認します。

  6. リソースのペイロードがポリシー ロジックと一致することを確認します。 これは、HTTP Archive (HAR) トレースをキャプチャするか、Azure Resource Manager テンプレート (ARM テンプレート) のプロパティを確認することによって実行できます。

  7. その他の一般的な問題と解決策については、トラブルシューティング: コンプライアンスが想定どおりでないに関する記事を参照してください。

複製してカスタマイズした組み込みのポリシー定義またはカスタム定義で引き続き問題が発生する場合は、問題が適切に転送されるように、"ポリシーの作成" についてサポート チケットを作成してください。

シナリオ:Azure Policy による拒否

問題

リソースの作成または更新が拒否されました。

原因

新しいまたは更新されたリソースのスコープへのポリシー割り当てが、Deny 効果が適用されているポリシー定義の条件を満たしています。 これらの定義を満たしているリソースは、作成または更新できません。

解像度

拒否されたポリシー割り当てのエラー メッセージには、ポリシー定義とポリシー割り当て ID が含まれています。 メッセージ内のエラー情報が欠落している場合は、アクティビティ ログでも確認できます。 この情報を使用して、リソースの制限を理解し、許可された値に一致するように要求のリソース プロパティを調整します。

シナリオ: 複数のリソースの種類が定義の対象とされている

問題

複数のリソースの種類を含むポリシー定義が、作成時または更新時に次のエラーで検証に失敗します。

The policy definition '{0}' targets multiple resource types, but the policy rule is authored in a way that makes the policy not applicable to the target resource types '{1}'.

原因

ポリシー定義ルールに、ターゲット リソースの種類によって評価されない 1 つ以上の条件が含まれています。

解決方法

エイリアスが使用されている場合、その前に種類の条件を追加することによって、そのエイリアスが属しているリソースの種類に対してのみエイリアスが評価されるようにします。 別の方法としては、ポリシー定義を複数の定義に分割して、複数のリソースの種類をターゲットにしないようにします。

シナリオ: サブスクリプションの上限超過

問題

Azure portal のコンプライアンス ページのエラー メッセージは、ポリシー割り当てのコンプライアンス取得時に表示されます。

原因

要求において選択範囲の下、サブスクリプションの数が上限の 5000 サブスクリプションを超過しました。 コンプライアンスの結果が部分的に表示される場合があります。

解決方法

子サブスクリプションを少なくし、より詳細な範囲を選択すると、完全な結果が表示されます。

テンプレート エラー

シナリオ:ポリシーでサポートされる関数がテンプレートによって処理される

問題

Azure Policy では、ARM テンプレートの関数と、ポリシー定義でのみ使用できる関数が多数サポートされています。 Resource Manager は、ポリシー定義の一部としてではなく、デプロイの一部としてこれらの機能を処理します。

原因

parameter()resourceGroup() などのサポートされている関数を使用すると、ポリシー定義や Azure Policy エンジンの関数に処理させる代わりに、デプロイ時に関数の処理結果が得られます。

解決方法

関数をポリシー定義の一部として渡すには、プロパティが [[resourceGroup().tags.myTag] のようになるように [ で文字列全体をエスケープします。 このエスケープ文字により、Resource Manager でテンプレートが処理されるときに値は文字列として扱われます。 その後、関数は Azure Policy によってポリシー定義に配置され、それにより、予期したとおりに動的になります。 詳細については、「Azure Resource Manager テンプレートの構文と式」を参照してください。

Kubernetes インストール エラー用アドオン

シナリオ:パスワード エラーが原因で、Helm Chart を使用したインストールが失敗する

問題

helm install azure-policy-addon コマンドが失敗し、次のいずれかのエラーが返されます。

  • !: event not found
  • Error: failed parsing --set data: key "<key>" has no value (cannot end with ,)

原因

生成されたパスワードにコンマ (,) が含まれており、ここで Helm Chart が分割されています。

解決方法

helm install azure-policy-addon を実行するときに、パスワード値のコンマ (,) を円記号 (\) でエスケープします。

シナリオ:名前が既に存在するため、Helm Chart を使用したインストールが失敗する

問題

helm install azure-policy-addon コマンドが失敗し、次のエラーが返されます。

  • Error: cannot re-use a name that is still in use

原因

azure-policy-addon という名前の Helm Chart は、既にインストールされているか、部分的にインストールされています。

解像度

Kubernetes 用の Azure Policy アドオンを削除する指示に従ってから、helm install azure-policy-addon コマンドを再実行します。

シナリオ:Azure 仮想マシンのユーザー割り当て ID がシステム割り当てマネージド ID に置き換えられる

問題

マシン内の監査設定にゲスト構成ポリシーのイニシアチブを割り当てると、マシンに割り当てられていたユーザー割り当てマネージド ID は割り当てられなくなります。 システム割り当てマネージド ID のみが割り当てられます。

原因

以前にゲスト構成の DeployIfNotExists 定義で使用されていたポリシー定義により、システム割り当て ID がマシンに割り当てられましたが、またユーザー割り当て ID の割り当ても削除されました。

解決方法

以前にこの問題の原因となった定義は、"非推奨" と表示され、ユーザー割り当てマネージド ID を削除せずに前提条件を管理するポリシー定義に置き換えられています。 手動操作が必要です。 "非推奨" とマークされている既存のポリシー割り当てをすべて削除し、元のものと同じ名前を持つ、更新された前提条件ポリシー イニシアチブとポリシー定義に置き換えてください。

詳細な説明については、ゲスト構成の監査ポリシーに関してリリースされた重要な変更に関するブログ記事を参照してください。

Kubernetes 一般的エラー用アドオン

シナリオ:エグレス制限のため、アドオンは Azure Policy サービス エンドポイントに接続できません

問題

アドオンは Azure Policy サービス エンドポイントに接続できず、次のいずれかのエラーが返されます。

  • failed to fetch token, service not reachable
  • Error getting file "Get https://raw.githubusercontent.com/Azure/azure-policy/master/built-in-references/Kubernetes/container-allowed-images/template.yaml: dial tcp 151.101.228.133.443: connect: connection refused

原因

この問題は、クラスター エグレスがロック ダウンされている場合に発生します。

解決方法

次の記事に記載されているドメインとポートが開いていることを確認します。

シナリオ:aad-pod-identity の構成のため、アドオンは Azure Policy サービス エンドポイントに接続できない

問題

アドオンは Azure Policy サービス エンドポイントに接続できず、次のいずれかのエラーが返されます。

  • azure.BearerAuthorizer#WithAuthorization: Failed to refresh the Token for request to https://gov-prod-policy-data.trafficmanager.net/checkDataPolicyCompliance?api-version=2019-01-01-preview: StatusCode=404
  • adal: Refresh request failed. Status Code = '404'. Response body: getting assigned identities for pod kube-system/azure-policy-8c785548f-r882p in CREATED state failed after 16 attempts, retry duration [5]s, error: <nil>

原因

このエラーは add-pod-identity がクラスターにインストールされていて、kube-system ポッドが aad-pod-identity で除外されていない場合に発生します。

Azure Instance Metadata エンドポイントへの呼び出しをインターセプトするように、aad-pod-identity コンポーネントの Node Managed Identity (NMI) ポッドによりノードの iptables が変更されます。 この設定の場合、Metadata エンドポイントに要求が行われると、ポッドで aad-pod-identity が使用されていない場合でも、NMI によって要求がインターセプトされます。 CustomResourceDefinition (CRD) に定義されているラベルに一致するポッドから発信された Metadata エンドポイントに対する要求は、NMI で処理せずにプロキシ処理する必要があることを aad-pod-identity に通知するように、AzurePodIdentityException CRD を構成できます。

解決方法

AzurePodIdentityException CRD を構成することによって、kube-system 名前空間内の kubernetes.azure.com/managedby: aks ラベルを持つシステム ポッドを aad-pod-identity で除外します。

詳細については、特定のポッドまたはアプリケーションでの Azure Active Directory (Azure AD) ポッド ID の無効化に関する記事を参照してください。

例外を構成するには、この例に従ってください。

apiVersion: "aadpodidentity.k8s.io/v1"
kind: AzurePodIdentityException
metadata:
  name: mic-exception
  namespace: default
spec:
  podLabels:
    app: mic
    component: mic
---
apiVersion: "aadpodidentity.k8s.io/v1"
kind: AzurePodIdentityException
metadata:
  name: aks-addon-exception
  namespace: kube-system
spec:
  podLabels:
    kubernetes.azure.com/managedby: aks

シナリオ:リソース プロバイダーが登録されていない

問題

アドオンは Azure Policy サービス エンドポイントに接続できますが、アドオン ログに次のいずれかのエラーが表示されます。

  • The resource provider 'Microsoft.PolicyInsights' is not registered in subscription '{subId}'. See https://aka.ms/policy-register-subscription for how to register subscriptions.

  • policyinsightsdataplane.BaseClient#CheckDataPolicyCompliance: Failure responding to request: StatusCode=500 -- Original Error: autorest/azure: Service returned an error. Status=500 Code="InternalServerError" Message="Encountered an internal server error.

原因

"Microsoft.PolicyInsights" リソース プロバイダーが登録されていません。 アドオンによってポリシー定義が取得され、コンプライアンス データが返されるためには、登録されている必要があります。

解決方法

"Microsoft.PolicyInsights"リソース プロバイダーをクラスター サブスクリプションに登録します。 手順については、リソース プロバイダーの登録に関するページを参照してください。

シナリオ:サブスクリプションが無効

問題

アドオンは Azure Policy サービス エンドポイントに接続できますが、次のエラーが表示されます。

The subscription '{subId}' has been disabled for azure data-plane policy. Please contact support.

原因

このエラーは、サブスクリプションに問題があると判断され、このサブスクリプションをブロックするために機能フラグ Microsoft.PolicyInsights/DataPlaneBlocked が追加されたことを示しています。

解決方法

この問題を調査して解決するには、機能チームにお問い合わせください

シナリオ: "ゲスト構成" カテゴリの定義を Azure portal から複製できない

問題

Azure portal のポリシー定義ページからカスタム ポリシー定義を作成しようと、[定義を複製する] ボタンを選択します。 そのポリシーを割り当てた後、ゲスト構成の割り当てリソースが存在しないために、マシンが "非準拠" になっていることに気付きます。

原因

ゲスト構成割り当てリソースを作成する際、ポリシー定義に追加されたカスタム メタデータが使用されます。 Azure portal の "定義を複製する" アクティビティでは、カスタム メタデータがコピーされません。

解像度

ポータルではなく Policy Insights API を使用してポリシー定義を複製してください。 次の PowerShell サンプルにその方法を示します。

# duplicates the built-in policy which audits Windows machines for pending reboots
$def = Get-AzPolicyDefinition -id '/providers/Microsoft.Authorization/policyDefinitions/4221adbc-5c0f-474f-88b7-037a99e6114c' | % Properties
New-AzPolicyDefinition -name (new-guid).guid -DisplayName "$($def.DisplayName) (Copy)" -Description $def.Description -Metadata ($def.Metadata | convertto-json) -Parameter ($def.Parameters | convertto-json) -Policy ($def.PolicyRule | convertto-json -depth 15)

シナリオ: 拒否ポリシーが割り当てられているにもかかわらず、接続エラー中に Kubernetes リソースが作成される

問題

Kubernetes クラスターの接続エラーが発生した場合、Gatekeeper のフェールオープン動作により、新しく作成または更新されるリソースの評価がバイパスされる可能性があります。

原因

GK のフェールオープン モデルは、設計上、コミュニティからのフィードバックに基づいて設計されています。 Gatekeeper のドキュメントでは、これらの理由について https://open-policy-agent.github.io/gatekeeper/website/docs/failing-closed#considerations で説明しています。

解決方法

上記のイベントでは、kube-apiserver によって提供されるアドミッション Webhook メトリックからエラー ケースを監視できます。 また、作成時に評価がバイパスされ、オブジェクトが作成された場合でも、Azure Policy コンプライアンスには、顧客へのフラグとして非準拠の報告が行われます。

上記に関係なく、このようなシナリオでは、Azure Policy はクラスター上の最後の既知のポリシーを保持し、ガードレールが機能するよう維持します。

次のステップ

お客様の問題がこの記事に掲載されていない場合、または解決できない場合は、次のいずれかのチャネルにアクセスしてサポートを受けてください。

  • Microsoft Q&A を通じて、専門家からの回答を得る。
  • @AzureSupport に問い合わせる。 この Twitter 上の Microsoft Azure 公式リソースは、Azure コミュニティを適切な回答、サポート、エキスパートに結び付けることによって、カスタマー エクスペリエンスを向上させます。
  • それでもヘルプが必要な場合は、Azure サポート サイトにアクセスし、 [サポート リクエストの送信] を選択してください。