為 AWS Glue 設定跨雲端 Lakehouse

本文說明如何設定跨雲端 Lakehouse for Apache Iceberg,直接在 Google Cloud中查詢 AWS Glue 目錄的資料。這項功能可整合外部資料來源與現有的 Google Cloud 環境,統一進行資料分析。

之後,您可以使用 Lakehouse 管理同盟資料的存取權。

事前準備

  1. 請參閱 Lakehouse 總覽,瞭解 Lakehouse 如何管理資料存取權。
  2. 請參閱「關於跨雲端 Lakehouse」,瞭解運作方式。
  3. 請參閱支援的目錄,確認表格格式規定和支援的設定。
  4. 確認 AWS 管理員有權建立 Identity and Access Management (IAM) 角色,以及設定權限政策。
  5. 選用:如果您打算透過 Google Cloud 虛擬私有雲與遠端雲端供應商虛擬私有雲之間的私有互連網路 (例如 AWS) 傳送查詢,請確認您在遠端供應商擁有有效帳戶、佈建 Cross-Cloud InterconnectPartner Interconnect、與 Cloud Router 建立 BGP 工作階段,並確認您在兩個雲端環境中都擁有必要的 IAM 權限。
  6. 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自評估產品在實際工作環境中的成效。新客戶還能獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。
  7. Verify that billing is enabled for your Google Cloud project.

  8. Enable the BigLake API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

  9. Verify that billing is enabled for your Google Cloud project.

  10. Enable the BigLake API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

必要的角色

如要取得設定跨雲端 Lakehouse 所需的權限,請要求管理員在專案中授予您下列 IAM 角色:

  • 管理 Lakehouse 目錄: BigLake 管理員 (roles/biglake.admin)
  • 透過私有互連傳送流量: Compute 網路管理員 (roles/compute.networkAdmin)、Service Directory 檢視者 (roles/servicedirectory.viewer) 和 Service Directory PSC 授權服務 (roles/servicedirectory.pscAuthorizedService)

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

您或許也能透過自訂角色或其他預先定義的角色,取得必要權限。

限制和注意事項

本節列出使用跨雲端 Lakehouse 的限制和注意事項。

  • 支援的雲端供應商:使用私有互連與跨雲端 Lakehouse 互連,支援的遠端雲端供應商包括 Amazon Web Services (AWS)。您可以選擇使用Cross-Cloud InterconnectPartner Interconnect
  • 網路路由:如果未設定私人互連網路 (例如客戶擁有的 CCI 或 Partner Interconnect),查詢會透過公用網際網路路由。這可能會導致遠端雲端供應商收取較高的輸出費用,且效能較難預測。
  • 資料更新間隔:聯合目錄的 --refresh-interval 標記會決定中繼資料的同步頻率。間隔時間越短,資料越新,但可能需要向遠端目錄供應商支付額外 API 費用。
  • Iceberg 指標回報: Iceberg 指標回報不適用於聯邦目錄。存取同盟目錄時,請在 Iceberg 用戶端中將 rest-metrics-reporting-enabled 屬性設為 false

一般工作流程

如要設定及使用跨雲端 Lakehouse,請按照下列一般步驟操作:

  • 設定跨雲端互連 (選用):設定 Google Cloud VPC 與遠端雲端供應商之間的私人連線。
  • 設定同盟:建立 IAM 角色,並使用含有遠端供應商預留位置信任政策的 IAM 角色,設定驗證。接著,在 Lakehouse 中建立同盟目錄,並更新信任政策。
  • 驗證連線:確認 Lakehouse 可以順利連線至遠端目錄。
  • 查詢資料:使用 BigQuery 或 Managed Service for Apache Spark,對聯合資料執行查詢。詳情請參閱「使用跨雲端 Lakehouse」。
  • 設定權限:使用 IAM 管理可查看及查詢同盟資料的使用者。

設定 Cross-Cloud Interconnect (選用)

根據預設,對遠端目錄的查詢會透過公開網際網路傳輸。為提升安全性及法規遵循能力、提供可預測的效能,並降低資料傳輸費用,請使用專屬互連。這會在您的 Google Cloud虛擬私有雲 (VPC) 與遠端雲端供應商的網路 (例如 AWS) 之間,建立專屬的私人網路連線。

