App Topology API を使用する

REST API または Google Cloud CLI を使用して、 Google Cloud 全体でデータを関連付けるクエリをプログラムで実行できます。

概要

App Topology API クエリを実行すると、API はクエリに一致するグラフノード(リソース)とエッジ(関係)のリストを返します。アプリトポロジは、次のような Google Cloud サービス全体のデータを結合します。

  • Cloud Asset Inventory、App Hub、Agent Registry のリソース メタデータ
  • コンテナ イメージの Git commit やビルドの来歴などのデプロイ データ
  • 脆弱性や Identity and Access Management(IAM)の所有権など、Security Command Center のセキュリティ データ
  • トレースやアラートなどの Google Cloud Observability データ

クエリを実行するには、次の情報が必要です。

  • クエリを実行するドメイン。SRE ドメインには、サポートされているすべてのデータが含まれます。利用可能なドメインの一覧表示については、ドメインの一覧表示をご覧ください。
  • クエリに含めることができるサポートされているグラフノード、エッジ、プロパティ。ドメインのスキーマ全体または一部を取得できます。詳細については、スキーマを取得するをご覧ください。
  • 検索するノードとエッジを含むクエリ パターン。クエリを実行するをご覧ください。

始める前に

  1. アプリ トポロジを設定します。

  2. このページのサンプルをどのように使うかに応じて、タブを選択してください。

    gcloud

    Google Cloud コンソールで Cloud Shell をアクティブにします。

    Cloud Shell をアクティブにする

    Google Cloud コンソールの下部で Cloud Shell セッションが開始し、コマンドライン プロンプトが表示されます。Cloud Shell はシェル環境です。Google Cloud CLI がすでにインストールされており、現在のプロジェクトの値もすでに設定されています。セッションが初期化されるまで数秒かかることがあります。

    REST

    このページの REST API サンプルをローカル開発環境で使用するには、gcloud CLI に指定した認証情報を使用します。

      Google Cloud CLI をインストールします。

      外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。

    詳細については、 Google Cloud 認証ドキュメントの REST を使用して認証するをご覧ください。

    本番環境での認証の設定については、 Google Cloud 認証ドキュメントの Google Cloudで実行されるコードのアプリケーションのデフォルト認証情報を設定する をご覧ください。

必要なロール

App Topology API の使用に必要な権限を取得するには、次の IAM ロールを付与するよう管理者に依頼してください。

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

これらの事前定義ロールには、App Topology API の使用に必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。

必要な権限

App Topology API を使用するには、次の権限が必要です。

  • ドメインを取得する:
    • apptopology.domains.get
    • apptopology.domains.list
  • スキーマを取得します: apptopology.schemas.get
  • 検出されたリソースデータを取得します。 apptopology.discoveredResourcesTopologies.generate
  • DevOps ドメインのデータを取得します。 apptopology.devOpsDomainTopologies.generate
  • セキュリティ ドメインのデータを取得します。 apptopology.securityDomainTopologies.generate
  • SRE ドメインのデータ(サポートされているすべてのデータ)を取得します。 apptopology.sreDomainTopologies.generate

カスタムロールや他の事前定義ロールを使用して、これらの権限を取得することもできます。

ドメインを一覧表示する

ドメインは、特定のタイプのクエリに焦点を当てたリソースデータのセットです。

  • アプリトポロジでサポートされているすべてのデータをクエリするには、SRE ドメインを使用します。
  • エージェント リソースに関するデータを取得するには、SRE ドメインを使用する必要があります。
  • このドキュメントのリクエスト レスポンスの例はすべて、SRE ドメインを使用しています。

必要に応じて、プロジェクトで使用可能なドメインを一覧表示できます。

gcloud

ドメインを一覧表示する

後述のコマンドデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: プロジェクト ID

gcloud app-topology domains list コマンドを実行します。

Linux、macOS、Cloud Shell

gcloud app-topology domains list --project=PROJECT_ID

Windows(PowerShell)

gcloud app-topology domains list --project=PROJECT_ID

Windows(cmd.exe)

gcloud app-topology domains list --project=PROJECT_ID

次のようなレスポンスが返されます。

NAME
DEVOPS
SECURITY
SRE

REST

ドメインを一覧表示する

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: プロジェクト ID

HTTP メソッドと URL:

GET https://apptopology.googleapis.com/v1/projects/PROJECT_ID/locations/global/domains

リクエストを送信するには、次のいずれかのオプションを展開します。

次のような JSON レスポンスが返されます。

