你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

部署地理空间消费区

OSDU 地理空间消费区(GCZ)是一项服务,可增强地理空间数据的管理和利用率。 GCZ 简化了基于位置的信息的处理。 它使技术复杂性不再抽象化,让软件应用程序能够访问地理空间数据,而无需处理复杂的细节。 通过提供现成的地图服务,GCZ 有助于与已启用 OSDU 的应用程序无缝集成。

本指南介绍如何部署与 Azure 能源数据管理器 (ADME) 集成的地理空间消费区 (GCZ) 服务。

在 Microsoft Entra ID 中创建应用注册

要部署 GCZ,需要在 Microsoft Entra ID 中创建应用注册。 应用注册用于使用 Azure Data Manager for Energy 对 GCZ API 进行身份验证,以便能够生成地理空间数据的缓存。

  1. 有关如何创建应用注册的说明,请参阅“在 Microsoft Entra ID 中创建应用注册”。
  2. 授予应用注册权限,以读取 Azure Data Manager for Energy 中的相关数据。 有关进一步说明,请参阅“如何将成员添加到 OSDU 组”。

安装

GCZ 服务有两个主要部署选项:

  • Azure Kubernetes 服务 (AKS):在 AKS 群集上部署 GCZ 服务。 建议在生产环境中使用此部署选项。 设置、配置和维护时需要进行更多操作。
  • Windows:在 Windows 上部署 GCZ 服务。 对于开发和测试环境,建议使用此部署选项。

在 Azure Kubernetes 服务 (AKS) 上部署地理空间消费区域 (GCZ)

了解如何在 Azure Kubernetes 服务 (AKS) 上部署地理空间消费区域 (GCZ)。

先决条件