您可以在 Google Cloud 虛擬私有雲和遠端雲端供應商的虛擬私有雲 (例如 AWS) 之間,佈建及設定下列任一私人互連選項:

在 Cloud Router Google Cloud 和遠端雲端供應商的 VPC 之間建立 BGP 工作階段,確保路徑交換。

如要啟用私下查詢,您必須透過私有互連,設定從 Lakehouse 到遠端儲存空間值區 (例如 AWS Amazon S3 值區) 的路徑。您可以按照兩種架構流程設定這項路徑:

  • 內部區域 Proxy 網路負載平衡器轉送:這個流程會使用Google Cloud 內部區域 Proxy 網路負載平衡器,將要求分配至指向多個 AWS 彈性網路介面 (ENI) 的混合式連線網路端點群組 (NEG)。這個流程對於負載平衡、擴充性和高可用性至關重要。合作夥伴互連網路必須使用 Cloud Router,而 Cross-Cloud Interconnect 則建議使用,以利負載平衡、擴充性和高可用性。
  • 直接端點路由:這個流程會將 Service Directory 直接連至單一 AWS 介面 VPC 端點 IP 位址。這個流程僅適用於 Cross-Cloud Interconnect,不支援 Partner Interconnect。

選取符合架構需求的設定流程:

內部區域 Proxy 網路負載平衡器

如要設定內部區域 Proxy 網路負載平衡器,將要求分配到多個 AWS ENI,以達到高可用性和負載平衡,請按照下列步驟操作:

設定 AWS 網路

首先,請建立 Amazon S3 虛擬私有雲介面端點 (AWS PrivateLink):

  1. 在 AWS VPC 控制台中,為 Amazon S3 建立介面端點。
  2. 指定服務名稱為 com.amazonaws.<var>AWS_REGION</var>.s3
  3. 選取透過 Direct Connect 連線至 Google Cloud VPC 的 VPC 和子網路。
  4. 將安全性群組附加至端點,控管連入存取權。
  5. 這會在每個選取的子網路中佈建彈性網路介面 (ENI)。記下這些 ENI 的私人 IP 位址。

接著,請設定安全群組:

  • 確認附加至 Amazon S3 端點 ENI 的安全性群組允許從 VPC 的相關 IP 範圍,在通訊埠 443上輸入 TCP 流量。 Google Cloud

設定 Google Cloud 網路

按照操作說明為混合式端點設定內部區域 Proxy 網路負載平衡器

按照指示操作時,請務必執行下列步驟:

  • 建立混合式連線 NEG (NON_GCP_PRIVATE_IP_PORT),並新增您先前建立的 AWS ENI 私人 IP 位址。
  • 為 NEG、健康狀態檢查和轉送規則使用 TCP 通訊埠 443
  • 在與同盟目錄相同的 Google Cloud 區域中設定負載平衡器。

為負載平衡器建立轉送規則後,請記下指派給負載平衡器的內部 IP 位址。這是你的 ILB_IP_ADDRESS

設定 Service Directory

在 Service Directory 中註冊 ILB 的 IP 位址,讓 Lakehouse 能夠探索該位址。

  1. 為遠端雲端建立命名空間:

    gcloud service-directory namespaces create NAMESPACE \
        --project=PROJECT_ID \
        --location=REGION

    更改下列內容:

    • NAMESPACE:命名空間的專屬 ID。
    • PROJECT_ID:您的 Google Cloud 專案 ID。
    • REGION: Google Cloud 區域。例如 us-east4。這必須與同盟目錄位於相同區域。
  2. 在 Service Directory 命名空間中建立服務:

    gcloud service-directory services create SERVICE_NAME \
        --namespace=NAMESPACE \
        --project=PROJECT_ID \
        --location=REGION

    更改下列內容:

    • SERVICE_NAME:服務的專屬 ID。
  3. 在服務中建立 ILB 的端點:

    gcloud service-directory endpoints create ENDPOINT_NAME \
        --project=PROJECT_ID \
        --namespace=NAMESPACE \
        --service=SERVICE_NAME \
        --location=REGION \
        --network=projects/PROJECT_NUMBER/global/networks/VPC_NETWORK \
        --address=ILB_IP_ADDRESS \
        --port=443

    更改下列內容:

    • ENDPOINT_NAME:端點的專屬 ID。
    • PROJECT_NUMBER:您的 Google Cloud專案編號。在 --network 標記中使用專案編號。
    • ILB_IP_ADDRESS:ILB 轉送規則的內部 IP 位址。