{
  "domains": [
    {
      "name": "projects/PROJECT_ID/locations/global/domains/DEVOPS"
    },
    {
      "name": "projects/PROJECT_ID/locations/global/domains/SECURITY"
    },
    {
      "name": "projects/PROJECT_ID/locations/global/domains/SRE"
    }
  ]
}

スキーマを取得する

クエリの作成を支援するため、ドメインでサポートされているすべてのノード、エッジ、プロパティのリストを取得できます。REST API を使用して、スキーマの一部を取得することもできます。

スキーマ内のアイテム数が多いため、スキーマ全体のリクエストは、スキーマの一部に対するリクエストよりも大幅に時間がかかることがあります。

完全なスキーマを取得する

gcloud

完全なスキーマを取得する

後述のコマンドデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: プロジェクト ID
  • DOMAIN: クエリするドメイン。SRE ドメインには、サポートされているすべてのデータが含まれます。

gcloud app-topology domains schema describe コマンドを実行します。

Linux、macOS、Cloud Shell

gcloud app-topology domains schema describe DOMAIN --project=PROJECT_ID

Windows(PowerShell)

gcloud app-topology domains schema describe DOMAIN --project=PROJECT_ID

Windows(cmd.exe)

gcloud app-topology domains schema describe DOMAIN --project=PROJECT_ID

次のレスポンスの抜粋例には、ノードタイプ、エッジタイプ、エッジルール、ラベル プロパティのスキーマの最初の項目のみが含まれています。

{
  "nodeTypes": [
    {
      "type": "Base/compute.googleapis.com/UrlMap",
      "labels": [
        "Base/Resource",
        "Base/compute.googleapis.com/UrlMap"
      ],
      "description": "Represents a Compute UrlMap."
    }
  ],
  "edgeTypes": [
    {
      "type": "Observability/SENDS_TRAFFIC/Base/geminidataanalytics.googleapis.com/DataAgent:Base/apps.k8s.io/DaemonSet",
      "labels": [
        "Observability/SENDS_TRAFFIC"
      ]
    }
  ],
  "labelProperties": [
    {
      "label": "Base/compute.googleapis.com/InstanceSettings",
      "description": "Classifies a node as a Compute Instance Settings."
    }
  ],
  "edgeRules": [
    {
      "edgeType": "Observability/SENDS_TRAFFIC/Base/geminidataanalytics.googleapis.com/DataAgent:Base/apps.k8s.io/DaemonSet",
      "srcNodeType": "Base/geminidataanalytics.googleapis.com/DataAgent",
      "destNodeType": "Base/apps.k8s.io/DaemonSet"
    }
  ]
}

REST

完全なスキーマを取得する

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: プロジェクト ID
  • DOMAIN: クエリするドメイン。SRE ドメインには、サポートされているすべてのデータが含まれます。

HTTP メソッドと URL:

GET https://apptopology.googleapis.com/v1/projects/PROJECT_ID/locations/global/domains/DOMAIN/schema

リクエストを送信するには、次のいずれかのオプションを展開します。

次のレスポンスの抜粋例には、ノードタイプ、エッジタイプ、エッジルール、ラベル プロパティのスキーマの最初の項目のみが含まれています。

{
  "nodeTypes": [
    {
      "type": "Base/compute.googleapis.com/UrlMap",
      "labels": [
        "Base/Resource",
        "Base/compute.googleapis.com/UrlMap"
      ],
      "description": "Represents a Compute UrlMap."
    }
  ],
  "edgeTypes": [
    {
      "type": "Observability/SENDS_TRAFFIC/Base/geminidataanalytics.googleapis.com/DataAgent:Base/apps.k8s.io/DaemonSet",
      "labels": [
        "Observability/SENDS_TRAFFIC"
      ]
    }
  ],
  "labelProperties": [
    {
      "label": "Base/compute.googleapis.com/InstanceSettings",
      "description": "Classifies a node as a Compute Instance Settings."
    }
  ],
  "edgeRules": [
    {
      "edgeType": "Observability/SENDS_TRAFFIC/Base/geminidataanalytics.googleapis.com/DataAgent:Base/apps.k8s.io/DaemonSet",
      "srcNodeType": "Base/geminidataanalytics.googleapis.com/DataAgent",
      "destNodeType": "Base/apps.k8s.io/DaemonSet"
    }
  ]
}

部分スキーマを取得する

指定した開始ラベルから指定したホップ数以内のドメイン スキーマの一部を取得できます。

これらの手順のコマンド例では、Base/Agent ノードから始まるスキーマの一部を取得します。深さは 1、ページサイズは 5 です。

