SAP BDC のボーダーレス Lakehouse のトラブルシューティング

このページでは、SAP Business Data Cloud(BDC)を BigQuery と統合する際に発生する一般的な問題を解決する方法について説明します。ボーダーレス Lakehouse を使用した SAP から Google Cloud への(連携)ワークフローについては、ボーダーレス Lakehouse のトラブルシューティング ページをご覧ください。

テーブルのクエリ時に NOT_FOUND エラーまたは PERMISSION_DENIED エラーが発生する

この問題は、SAP BDC 側でアクセス権が取り消された場合に発生します。影響を受けるテーブルに対するクエリは失敗し、Delta Sharing エンドポイントから「見つかりません」または「権限が拒否されました」というエラーが返されます。

この問題を解決するには、SAP 管理者と協力してテーブルへのアクセス権を復元します。SAP のアクセス管理の詳細については、SAP のドキュメントの Working with Data Products in SAP Business Data Cloud Connect をご覧ください。

SAP BDC テーブルにデータを書き込めない

この問題は、BigQuery から SAP BDC テーブルのデータの書き込みまたは変更を試みたときに発生します。この統合により、SAP BDC データへの読み取り専用アクセスが可能になります。

この問題を解決するには、SAP BDC でデータを直接変更します。

Delta Sharing API 呼び出しに対する予期しない料金

この問題は、Lakehouse カタログが SAP BDC と同期する頻度が高すぎる場合に発生することがあります。この場合、Delta Sharing API が呼び出されて、テーブルのリストが取得され、テーブルのメタデータが取得されます。これらの API 呼び出しは、Lakehouse クラス A オペレーションとして課金されます。

この問題を解決するには、カタログの更新間隔を増やして API 呼び出しの頻度を減らします。料金の詳細については、Lakehouse の料金をご覧ください。

SAP が公開済みテーブルを見つけられない、またはクエリできない

この問題は、SAP BDC で必要な Apache Iceberg メタデータが Cloud Storage バケットで正しく生成されていない場合に発生することがあります。

この問題を解決するには、テーブルをバックアップするストレージ パスに想定されるメタデータ ファイルが存在することを確認します。

  1. テーブルの metadata フォルダの内容を一覧表示します。

    gcloud storage ls "gs://BUCKET_NAME/NAMESPACE_NAME/TABLE_NAME/metadata/"
  2. 出力に次の標準の Apache Iceberg メタデータ ファイルが含まれていることを確認します。

    • version-hint.txt
    • v*.metadata.json
    • マニフェスト ファイル(.avro)。これらのファイルがない場合は、Iceberg REST カタログの構成または BigQuery の書き込みオペレーションを確認して、データとメタデータがストレージ バケットに正常にマテリアライズされていることを確認します。

主キーまたは null 許容フィールドがないというエラーでテーブルのパブリッシュが失敗する

この問題は、Apache Iceberg カタログまたはデータ プロダクトを SAP BDC に公開するときに、カタログまたはデータ プロダクト内のテーブルの Iceberg メタデータに主キーが定義されていない場合、または主キー列の 1 つが null 許容(required: false)として定義されている場合に発生します。

この場合、公開は次のいずれかのエラーで失敗します。

  • INVALID_ARGUMENT: Failed to generate Core Schema Notation (CSN) payload: Table 'TABLE_NAME' must have a primary key constraint to be published to SAP.
  • INVALID_ARGUMENT: Field COLUMN_NAME is not required, but is referenced in the identifier-field-ids property.

SAP BDC では、公開されたすべてのテーブルで、Iceberg メタデータの identifier-field-ids を使用して主キー制約を定義する必要があります。Apache Iceberg 仕様に従って、identifier-field-ids で指定されたすべての列も、null 許容でない(required: true)として構成する必要があります。