直接端點

如要設定 Service Directory,將流量直接轉送至單一 AWS 介面 VPC 端點 IP 位址,請按照下列步驟操作:

  1. 在 AWS 虛擬私有雲中,為 Amazon S3 建立介面 VPC 端點。請記下這個端點的 IP 位址和通訊埠。
  2. 為遠端雲端建立命名空間:

    gcloud service-directory namespaces create NAMESPACE \
        --project=PROJECT_ID \
        --location=REGION

    更改下列內容:

    • NAMESPACE:命名空間的專屬 ID。
    • PROJECT_ID:您的 Google Cloud 專案 ID。
    • REGION: Google Cloud 區域。例如 us-east4。這必須與同盟目錄位於相同區域。
  3. 在 Service Directory 命名空間中建立服務:

    gcloud service-directory services create SERVICE_NAME \
        --namespace=NAMESPACE \
        --project=PROJECT_ID \
        --location=REGION

    更改下列內容:

    • SERVICE_NAME:服務的專屬 ID。
  4. 在服務中建立端點,內含 Amazon S3 介面 VPC 端點的路徑資訊:

    gcloud service-directory endpoints create ENDPOINT_NAME \
        --service=SERVICE_NAME \
        --namespace=NAMESPACE \
        --project=PROJECT_ID \
        --location=REGION \
        --address=S3_VPCE_IP_ADDRESS \
        --port=S3_VPCE_PORT \
        --network=projects/PROJECT_NUMBER/global/networks/VPC_NETWORK

    更改下列內容:

    • ENDPOINT_NAME:端點的專屬 ID。
    • S3_VPCE_IP_ADDRESS:Amazon S3 介面 VPC 端點的 IP 位址。例如:10.0.1.45
    • S3_VPCE_PORT:Amazon S3 介面 VPC 端點的通訊埠編號。例如:443
    • PROJECT_NUMBER:您的 Google Cloud專案編號。在 --network 標記中使用專案編號。
    • VPC_NETWORK:與私有互連相關聯的虛擬私有雲網路名稱。 Google Cloud

設定跨雲端聯盟

如要查詢資料,請設定 Lakehouse 聯合目錄,並連線至遠端 AWS 目錄。

使用預留位置信任政策建立 AWS IAM 角色

Lakehouse 會在建立目錄後佈建 Google 服務帳戶 ID。建立 AWS IAM 角色,並使用預留位置信任政策。

  1. 建立名為 trust_policy.json 的檔案:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "accounts.google.com"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "accounts.google.com:aud": [
                "PLACEHOLDER_VALUE"
              ],
              "accounts.google.com:sub": [
                "PLACEHOLDER_VALUE"
              ]
            }
          }
        }
      ]
    }
  2. 執行 AWS CLI 指令,使用預留位置信任政策建立角色。建議您將工作階段持續時間上限設為 12 小時 (43200 秒),以免長期執行的工作在執行期間憑證過期:

    aws iam create-role \
      --role-name AWS_ROLE_NAME \
      --assume-role-policy-document file://trust_policy.json \
      --max-session-duration 43200

    更改下列內容:

    • AWS_ROLE_NAME:AWS IAM 角色的名稱。例如:biglake_glue_federation_role

附加權限政策

