🚥

サービス グループで何が変わるの?

に公開
2025/12/04

本年の MS Ignite でも紹介[1]されていたサービス グループについて、
従来のリソース編成単位(管理グループ、サブスクリプション、リソース グループ)との違いや、使い方について紹介します。

サービス グループとは?

サービス グループは、Azure リソースを論理的にグループ化するための管理機能の1つです。
この機能は、MS Build で発表[2]されました。
従来の管理グループやリソース グループとは異なり、既存の階層構造を超えて複数のサブスクリプションやリソース グループにまたがるリソースを柔軟にグループ化できます。

ただ、サービス グループに対してリソースをデプロイすることはできません。
また、管理グループ、サブスクリプション、リソース グループの階層に属する新たなグループ単位というわけではなく、監視などの管理に特化した機能となっています。

主な特徴

  • サービス グループには、サブスクリプション、リソース グループ、個別のリソースを含めることができます。また、個々のサービス グループで、選択したそれらのメンバーが重複していてもかまいません。
  • 上記の属性から、管理グループ、サブスクリプション、リソース グループといった、リソースの再編成が難しい従来の階層的なリソース編成モデルとは異なり、フラットなグループ化が可能です。

サービス グループによる横断的なリソース管理

  • 現在の機能としては、正常性モデルや Application Insights の統合ビューや、仮想マシンおよび AKS に対する監視機能の有効化状況を確認する機能にとどまっています。

正常性モデルとApplication Insightsの統合ビュー
監視機能の有効化状況

従来のリソース構成単位との違い

管理グループなどの従来のリソース編成単位との大きな違いは、サービス グループに対してリソースのデプロイは行うことができません。
また、現時点の用途としては、監視のシナリオに特化したものになっています。

観点 管理グループ サブスクリプション リソース グループ サービス グループ
構造 階層的(ツリー構造) 階層的(ツリー構造) - フラット
リソースをデプロイ可能か はい はい はい いいえ
スコープ 複数サブスクリプション 単一サブスクリプション 単一サブスクリプション内 Entra テナント横断
目的 組織階層に基づくガバナンス 課金とアクセス制御の境界 デプロイ単位、ライフサイクル管理 プロジェクト/アプリケーション単位の管理
重複 不可(1つのサブスクリプションは1つの親のみ) - - 可能(1つのリソースが複数のグループに所属可能)
用途 大規模組織のガバナンス 課金管理、環境分離 デプロイ管理 横断的な管理、可視化、ガバナンス

サービス グループを使った Azure 管理のシナリオ

現時点でサービス グループは監視に特化した機能になっていますので、
以下のようなシナリオが想定されます。

シナリオ 1: マルチサブスクリプション環境でのアプリケーション管理

課題:
1つのアプリケーションが開発、ステージング、本番の3つのサブスクリプションに分散している場合、一元管理が困難になることがあります。

解決策:
サービス グループでアプリケーション単位でのグループ化を実施

  • アプリケーション「フロントエンド」、「バックエンド」のサービス グループを作成
  • 各サブスクリプションにあるフロントエンド、バックエンド仮想マシンをそれぞれのサービス グループに追加
  • サービス グループを通して、正常性や性能の監視を実施

シナリオ 2: プロジェクト単位でのガバナンス強化

課題:
複数の部門やチームが関わるプロジェクトで、リソースが複数のリソース グループやサブスクリプションに散在している場合を考えます。
Azure クラウド導入フレームワークに基づいてガバナンスを強化したいが、従来の管理グループやリソース グループでは対応が難しい状況です。

解決策:
プロジェクト専用のサービス グループを作成

  • プロジェクト「新規 EC サイト構築」のサービス グループを作成
  • フロントエンド チーム、バックエンド チーム、データ チームの各リソース グループをメンバーに追加
  • プロジェクト全体に対して、セキュリティ ポリシーやコンプライアンス要件を一括適用
  • プロジェクト マネージャーはサービス グループ単位でコストとリソース利用状況を監視

メンバーの動的な登録

Azure Policy を用いて特定のタグに基づくリソースをサービス グループに登録することが可能です。
先にサービス グループを作っておき、その後、ポリシーで特定のタグ (今回は Purpose:Demo) を持つリソースを自動的に登録する例を示します。

以下の手順で実施します:

  1. ポリシー定義のルールを作成
  2. ポリシー定義を作成
  3. ポリシーを割り当て
  4. マネージド ID にロールを割り当て
  5. 修復タスクを実行
ポリシーを使った具体手順

まず、ポリシー定義のルール部分の例を示します。

{
  "if": {
    "allOf": [
      {
        "field": "[concat('tags[', parameters('tagName'), ']')]",
        "equals": "[parameters('tagValue')]"
      }
    ]
  },
  "then": {
    "effect": "deployIfNotExists",
    "details": {
      "type": "Microsoft.Relationships/serviceGroupMember",
      "roleDefinitionIds": [
        "/providers/Microsoft.Authorization/roleDefinitions/05b1aaf9-00c9-477b-b0e8-2da660b78c51",
        "/providers/Microsoft.Management/serviceGroups/vmmgmt/providers/Microsoft.Authorization/roleDefinitions/32e6a4ec-6095-4e37-b54b-12aa350ba81f"
      ],
      "deployment": {
        "properties": {
          "mode": "incremental",
          "template": {
            "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
            "contentVersion": "1.0.0.0",
            "parameters": {
              "fullName": {
                "type": "string"
              },
              "fullType": {
                "type": "string"
              }
            },
            "resources": [
              {
                "type": "Microsoft.Relationships/serviceGroupMember",
                "apiVersion": "2023-09-01-preview",
                "name": "[concat('sgm-', parameters('fullName'))]",
                "scope": "[concat(subscription().id, '/resourceGroups/', resourceGroup().name, '/providers/', parameters('fullType'), '/', parameters('fullName'))]",
                "properties": {
                  "targetId": "/providers/Microsoft.Management/serviceGroups/vmmgmt",
                  "targetTenant": "<your-entra-tenant-id>"
                }
              }
            ]
          },
          "parameters": {
            "fullName": {
              "value": "[field('name')]"
            },
            "fullType": {
              "value": "[field('type')]"
            }
          }
        }
      }
    }
  }
}