部署地理空间消费区 (GCZ) Helm 图表

  1. 将 GCZ 存储库克隆到本地环境:

    git clone https://community.opengroup.org/osdu/platform/consumption/geospatial.git
    
  2. 将目录切换到 geospatial 文件夹:

    cd geospatial/devops/azure/charts/geospatial
    
  3. 为部署定义变量:

    # Define the variables for Azure Data Manager for Energy
    AZURE_DNS_NAME="<instanceName>.energy.azure.com"  # Example: demo.energy.azure.com
    DATA_PARTITION_ID="<dataPartitionId>" # Data partition ID. Example: opendes
    AZURE_TENANT_ID="<tenantId>" # Entra ID tenant ID. Example: aaaabbbb-0000-cccc-1111-dddd2222eeee
    AZURE_CLIENT_ID="<clientId>" # App Registration client ID. Example: 00001111-aaaa-2222-bbbb-3333cccc4444
    AZURE_CLIENT_SECRET="<clientSecret>" # App Registration client secret. Example: Aa1Bb~2Cc3.-Dd4Ee5Ff6Gg7Hh8Ii9_Jj0Kk1Ll2
    SCOPE="<scope>" # Scope of the App Registration. Example: 00001111-aaaa-2222-bbbb-3333cccc4444/.default
    CALLBACK_URL="http://localhost:8080" # Redirect URI of the ADME App Registration (from scope) ie: http://localhost:8080
    PRIVATE_NETWORK="true" # Set to false if you want to expose the service publicly using a LoadBalancer. You can still expose the service using an Ingress Controller or Azure API Management at a later stage.
    
    # Define the variables for AKS
    AKS_NAME="<aksName>" # Name of the AKS cluster. Example: gcz-aks-cluster.
    RESOURCE_GROUP="<resourceGroupName>" # Name of the resource group. Example: gcz-rg.
    NAMESPACE="ignite" # Name of the AKS namespace you want to deploy to. We recommend to leave it default.
    GCZ_IGNITE_SERVICE="ignite-service" # Name of the ignite service. We recommend to leave it default.
    GCZ_IGNITE_NAMESPACE=$NAMESPACE
    CHART=osdu-gcz-service
    CHART_VERSION=1.27.0
    VERSION=0.27.0
    
  4. 创建 Helm 图表:

    cat > osdu_gcz_custom_values.yaml << EOF
    # This file contains the essential configs for the gcz on azure helm chart
    
    ################################################################################
    # Specify the values for each service.
    #
    global:
        ignite:
            namespace: $NAMESPACE
            name: ignite
            image:
                name: gridgain/community
                tag: 8.8.43
            configuration:
                gcz_ignite_namespace: "$GCZ_IGNITE_NAMESPACE"
                gcz_ignite_service: "$GCZ_IGNITE_SERVICE"
        provider:
            namespace: $NAMESPACE
            entitlementsGroupsURL: "https://$AZURE_DNS_NAME/api/entitlements/v2/groups"
            image:
                repository: community.opengroup.org:5555
                name: osdu/platform/consumption/geospatial/geospatial-provider-master
                tag: latest
            service:
                type: LoadBalancer
            configuration:
                privateNetwork: "$PRIVATE_NETWORK"
            configLoaderJs: "../../../../gcz-provider/gcz-provider-core/config/configLoader.js"
        transformer:
            namespace: $NAMESPACE
            image:
                repository: community.opengroup.org:5555
                name: osdu/platform/consumption/geospatial/geospatial-transformer-master
                tag: latest
            service:
                type: LoadBalancer
            configuration:
                privateNetwork: "$PRIVATE_NETWORK"
                datapartitionid: $DATA_PARTITION_ID
                clientId: $AZURE_CLIENT_ID
                tenantId: $AZURE_TENANT_ID
                callbackURL: $CALLBACK_URL
                scope: $SCOPE
                searchQueryURL: "https://$AZURE_DNS_NAME/api/search/v2/query"
                searchCursorURL: "https://$AZURE_DNS_NAME/api/search/v2/query_with_cursor"
                schemaURL: "https://$AZURE_DNS_NAME/api/schema-service/v1/schema"
                entitlementsURL: "https://$AZURE_DNS_NAME/api/entitlements/v2"
                fileRetrievalURL: "https://$AZURE_DNS_NAME/api/dataset/v1/retrievalInstructions"
                crsconvertorURL: "https://$AZURE_DNS_NAME/api/crs/converter/v3/convertTrajectory"
                storageURL: "https://$AZURE_DNS_NAME/api/storage/v2/records"
                clientSecret: $(echo "$AZURE_CLIENT_SECRET" | base64)
                gcz_ignite_namespace: "$GCZ_IGNITE_NAMESPACE"
                gcz_ignite_service: "$GCZ_IGNITE_SERVICE"
    EOF
    
  5. providertransformer 服务配置文件的服务类型更改为 LoadBalancer

    cat > ../provider/templates/service.yaml << EOF
    apiVersion: v1
    kind: Service
    metadata:
        name: gcz-provider
        namespace: {{ $.Values.global.provider.namespace }}
        annotations:
            service.beta.kubernetes.io/azure-load-balancer-internal: "{{ $.Values.global.provider.configuration.privateNetwork }}"
    spec:
        selector:
            app: provider
        ports:
        - port: 80
          protocol: TCP
          targetPort: 8083
        type: {{ $.Values.global.provider.service.type }}
    EOF
    
    cat > ../transformer/templates/service.yaml << EOF
    apiVersion: v1
    kind: Service
    metadata:
        name: gcz-transformer
        namespace: {{ $.Values.global.transformer.namespace }}
        annotations:
            service.beta.kubernetes.io/azure-load-balancer-internal: "{{ $.Values.global.transformer.configuration.privateNetwork }}"
    spec:
        selector:
            app: transformer
        ports:
        - port: 80
          protocol: TCP
          targetPort: 8080
        type: {{ $.Values.global.transformer.service.type }}
    EOF
    
  6. 查看转换器配置文件 application.yml,以确保包含正确的架构。

    nano ../transformer/application.yml
    
  7. 查看提供程序配置文件 koop-config.json

    nano ../provider/koop-config.json
    
  8. 向 Azure Kubernetes 服务 (AKS) 群集进行身份验证:

    az aks get-credentials --resource-group $RESOURCE_GROUP --name $AKS_NAME --admin
    
  9. 创建 AKS 命名空间:

    kubectl create namespace $NAMESPACE
    
  10. 部署 HELM 依赖项:

    helm dependency build
    
  11. 部署 GCZ HELM 图表:

    helm upgrade -i $CHART . -n $NAMESPACE -f osdu_gcz_custom_values.yaml
    
  12. 验证部署:

    kubectl get pods -n $NAMESPACE
    

    现在,你应会看到 igniteprovidertransformer 服务的 Pod。

  13. 接下来,请记下 providertransformer 服务的外部 IP。

    kubectl get service -n $NAMESPACE
    

    这些 IP 用于连接到 GCZ API 终结点。