將權限政策附加至 IAM 角色,讓 Lakehouse 存取 AWS 區域的 Glue Data Catalog 和 S3 bucket。如果您使用 AWS Lake Formation S3 資料表整合,這項政策也會授予 S3 資料表值區的存取權。如果您已從預設的 AWS Glue 資料權限升級至 AWS Lake Formation 模型,可能需要在 Lake Formation 中授予額外權限。

  1. 建立名為 permissions_policy.json 的檔案,並在當中加入下列政策設定。

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "GlueRead",
          "Effect": "Allow",
          "Action": [
            "glue:GetCatalog",
            "glue:GetDatabase",
            "glue:GetDatabases",
            "glue:GetTable",
            "glue:GetTables"
          ],
          "Resource": "arn:aws:glue:AWS_REGION:AWS_ACCOUNT_ID:*"
        },
        {
          "Sid": "S3Read",
          "Effect": "Allow",
          "Action": [
            "s3:ListBucket",
            "s3:GetObject"
          ],
          "Resource": [
            "arn:aws:s3:::*"
          ]
        },
        {
          "Sid": "S3TablesRead",
          "Effect": "Allow",
          "Action": [
            "s3tables:GetTableBucket",
            "s3tables:ListNamespaces",
            "s3tables:GetNamespace",
            "s3tables:ListTables",
            "s3tables:GetTable",
            "s3tables:GetTableMetadataLocation",
            "s3tables:GetTableData"
          ],
          "Resource": [
            "arn:aws:s3tables:AWS_REGION:AWS_ACCOUNT_ID:*"
          ]
        }
      ]
    }
  2. 將這項權限政策附加至 IAM 角色:

    aws iam put-role-policy \
      --role-name AWS_ROLE_NAME \
      --policy-name AWS_POLICY_NAME \
      --policy-document file://permissions_policy.json

    更改下列內容:

    • AWS_ROLE_NAME:AWS IAM 角色的名稱。例如:biglake_glue_federation_role
    • AWS_POLICY_NAME:權限政策的名稱。例如:biglake_glue_permissions
    • AWS_REGION:Glue 目錄或 S3 表格所在的 AWS 區域。例如:us-east-1
    • AWS_ACCOUNT_ID:您的 12 位數 AWS 帳戶 ID 字串。例如:123456789012

建立聯合目錄

使用 gcloud CLI 或 REST API,在 Google Cloud 上建立聯邦目錄。

為避免 AWS 信任關係傳播時,背景中繼資料過早重新整理失敗,請初始化目錄,但不要指定重新整理排程 (預設為 0s)。

Google Cloud CLI

公開網路 (無 CCI)

如未設定 CCI,連線會透過公開網際網路安全傳輸。

gcloud alpha biglake iceberg catalogs create FEDERATED_CATALOG_NAME \
    --project="PROJECT_ID" \
    --primary-location="REGION" \
    --catalog-type="federated" \
    --federated-catalog-type="glue" \
    --glue-warehouse="GLUE_OR_S3_TABLE_BUCKET_WAREHOUSE" \
    --glue-aws-region="AWS_REGION" \
    --glue-aws-role-arn="arn:aws:iam::AWS_ACCOUNT_ID:role/AWS_ROLE_NAME"

客戶擁有的帳戶 (CCI)

如果您已設定私人互連網路 (例如專屬 CCI 或 Partner Interconnect),請提供 Service Directory 服務參照,確保 Lakehouse 私下轉送流量。

gcloud alpha biglake iceberg catalogs create FEDERATED_CATALOG_NAME \
    --project="PROJECT_ID" \
    --primary-location="REGION" \
    --catalog-type="federated" \
    --federated-catalog-type="glue" \
    --glue-warehouse="GLUE_OR_S3_TABLE_BUCKET_WAREHOUSE" \
    --glue-aws-region="AWS_REGION" \
    --glue-aws-role-arn="arn:aws:iam::AWS_ACCOUNT_ID:role/AWS_ROLE_NAME" \
    --service-directory-name="projects/PROJECT_ID/locations/REGION/namespaces/NAMESPACE/services/SERVICE_NAME"

REST

curl -s -X POST \
  -H "x-goog-user-project: PROJECT_ID" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  "https://biglake.googleapis.com/iceberg/v1/restcatalog/extensions/projects/PROJECT_ID/catalogs?iceberg_catalog_id=FEDERATED_CATALOG_NAME&primary_location=REGION" \
  -d '{
    "catalog_type": "CATALOG_TYPE_FEDERATED",
    "storage_regions": ["'"REGION"'"],
    "federated_catalog_options": {
      "glue_catalog_info": {
        "warehouse": "'"GLUE_OR_S3_TABLE_BUCKET_WAREHOUSE"'",
        "aws_region": "'"AWS_REGION"'",
        "aws_role_arn": "arn:aws:iam::'"AWS_ACCOUNT_ID"':role/'"AWS_ROLE_NAME"'"
      }
    }
  }'