部分スキーマを取得する

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: プロジェクト ID
  • DOMAIN: クエリするドメイン。SRE ドメインには、サポートされているすべてのデータが含まれます。

HTTP メソッドと URL:

POST https://apptopology.googleapis.com/v1/projects/PROJECT_ID/locations/global/domains/DOMAIN/schema:explore

リクエストの本文(JSON):

{
  "startLabels": [
    "Base/Agent"
  ],
  "depth": 1,
  "pageSize": 5
}

リクエストを送信するには、次のいずれかのオプションを展開します。

レスポンスでは、nodeTypes と edgeTypes の順序は一貫していますが、labelProperties の順序はリクエストごとに異なる場合があります。

[レスポンス] 見出しを開いて、レスポンスの例を確認します。

クエリを実行する

クエリを実行するときに、検索するノード、エッジ、プロパティを含むクエリ パターンを指定します。

クエリ パターンは、AIP-160 フィルタリング構文に基づいています。クエリ パターンとクエリの制限の概要については、クエリについてをご覧ください。この手順は、クエリの構造と制限事項に関する情報を読んでいることを前提としています。

次の手順では、指定されたプロジェクト内のすべての App Hub サービスとワークロード(登録済み(Base/apphub.googleapis.com/Service、Base/apphub.googleapis.com/Workload)と検出済み(Base/DiscoveredService、Base/DiscoveredWorkload)を含む)のクエリの例を使用します。

コマンドは、JSON ファイルでクエリ パターンを指定します。これらの手順では、gcloud CLI と REST リクエストでファイルが若干異なります。

  • gcloud CLI の場合は、クエリするドメインをコマンドのパラメータとして指定します。ドメインがクエリ パターン ファイルに含まれていない。
  • REST リクエストの場合は、リクエストの JSON 本文でドメインとクエリ パターンの両方を指定します。topologyDomains フィールドでドメインを設定し、filter オブジェクトでクエリ パターンを指定します。

gcloud

トポロジを生成する

後述のコマンドデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: プロジェクト ID
  • DOMAIN: クエリするドメイン。SRE ドメインには、サポートされているすべてのデータが含まれます。

次の内容を request.json という名前のファイルに保存します。

{
  "startingNode": {
    "alias": "sw",
    "labelPropertiesPattern": {
      "labelMatcherExpr": "Base/apphub.googleapis.com/Service OR Base/apphub.googleapis.com/Workload OR Base/DiscoveredService OR Base/DiscoveredWorkload"
    }
  }
}

gcloud app-topology resources-graph generate コマンドを実行します。

Linux、macOS、Cloud Shell

gcloud app-topology resources-graph generate --domains=DOMAIN --project=PROJECT_ID --pattern-file=request.json --format=json

Windows(PowerShell)

gcloud app-topology resources-graph generate --domains=DOMAIN --project=PROJECT_ID --pattern-file=request.json --format=json

Windows(cmd.exe)

gcloud app-topology resources-graph generate --domains=DOMAIN --project=PROJECT_ID --pattern-file=request.json --format=json

次のレスポンス例の抜粋は、最初の 2 つのノードを示しています。これらのノードは MCP サーバーです。Google MCP サーバーには Base/DiscoveredService というラベルが付いています。これは、クエリ パターンのラベルの 1 つです。

出力では、次の変数は PROJECT_ID で指定したプロジェクトに関連付けられた値を表します。

  • PROJECT_NUMBER - 指定されたプロジェクトのプロジェクト番号。
  • ORGANIZATION_NUMBER - 指定されたプロジェクトを含む Google Cloud 組織の組織番号。
{
  "graph": {
    "nodes": [
      {
        "properties": {
          "project": "projects/PROJECT_NUMBER",
          "Base/location": "global",
          "createTime": "2026-08-13T15:14:53.477680Z",
          "Base/agentregistry/urn": "urn:mcp:googleapis.com:projects:PROJECT_NUMBER:locations:global:storage",
          "Base/resourceType": "agentregistry.googleapis.com/GoogleMcpServer",
          "organization": "organizations/ORGANIZATION_NUMBER"
        },
        "name": "urn:mcp:googleapis.com:projects:PROJECT_NUMBER:locations:global:storage",
        "labels": [
          "Base/MCPServer",
          "Base/DiscoveredService",
          "Base/Resource",
          "Base/agentregistry.googleapis.com/GoogleMcpServer"
        ],
        "context": {
          "type": "Base/agentregistry.googleapis.com/GoogleMcpServer"
        }
      },
      {
        "properties": {
          "createTime": "2026-08-13T16:22:24.732600Z",
          "Base/resourceType": "agentregistry.googleapis.com/GoogleMcpServer",
          "Base/agentregistry/urn": "urn:mcp:googleapis.com:projects:PROJECT_NUMBER:locations:global:pubsub",
          "Base/location": "global",
          "organization": "organizations/ORGANIZATION_NUMBER",
          "project": "projects/PROJECT_NUMBER"
        },
        "name": "urn:mcp:googleapis.com:projects:PROJECT_NUMBER:locations:global:pubsub",
        "labels": [
          "Base/agentregistry.googleapis.com/GoogleMcpServer",
          "Base/Resource",
          "Base/DiscoveredService",
          "Base/MCPServer"
        ],
        "context": {
          "type": "Base/agentregistry.googleapis.com/GoogleMcpServer"
        }
      }
    ]
  }
}