重要

如果要更新配置文件(例如 application.ymlkoop-config.json),则必须更新 AKS 配置 (configmap),然后删除 providertransformer 服务的现有 Pod。 将使用新配置重新创建 Pod。 如果使用 GCZ API 更改配置,则 Pod 重启后不会保留更改。

在 Windows 虚拟机上部署地理空间消耗区域 (GCZ)

了解如何在 Windows 上部署地理空间消费区域 (GCZ)。 建议将此部署选项用于开发和测试环境,因为它更易于设置和配置,并且需要的维护更少。

先决条件

在 Windows 上部署 GCZ

  1. 连接到 Windows 虚拟机。

  2. 从 OSDU GitLab 存储库下载以下文件:

    1. GCZ 提供程序
    2. GCZ 转换器
    3. Python 依赖项
  3. 以管理员身份打开 Powershell 并导航到下载代码的目录。

  4. 运行以下命令以提取文件:

    Expand-Archive -Path .\GCZ_PROVIDER.zip -DestinationPath C:\gcz\
    Expand-Archive -Path .\GCZ_TRANSFORMER.zip -DestinationPath C:\gcz\
    Expand-Archive -Path .\GCZ_PYTHON_DEPENDENCIES.zip -DestinationPath C:\gcz\
    
  5. 配置环境变量:

    $ADME_HOSTNAME = "<adme-hostname>" # ADME Hostname, e.g. "https://contoso.energy.azure.com"
    $GCZ_DATA_PARTITION_ID = "<data-partition-id>" # ADME Data Partition ID, e.g. "opendes"
    $GCZ_QUERY_URL = "$ADME_HOSTNAME/api/search/v2/query" # ADME Query Endpoint
    $GCZ_QUERY_CURSOR_URL = "$ADME_HOSTNAME/api/search/v2/query_with_cursor" # ADME Query with Cursor Endpoint
    $GCZ_SCHEMA_URL = "$ADME_HOSTNAME/api/schema-service/v1/schema" # ADME Schema Endpoint
    $GCZ_ENTITLEMENT_SERVICE_URL = "$ADME_HOSTNAME/api/entitlements/v2" # ADME Entitlement Service Endpoint
    $GCZ_FILE_RETRIEVAL_URL = "$ADME_HOSTNAME/api/dataset/v1/retrievalInstructions" # ADME File Retrieval Endpoint
    $GCZ_CONVERT_TRAJECTORY_URL = "$ADME_HOSTNAME/api/crs/converter/v3/convertTrajectory" # ADME Convert Trajectory Endpoint
    $GCZ_STORAGE_URL = "$ADME_HOSTNAME/api/storage/v2/records/" # ADME Storage Endpoint
    

    有关更多环境变量,请参阅 OSDU GitLab 文档

  6. 通过在文本编辑器中打开配置文件并根据需要更新值来验证 GCZ 提供程序和转换器的配置文件。

    • 提供程序:C:\gcz\gcz-provider\gcz-provider-core\config\koop-config.json
    • 转换器:C:\gcz\gcz-transformer-core\config\application.yml

    重要

    如果对配置文件中的架构进行更改,则必须确保在这两个配置文件中都表示了这些架构。

  7. (可选)安装 Python 依赖项(仅适用于 Well 日志内插)。

    pip install -r C:\gcz\gcz-transformer-core\src\main\resources\script\requirements.txt --no-index --find-links python-dependencies
    
  8. 启动 GCZ 转换器。

    C:\gcz\transformer\transformer.bat local
    
  9. 生成 GCZ 提供程序。

    cd C:\gcz\gcz-provider\gcz-provider-core
    npm install
    npm start
    

默认情况下,提供程序在 http://localhost:8083 上侦听,转换器在 http://localhost:8080 上侦听。