この問題を解決するには、BigLake Iceberg REST API を使用してアトミック スキーマ更新を実行し、主キー列を required: true としてマークして、identifier-field-ids でフィールド ID を指定します。

  1. 認可用のアクセス トークンを取得します。

    TOKEN=$(gcloud auth application-default print-access-token)
  2. Python を使用して Iceberg REST スキーマ更新コミットを送信します。

    import requests
    
    headers = {
        "Authorization": f"Bearer {TOKEN}",
        "x-goog-user-project": "PROJECT_ID",
        "X-Iceberg-Access-Delegation": "vended-credentials",
        "Content-Type": "application/json",
    }
    url = "https://biglake.googleapis.com/iceberg/v1/restcatalog/v1/projects/PROJECT_ID/catalogs/ICEBERG_CATALOG_ID/namespaces/NAMESPACE_NAME/tables/TABLE_NAME"
    
    # 1. Fetch current metadata
    meta = requests.get(url, headers=headers).json()["metadata"]
    schema = meta["schemas"][0].copy()
    schema["fields"] = [f.copy() for f in schema["fields"]]
    
    # 2. Mark primary key column as required (non-nullable) and set identifier-field-ids
    for f in schema["fields"]:
      if f["name"] == "PRIMARY_KEY_COLUMN_NAME":
        f["required"] = True
    schema["identifier-field-ids"] = [PRIMARY_KEY_FIELD_ID]
    schema["schema-id"] = meta.get("last-schema-id", 0) + 1
    
    # 3. Commit the updated schema
    update_payload = {
        "requirements": [{"type": "assert-table-uuid", "uuid": meta["table-uuid"]}],
        "updates": [
            {
                "action": "add-schema",
                "schema": schema,
                "last-column-id": meta.get("last-column-id", 0),
            },
            {"action": "set-current-schema", "schema-id": -1},
        ],
    }
    response = requests.post(url, headers=headers, json=update_payload)
    response.raise_for_status()

    次のように置き換えます。

    • PROJECT_ID: 実際の Google Cloud プロジェクト ID。
    • ICEBERG_CATALOG_ID: Iceberg REST カタログ ID。
    • NAMESPACE_NAME: Iceberg Namespace の名前。
    • TABLE_NAME: Iceberg テーブル名。
    • PRIMARY_KEY_COLUMN_NAME: 主キーとして設定する列の名前。
    • PRIMARY_KEY_FIELD_ID: 主キー列の整数フィールド ID(例: 1)。

SAP に対するクエリが権限エラーまたは「見つからない」エラーで失敗する

この問題は、カタログまたはデータ プロダクトが SAP BDC に公開された後に、BigQuery でアクセス権が取り消されたり、権限が変更されたりした場合に発生することがあります。影響を受けるテーブルに対するクエリは、通常、BigQuery から発生した「見つかりません」または「権限が拒否されました」というエラーで、SAP 側で失敗します。

この問題を解決するには、Workload Identity 連携プリンシパルに必要なロール(BigLake 閲覧者など)が保持され、標準の BigQuery データセットまたはテーブル アクセス権が付与されていることを確認します。SAP でのデータ プロダクトのインストールと使用の詳細については、SAP ドキュメントの Installing Data Products をご覧ください。

新しいテーブルまたはメタデータの変更が SAP BDC に表示されない

この問題は、Apache Iceberg REST カタログまたは Knowledge Catalog データ プロダクトで新しいテーブルを追加するか、既存のテーブル メタデータを更新しても、SAP コンシューマーにその変更が表示されない場合に発生することがあります。基盤となるデータは最新の状態に保たれますが、メタデータの更新には明示的な操作が必要になる場合があります。

この問題を解決するには、カタログまたはデータ プロダクトに対して新しい公開アクション(gcloud biglake data-product-sharing publish)を実行して、新しいメタデータを SAP BDC で検出できるようにします。

SAP から BigQuery にデータを書き込めない

この問題は、公開された SAP 統合を使用して、SAP BDC から BigQuery のデータを書き込みまたは変更しようとすると発生します。この統合により、SAP BDC から BigQuery データへの読み取り専用アクセスが可能になり、データの誤った上書きやセキュリティ違反を防ぐことができます。

この問題を解決するには、BigQuery または標準の Google Cloud パイプラインを使用して、ソースデータを直接操作して書き込みます。

テーブルのクエリ時に RESOURCES_NOT_IN_SAME_SERVICE_PERIMETER エラーが発生する

この問題は、環境で VPC Service Controls が適用され、プロジェクトに適用された境界が storage.googleapis.com サービスを制限している場合に発生することがあります。Dremel はテーブルのクエリ時に SAP プロジェクトの受信 Cloud Storage バケットを読み取る必要があるため、SAP プロジェクトが境界外にあるため、リクエストは禁止されます。

この問題を解決するには、VPC Service Controls の下り(外向き)ルールを構成します。構成の詳細については、SAP BDC の VPC Service Controls 構成をご覧ください。