REST

トポロジを生成する

リクエストのデータを使用する前に、次のように置き換えます。

  • PROJECT_ID: プロジェクト ID
  • DOMAIN: クエリするドメイン。SRE ドメインには、サポートされているすべてのデータが含まれます。

HTTP メソッドと URL:

POST https://apptopology.googleapis.com/v1/projects/PROJECT_ID/locations/global/discoveredResourcesTopology:generate

リクエストの本文(JSON):

{
  "topologyDomains": [
    "projects/PROJECT_ID/locations/global/domains/DOMAIN"
  ],
  "filter": {
    "startingNode": {
      "alias": "sw",
      "labelPropertiesPattern": {
        "labelMatcherExpr": "Base/apphub.googleapis.com/Service OR Base/apphub.googleapis.com/Workload OR Base/DiscoveredService OR Base/DiscoveredWorkload"
      }
    }
  }
}

リクエストを送信するには、次のいずれかのオプションを展開します。

次のレスポンス例の抜粋は、最初の 2 つのノードを示しています。これらのノードは MCP サーバーです。Google MCP サーバーには Base/DiscoveredService というラベルが付いています。これは、クエリ パターンのラベルの 1 つです。

出力では、次の変数は PROJECT_ID で指定したプロジェクトに関連付けられた値を表します。

  • PROJECT_NUMBER - 指定されたプロジェクトのプロジェクト番号。
  • ORGANIZATION_NUMBER - 指定されたプロジェクトを含む Google Cloud 組織の組織番号。
{
  "graph": {
    "nodes": [
      {
        "properties": {
          "project": "projects/PROJECT_NUMBER",
          "Base/location": "global",
          "createTime": "2026-08-13T15:14:53.477680Z",
          "Base/agentregistry/urn": "urn:mcp:googleapis.com:projects:PROJECT_NUMBER:locations:global:storage",
          "Base/resourceType": "agentregistry.googleapis.com/GoogleMcpServer",
          "organization": "organizations/ORGANIZATION_NUMBER"
        },
        "name": "urn:mcp:googleapis.com:projects:PROJECT_NUMBER:locations:global:storage",
        "labels": [
          "Base/MCPServer",
          "Base/DiscoveredService",
          "Base/Resource",
          "Base/agentregistry.googleapis.com/GoogleMcpServer"
        ],
        "context": {
          "type": "Base/agentregistry.googleapis.com/GoogleMcpServer"
        }
      },
      {
        "properties": {
          "createTime": "2026-08-13T16:22:24.732600Z",
          "Base/resourceType": "agentregistry.googleapis.com/GoogleMcpServer",
          "Base/agentregistry/urn": "urn:mcp:googleapis.com:projects:PROJECT_NUMBER:locations:global:pubsub",
          "Base/location": "global",
          "organization": "organizations/ORGANIZATION_NUMBER",
          "project": "projects/PROJECT_NUMBER"
        },
        "name": "urn:mcp:googleapis.com:projects:PROJECT_NUMBER:locations:global:pubsub",
        "labels": [
          "Base/agentregistry.googleapis.com/GoogleMcpServer",
          "Base/Resource",
          "Base/DiscoveredService",
          "Base/MCPServer"
        ],
        "context": {
          "type": "Base/agentregistry.googleapis.com/GoogleMcpServer"
        }
      }
    ]
  }
}

その他のクエリパターンの例については、クエリパターンの例をご覧ください。

クエリパターンの例

次のクエリパターン例は、クエリの実行用の独自のクエリパターンを作成する際に役立ちます。このセクションの例はすべて JSON 形式を使用しています。

インスタンス グループ、ネットワーク、ディスクを含む VM

ネットワーキングとディスクを含むインスタンス グループ内の Compute Engine インスタンスをクエリします。