公开发布 GCZ API(可选)

如果要公开 GCZ API,可以使用 Azure API Management (APIM)。 Azure API Management 允许我们安全地向 Internet 公开 GCZ 服务,因为 GCZ 服务尚未内置身份验证和授权。 通过 APIM,我们可以添加策略来保护、监视和管理 API。

先决条件

重要

需要将 Azure API Management 实例注入到可路由到 AKS 群集的虚拟网络中,以便能够与 GCZ API 通信。

将 GCZ API 添加到 Azure API Management

下载 GCZ OpenAPI 规范

  1. 将两个 OpenAPI 规范下载到本地计算机。

  2. 在文本编辑器中打开每个 OpenAPI 规范文件,并将 servers 部分替换为 AKS GCZ 服务负载均衡器的相应 IP。

    servers:
      - url: "http://<GCZ-Service-LoadBalancer-IP>/ignite-provider"
    

将 GCZ API 添加到 Azure API Management

  1. Azure 门户中导航到自己的 Azure API Management 服务。

  2. 在左侧导航窗格中,选择“API”。

  3. 选择“+ 添加 API”。

  4. 选择 OpenAPI

  5. 选择“选择文件”并上传 gcz-openapi-provider.yaml 文件。

  6. 在“API URL 后缀”字段中,输入 ignite-provider

  7. 选择创建

  8. 重复 gcz-openapi-transformer.yaml 文件的步骤,但使用 gcz/transformer/admin 作为“API URL 后缀”。

    将 GCZ API 添加到 APIM

配置策略

接下来,我们需要配置策略来验证 JSON Web 令牌 (JWT)。

需要以下信息:

  • 您的 Microsoft Entra ID 租户 ID。
  • Azure Data Manager for Energy 客户端 ID(或令牌颁发客户端 ID(如果是单独的))。

注意

如果有多个应用注册颁发令牌,则可以将多个 <application-id> 元素添加到 <client-application-ids> 元素。

  1. 在新创建的 Geospatial Consumption Zone - Provider API 中,请确保选中“所有操作”。

  2. 在“入站处理”下,选择“...”,然后选择“代码编辑器”。

  3. 在编辑器中粘贴以下策略定义:

    <policies>
        <!-- Throttle, authorize, validate, cache, or transform the requests -->
        <inbound>
            <base />
            <validate-azure-ad-token tenant-id="%tenant-id%" failed-validation-httpcode="401">
            <client-application-ids>
                <application-id>%client-id%</application-id>
            </client-application-ids>
        </inbound>
        <!-- Control if and how the requests are forwarded to services  -->
        <backend>
            <base />
        </backend>
        <!-- Customize the responses -->
        <outbound>
            <base />
        </outbound>
        <!-- Handle exceptions and customize error responses  -->
        <on-error>
            <base />
        </on-error>
    </policies>
    
  4. %tenant-id% 替换为 Microsoft Entra ID 租户 ID,并将 %client-id% 替换为 Azure Data Manager for Energy 客户端 ID。

  5. 选择“保存”。

  6. 重复 Geospatial Consumption Zone - Transformer API 的相关步骤。

测试 GCZ 服务

  1. OSDU GitLab 下载 API 客户端集合,并将其导入到所选 API 客户端(例如 Bruno、Postman)中。

  2. 将以下环境变量添加到 API 客户端:

    • PROVIDER_URL - GCZ 提供程序 API 的 URL。
    • AMBASSADOR_URL - GCZ 转换器 API 的 URL。
    • access_token - 有效的 ADME 访问令牌。
  3. 若要验证 GCZ 是否按预期工作,请在集合中运行 API 调用。

后续步骤

这样就可以在成功部署 GCZ 后执行以下操作:

  • 使用来自 OSDU GitLab 的 GCZ WebApps 可视化 GCZ 数据。

重要

GCZ WebApps 目前正在开发中,不支持身份验证。 建议在专用网络中部署 WebApps,并使用 Azure 应用程序网关或 Azure Front Door 公开 WebApps 以启用身份验证和授权功能。

还可以将数据引入 Azure Data Manager for Energy 实例:

参考

  • 有关地理空间消费区域的信息,请参阅 OSDU GitLab