上記のルールの定義を使って、ポリシー定義を作成します。

# ポリシー定義を作成
$ az policy definition create \
  --name "deploy-vm-sg-membership" \
  --display-name "Deploy Service Group Membership for VM Resources" \
  --description "Automatically deploy serviceGroupMember for tagged resources" \
  --rules './policy-rules-only.json' \
  --params '{"tagName":{"type":"String","metadata":{"description":"Name of the tag to check."}},"tagValue":{"type":"String","metadata":{"description":"Value of the tag to match."}}}' \
  --mode Indexed \
  --management-group <your-management-group-id>

次いでポリシー定義をテナントスコープに割り当てます。

# ポリシーを割り当て
$ az policy assignment create \
  --name "vm-resources-to-sg" \
  --display-name "Assign VM Resources to Service Group" \
  --policy "/providers/Microsoft.Management/managementGroups/<your-management-group-id>/providers/Microsoft.Authorization/policyDefinitions/deploy-vm-sg-membership" \
  --scope "/providers/Microsoft.Management/managementGroups/<your-management-group-id>" \
  --mi-system-assigned \
  --location "japaneast" \
  --params '{           
    "tagName": {"value": "Purpose"},
    "tagValue": {"value": "Demo"}
  }'

ポリシーのマネージド ID に対して、ロールを割り当てます。

# ポリシーの割り当てからマネージド ID の ID を取得
$ PRINCIPAL_ID=$(az policy assignment show --name "vm-resources-to-sg" --scope "/providers/Microsoft.Management/managementGroups/<your-management-group-id>" --query "identity.principalId" -o tsv)

# サービス グループ メンバーシップの管理に必要なロールを割り当て
$ az role assignment create \
  --assignee $PRINCIPAL_ID \
  --role "32e6a4ec-6095-4e37-b54b-12aa350ba81f" \
  --scope "/providers/Microsoft.Management/serviceGroups/vmmgmt"

# サブスクリプション レベルでの Contributor ロールを割り当て
$ az role assignment create \
  --assignee $PRINCIPAL_ID \
  --role "b24988ac-6180-42a0-ab88-20f7382dd24c" \
  --scope "/subscriptions/<your-subscription-id>"
# ドキュメントでは下記ロールを割り当てることとなっていますが、上記の Contributor ロールがないと追加するメンバーに対して権限の不足エラーになります。
$ az role definition list --name "05b1aaf9-00c9-477b-b0e8-2da660b78c51" --output json
[
  {
    "assignableScopes": [
      "/"
    ],
    "createdBy": null,
    "createdOn": "2025-10-24T20:19:57.394834+00:00",
    "description": "Role definition allowing read, write and delete access to Service Group Member relationship types",
    "id": "/subscriptions/<your-subscription-id>/providers/Microsoft.Authorization/roleDefinitions/05b1aaf9-00c9-477b-b0e8-2da660b78c51",
    "name": "05b1aaf9-00c9-477b-b0e8-2da660b78c51",
    "permissions": [
      {
        "actions": [
          "Microsoft.Relationships/serviceGroupMember/read",
          "Microsoft.Relationships/serviceGroupMember/write",
          "Microsoft.Relationships/serviceGroupMember/delete"
        ],
        "condition": null,
        "conditionVersion": null,
        "dataActions": [],
        "notActions": [],
        "notDataActions": []
      }
    ],
    "roleName": "Service Group Member Relationship Contributor",
    "roleType": "BuiltInRole",
    "type": "Microsoft.Authorization/roleDefinitions",
    "updatedBy": null,
    "updatedOn": "2025-10-24T20:19:57.394834+00:00"
  }
]

修復タスクを実行します。

az policy remediation create \
  --name "remediate-vm-sg-membership" \
  --policy-assignment "vm-resources-to-sg" \
  --management-group "<your-management-group-id>"

修復タスクが完了すると、目的のサービス グループに、タグ Purpose:Demo を持つリソースが自動的に追加されます。

サービス グループへの紐づけ完了

サービス グループの親子関係

既定では、ルート サービス グループが最上位にあり、その配下に各サービス グループを作成します。サービス グループを階層化することも可能です。これによって、ロールを子サービス グループに継承させることができます。

まとめ

サービス グループは個別に切り出したグループ単位で、監視や管理に特化した使い方になっていくかと思います。
今後コスト管理等、他の管理機能とも連携が進むことが期待されますので、引き続き注目していきましょう。

Build secure applications with Azure Policy and Service Groupsより抜粋

脚注
  1. Build secure applications with Azure Policy and Service Groups ↩︎

  2. MS Build セッション BRK198 ↩︎

GitHubで編集を提案

Discussion