パターンは Base/compute.googleapis.com/Instance で始まり、最上位の neighbors オブジェクトの下に 3 つの主要な edge ブランチがあり、これらの条件を定義します。

  • マネージド インスタンス グループに属するインスタンス
  • 接続されたネットワークを持つインスタンス
  • Persistent Disk を使用するインスタンス

ブランチは AND と結合されるため、レスポンスには、マネージド インスタンス グループに属し、ネットワークとディスクの両方を持つインスタンスのみが含まれます。

{
  "startingNode": {
    "alias": "instance",
    "labelPropertiesPattern": {
      "labelMatcherExpr": "Base/compute.googleapis.com/Instance"
    }
  },
  "neighbors": [
    {
      "edge": {
        "direction": "FROM",
        "labelPropertiesPattern": {
          "labelMatcherExpr": "CONTAINS"
        }
      },
      "graph": {
        "startingNode": {
          "alias": "instance_group",
          "labelPropertiesPattern": {
            "labelMatcherExpr": "Base/compute.googleapis.com/InstanceGroup"
          }
        },
        "neighbors": [
          {
            "edge": {
              "direction": "FROM",
              "labelPropertiesPattern": {
                "labelMatcherExpr": "DEPENDS_ON"
              }
            },
            "graph": {
              "startingNode": {
                "alias": "instance_group_manager",
                "labelPropertiesPattern": {
                  "labelMatcherExpr": "Base/compute.googleapis.com/InstanceGroupManager"
                }
              }
            }
          }
        ]
      }
    },
    {
      "edge": {
        "direction": "TO",
        "labelPropertiesPattern": {
          "labelMatcherExpr": "DEPENDS_ON"
        }
      },
      "graph": {
        "startingNode": {
          "alias": "network",
          "labelPropertiesPattern": {
            "labelMatcherExpr": "Base/compute.googleapis.com/Network"
          }
        }
      }
    },
    {
      "edge": {
        "direction": "TO",
        "labelPropertiesPattern": {
          "labelMatcherExpr": "DEPENDS_ON"
        }
      },
      "graph": {
        "startingNode": {
          "alias": "disk",
          "labelPropertiesPattern": {
            "labelMatcherExpr": "Base/compute.googleapis.com/Disk"
          }
        }
      }
    }
  ]
}

エージェント リソース

エージェント、MCP サーバー、エンドポイント、スキルなどのデータを含む、Agent Registry の情報を使用して、エージェント リソースとその関係をクエリします。

{
  "startingNode": {
    "alias": "resource",
    "labelPropertiesPattern": {
      "labelMatcherExpr": "Base/Agent OR Base/MCPServer OR Base/agentregistry.googleapis.com/Skill OR Base/agentregistry.googleapis.com/SkillRevision OR Base/agentregistry.googleapis.com/AiApplication OR Base/agentregistry.googleapis.com/GoogleMcpServer OR Base/agentregistry.googleapis.com/McpEnablement OR Base/agentregistry.googleapis.com/Publisher OR Base/agentregistry.googleapis.com/Binding OR Base/agentregistry.googleapis.com/Service OR Base/aiplatform.googleapis.com/Endpoint"
    }
  }
}

アプリ トポロジは、次の 2 種類のエンドポイントをサポートしています。

  • Base/aiplatform.googleapis.com/Endpoint は、Gemini Enterprise Agent Platform のモデル エンドポイントです。
  • Base/Endpoint はエージェントのターゲット URL であり、Agent Registry サービス(Base/agentregistry.googleapis.com/Service)のラベルです。Base/agentregistry.googleapis.com/Service はクエリ パターンに含まれているため、Agent Endpoint はクエリ レスポンス結果に含まれます。

エージェントのトラフィック

Cloud Trace のデータを使用して、エージェントと他のエージェントまたは MCP サーバー間のトラフィックをクエリします。各エッジには、エラー率と p95 レイテンシ データが含まれます。

{
  "startingNode": {
    "alias": "agent",
    "labelPropertiesPattern": {
      "labelMatcherExpr": "Base/Agent"
    }
  },
  "neighbors": [
    {
      "edge": {
        "direction": "ANY",
        "labelPropertiesPattern": {
          "labelMatcherExpr": "Observability/SENDS_TRAFFIC"
        }
      },
      "graph": {
        "startingNode": {
          "alias": "peer",
          "labelPropertiesPattern": {
            "labelMatcherExpr": "Base/Agent OR Base/MCPServer"
          }
        }
      }
    }
  ]
}

次のステップ