次の方法で共有


チュートリアル: 既存の仮想マシンまたは仮想マシン スケール セットにユーザー割り当てマネージド ID を追加する

Azure 監視エージェントを使用する必要がある既存の仮想マシンと仮想マシン スケール セットは、ユーザー割り当てマネージド ID を使用するように更新する必要があります。 この記事では、ユーザー割り当て ID を Azure Policy 経由で大規模にリソースに追加するカスタム定義を割り当てるために必要な手順について説明します。

Note

新しく作成されたリソースでエラーが発生しないようにするには、強制モードを無効 (DoNotEnforce) にして定義テンプレートを割り当てる必要があります。

[前提条件]

  • リソース内に Azure 監視エージェントをインストールするために必要なアクセス許可を持つユーザー割り当て ID を作成します。

ポリシー定義の作成、割り当て、修復

ポータルの使用

既存のリソースを修復するには、次の手順に従います。

  1. Azure portal 上で [すべてのサービス] をクリックし、 [ポリシー] を検索して選択し、Azure Policy サービスを起動します。

  2. Azure Policy ページの左側にある [定義] を選択します。

  3. [+ ポリシー定義] ボタンを使用して、カスタム ポリシー定義を作成します。

  4. タブ上で次のオプションを設定します。

    • 定義の場所: ターゲット スコープに設定します。
    • 名前: カスタム定義の名前に設定します。 例: "既存の VM と VMSS の ID を変更する [適用しないように割り当てる]"
  5. [ポリシー ルール] JSON ブロックで、JSON の例を削除し、modify エフェクトを使用してユーザー割り当て ID を追加する次の定義を貼り付けます。

    {
      "mode": "Indexed",
      "parameters": {
        "userAssignedIdentities": {
          "type": "String",
          "metadata": {
            "displayName": "userAssignedIdentities"
          }
        }
      },
      "policyRule": {
        "if": {
          "allOf": [
            {
              "field": "type",
              "in": [
                "Microsoft.Compute/virtualMachines",
                "Microsoft.Compute/virtualMachineScaleSets"
              ]
            },
            {
              "value": "[requestContext().apiVersion]",
              "greaterOrEquals": "2018-10-01"
            },
            {
              "field": "identity.userAssignedIdentities",
              "notContainsKey": "[parameters('userAssignedIdentities')]"
            }
          ]
        },
        "then": {
          "effect": "modify",
          "details": {
            "roleDefinitionIds": [
              "/providers/microsoft.authorization/roleDefinitions/9980e02c-c2be-4d73-94e8-173b1dc7cf3c"
            ],
            "operations": [
              {
                "operation": "AddOrReplace",
                "field": "identity.type",
                "value": "[if(contains(field('identity.type'), 'SystemAssigned'), 'SystemAssigned,UserAssigned', 'UserAssigned')]"
              },
              {
                "operation": "addOrReplace",
                "field": "identity.userAssignedIdentities",
                "value": "[createObject(parameters('userAssignedIdentities'), createObject())]"
              }
            ]
          }
        }
      }
    }
    
    
  6. [保存] を選択します。 カスタム ポリシー定義が正常に作成されると、定義ビューが設定されます。 [割り当て] ボタンを選択するか、[割り当て] タブに移動して定義を割り当てます。

  7. [スコープ][基本情報] の情報が想定どおりに設定されていることを確認します。

  8. [ポリシーの適用][無効] に設定します。 EnforcementMode を使用すると、リソースの作成時または更新時の適用が無効になります。 強制モードの詳細について参照してください。

    Note

    新しく作成されたリソースでエラーが発生しないようにするには、強制モードを無効 (DoNotEnforce) にして定義テンプレートを割り当てる必要があります。

  9. [パラメーター] タブを選択します。パラメーター userAssignedIdentities には、仮想マシンまたは仮想マシン スケール セットに対して適切なアクセス許可を持つ既存のユーザー割り当て ID が必要です。 ID は次の形式で入力する必要があります。/subscriptions/subID/resourceGroups/RGName/providers/Microsoft.ManagedIdentity/userAssignedIdentities/testUAMI

  10. [修復] タブを選択し、[修復タスクの作成] ボックスをチェックして、既存の仮想マシンと仮想マシン スケール セットを修復できるようにします。 管理グループ レベルでの割り当ての場合は、リソースの修復に関するチュートリアルに従って、割り当ての作成後に修復をトリガーできます。

  11. マネージド ID 内の情報が想定どおりであることを確認します。

  12. [Review + create](レビュー + 作成) を選択します。 カスタム定義が割り当て済みです。 サブスクリプション レベル以下での割り当ての場合、既存の仮想マシンと仮想マシン スケール セットは、ポリシー修復タスクを介して修復されます。 将来の仮想マシンと仮想マシン スケール セット、または管理グループ レベルでの割り当ては、リソースの修復に関するチュートリアルに従って修復する必要があります。