更改下列內容:

  • FEDERATED_CATALOG_NAME:聯合目錄的名稱。
  • PROJECT_ID:您的 Google Cloud 專案 ID。
  • REGION:建立聯合目錄的 Lakehouse 區域。例如:us-east4
  • GLUE_OR_S3_TABLE_BUCKET_WAREHOUSE:目標資料倉儲目錄 ID。如果是 AWS 區域的 Glue Data Catalog,請輸入 12 碼的 AWS 帳戶 ID 字串。例如:123456789012。如要在該區域中使用 S3 資料表 bucket,請輸入 AWS_ACCOUNT_ID:s3tablescatalog/S3_TABLE_BUCKET。 例如:123456789012:s3tablescatalog/my-table-bucket
  • AWS_ACCOUNT_ID:您的 12 位數 AWS 帳戶 ID 字串。例如:123456789012
  • AWS_REGION:Glue 目錄或 S3 資料表儲存桶所在的 AWS 區域。例如:us-east-1
  • AWS_ROLE_NAME:AWS IAM 角色的名稱。例如:biglake_glue_federation_role
  • NAMESPACE:(選用) 您在設定私人互連時建立的 Service Directory 命名空間。
  • SERVICE_NAME:(選用) 您在設定私人互連時建立的 Service Directory 服務名稱。

更新信任政策

建立目錄時,Lakehouse 會為目錄佈建專屬服務帳戶,並在目錄建立回應中以 biglake-service-account-id 欄位傳回。您可以使用這個服務帳戶建立信任關係。

  1. 執行下列指令,將 biglake-service-account-id 值擷取到有效的 Bash 變數中:

    BIGLAKE_SA_ID=$(gcloud alpha biglake iceberg catalogs describe FEDERATED_CATALOG_NAME \
      --project="PROJECT_ID" \
      --format="value(biglake-service-account-id)")
  2. 更新 AWS IAM 角色的信任政策,並將預留位置替換為已驗證的 Google 服務代理 ID。條件區塊會驗證 subaud 是否相符。將政策寫入名為 trust_policy_comprehensive.json 的檔案:

    cat > trust_policy_comprehensive.json << EOF
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "accounts.google.com"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "accounts.google.com:aud": [
                "$BIGLAKE_SA_ID"
              ],
              "accounts.google.com:sub": [
                "$BIGLAKE_SA_ID"
              ]
            }
          }
        }
      ]
    }
    EOF
  3. 將最終政策套用至 AWS 角色:

    aws iam update-assume-role-policy \
      --role-name AWS_ROLE_NAME \
      --policy-document file://trust_policy_comprehensive.json

啟用背景中繼資料重新整理功能

現在兩個平台都已成功建立安全信任關係,請更新目錄,啟用背景中繼資料重新整理 (每 5 分鐘或 300s,或更大)。

gcloud CLI

gcloud alpha biglake iceberg catalogs update FEDERATED_CATALOG_NAME \
  --project="PROJECT_ID" \
  --refresh-interval="300s"

REST

curl -s -X PATCH \
-H "x-goog-user-project: PROJECT_ID" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://biglake.googleapis.com/iceberg/v1/restcatalog/extensions/projects/PROJECT_ID/catalogs/FEDERATED_CATALOG_NAME?updateMask=federated_catalog_options.refresh_options.refresh_schedule" \
-d '{
  "federated_catalog_options": {
    "refresh_options": {
      "refresh_schedule": {
        "refresh_interval": "300s"
      }
    }
  }
}'

驗證連線

確認目錄背景中繼資料重新整理週期已順利完成,且命名空間已同步。

  1. 確認重新整理狀態顯示成功:

    gcloud alpha biglake iceberg catalogs describe FEDERATED_CATALOG_NAME \
      --project="PROJECT_ID" \
      --location="REGION"
  2. 確認遠端資料庫顯示為已同步的命名空間:

    gcloud alpha biglake iceberg namespaces list \
      --catalog="FEDERATED_CATALOG_NAME" \
      --project="PROJECT_ID" \
      --location="REGION"

後續步驟