PowerShell の使用

  1. 次の JSON スニペットを使用して、ModifyVMIdentities.json という名前の JSON ファイルを作成します。

    {
      "mode": "Indexed",
      "parameters": {
        "userAssignedIdentities": {
          "type": "String",
          "metadata": {
            "displayName": "userAssignedIdentities"
          }
        }
      },
      "policyRule": {
        "if": {
          "allOf": [
            {
              "field": "type",
              "in": [
                "Microsoft.Compute/virtualMachines",
                "Microsoft.Compute/virtualMachineScaleSets"
              ]
            },
            {
              "value": "[requestContext().apiVersion]",
              "greaterOrEquals": "2018-10-01"
            },
            {
              "field": "identity.userAssignedIdentities",
              "notContainsKey": "[parameters('userAssignedIdentities')]"
            }
          ]
        },
        "then": {
          "effect": "modify",
          "details": {
            "roleDefinitionIds": [
              "/providers/microsoft.authorization/roleDefinitions/9980e02c-c2be-4d73-94e8-173b1dc7cf3c"
            ],
            "operations": [
              {
                "operation": "AddOrReplace",
                "field": "identity.type",
                "value": "[if(contains(field('identity.type'), 'SystemAssigned'), 'SystemAssigned,UserAssigned', 'UserAssigned')]"
              },
              {
                "operation": "addOrReplace",
                "field": "identity.userAssignedIdentities",
                "value": "[createObject(parameters('userAssignedIdentities'), createObject())]"
              }
            ]
          }
        }
      }
    }
    

    ポリシー定義の作成方法の詳細については、「Azure Policy の定義の構造」を参照してください。

  2. ModifyVMIdentities.json ファイルを使用し、次のコマンドを実行してポリシー定義を作成します。

    New-AzPolicyDefinition -Name 'ModifyVMIdentities' -DisplayName 'Modify identities on existing VMs and VMSS' -Policy 'ModifyVMIdentities.json'
    

    このコマンドでは、既存の VM と VMSS 上の ID の変更という名前のポリシー定義を作成します。

    場所のパラメーターを指定せずに呼び出されると、New-AzPolicyDefinition は既定で、セッションのコンテキストの選択されたサブスクリプションにポリシー定義を保存します。 定義を別の場所に保存するには、次のパラメーターを使用します。

    • SubscriptionId -別のサブスクリプションに保存します。 GUID 値が必要です。
    • ManagementGroupName -管理グループに保存します。 string 値が必要です。
  3. ポリシー定義を作成したら、次のコマンドを実行してポリシー割り当てを作成できます。

    $Subscription = Get-AzSubscription -SubscriptionName 'Subscription01'
    $Policy = Get-AzPolicyDefinition -Name 'ModifyVMIdentities'
    $VMuserassignedidentity = Get-AzUserAssignedIdentity -ResourceGroupName 'NMidentityRG' -Name $VMuserassignedidentityname
    $VMuserassignedidentityid = $VMuserassignedidentity.Id
    New-AzPolicyAssignment -Name 'ModifyVMIdentities' -PolicyDefinition $Policy -Scope "/subscriptions/$($Subscription.Id)" -EnforcementMode DoNotEnforce -Location 'westus' -IdentityType "SystemAssigned" -PolicyParameterObject $VMuserassignedidentityid
    

    Note

    新しく作成されたリソースでエラーが発生しないようにするには、強制モードを無効 (DoNotEnforce) にして定義を割り当てる必要があります。

    Subscription01 を、対象のリソース グループの名前に置き換えます。

    New-AzPolicyAssignmentScope パラメーターは、管理グループ、サブスクリプション、リソース グループ、または単一のリソースに使用できます。 このパラメーターは、Get-AzResourceGroupResourceId プロパティが返す完全なリソース パスを使用します。 各コンテナーの Scope のパターンは、次のとおりです。 {rName}{rgName}{subId}、および {mgName} を、それぞれリソース名、リソース グループ名、サブスクリプション ID、および管理グループ名と置き換えます。 {rType} は、そのリソースのリソースの種類 (VM の場合は Microsoft.Compute/virtualMachines など) に置き換えられます。

    • リソース - /subscriptions/{subID}/resourceGroups/{rgName}/providers/{rType}/{rName}
    • リソース グループ - /subscriptions/{subId}/resourceGroups/{rgName}
    • サブスクリプション - /subscriptions/{subId}
    • 管理グループ - /providers/Microsoft.Management/managementGroups/{mgName}
  4. ポリシー割り当てを作成したら、次のコマンドを実行して、既存の仮想マシンと仮想マシン スケール セット リソースに ID を追加する修復タスクを作成できます。

    Start-AzPolicyRemediation -Name 'remediationVMidentities' -PolicyAssignmentId '/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/policyAssignments/ModifyVMIdentities'
    

次のステップ