本文說明如何設定跨雲端 Lakehouse for Apache Iceberg,直接在 Google Cloud中查詢 AWS Glue 目錄的資料。這項功能可整合外部資料來源與現有的 Google Cloud 環境,統一進行資料分析。
之後,您可以使用 Lakehouse 管理同盟資料的存取權。
事前準備
- 請參閱 Lakehouse 總覽,瞭解 Lakehouse 如何管理資料存取權。
- 請參閱「關於跨雲端 Lakehouse」,瞭解運作方式。
- 請參閱支援的目錄,確認表格格式規定和支援的設定。
- 確認 AWS 管理員有權建立 Identity and Access Management (IAM) 角色,以及設定權限政策。
- 選用:如果您打算透過 Google Cloud 虛擬私有雲與遠端雲端供應商虛擬私有雲之間的私有互連網路 (例如 AWS) 傳送查詢,請確認您在遠端供應商擁有有效帳戶、佈建 Cross-Cloud Interconnect 或 Partner Interconnect、與 Cloud Router 建立 BGP 工作階段,並確認您在兩個雲端環境中都擁有必要的 IAM 權限。
- 登入 Google Cloud 帳戶。如果您是 Google Cloud新手,歡迎 建立帳戶,親自評估產品在實際工作環境中的成效。新客戶還能獲得價值 $300 美元的免費抵免額,可用於執行、測試及部署工作負載。
-
Verify that billing is enabled for your Google Cloud project.
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 theserviceusage.services.enablepermission. Learn how to grant roles.-
Verify that billing is enabled for your Google Cloud project.
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 theserviceusage.services.enablepermission. Learn how to grant roles.
必要的角色
如要取得設定跨雲端 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 Interconnect或Partner 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) 之間,佈建及設定下列任一私人互連選項:
- Cross-Cloud Interconnect:專屬實體連線。
- Partner Interconnect:透過支援的服務供應商建立連線。
在 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):
- 在 AWS VPC 控制台中,為 Amazon S3 建立介面端點。
- 指定服務名稱為
com.amazonaws.<var>AWS_REGION</var>.s3。 - 選取透過 Direct Connect 連線至 Google Cloud VPC 的 VPC 和子網路。
- 將安全性群組附加至端點,控管連入存取權。
- 這會在每個選取的子網路中佈建彈性網路介面 (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 能夠探索該位址。
為遠端雲端建立命名空間:
gcloud service-directory namespaces create NAMESPACE \ --project=PROJECT_ID \ --location=REGION
更改下列內容:
NAMESPACE:命名空間的專屬 ID。PROJECT_ID:您的 Google Cloud 專案 ID。REGION: Google Cloud 區域。例如us-east4。這必須與同盟目錄位於相同區域。
在 Service Directory 命名空間中建立服務:
gcloud service-directory services create SERVICE_NAME \ --namespace=NAMESPACE \ --project=PROJECT_ID \ --location=REGION
更改下列內容:
SERVICE_NAME:服務的專屬 ID。
在服務中建立 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 位址,請按照下列步驟操作:
- 在 AWS 虛擬私有雲中,為 Amazon S3 建立介面 VPC 端點。請記下這個端點的 IP 位址和通訊埠。
為遠端雲端建立命名空間:
gcloud service-directory namespaces create NAMESPACE \ --project=PROJECT_ID \ --location=REGION
更改下列內容:
NAMESPACE:命名空間的專屬 ID。PROJECT_ID:您的 Google Cloud 專案 ID。REGION: Google Cloud 區域。例如us-east4。這必須與同盟目錄位於相同區域。
在 Service Directory 命名空間中建立服務:
gcloud service-directory services create SERVICE_NAME \ --namespace=NAMESPACE \ --project=PROJECT_ID \ --location=REGION
更改下列內容:
SERVICE_NAME:服務的專屬 ID。
在服務中建立端點,內含 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 角色,並使用預留位置信任政策。
建立名為
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" ] } } } ] }
執行 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 中授予額外權限。
建立名為
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:*" ] } ] }
將這項權限政策附加至 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 欄位傳回。您可以使用這個服務帳戶建立信任關係。
執行下列指令,將
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)")
更新 AWS IAM 角色的信任政策,並將預留位置替換為已驗證的 Google 服務代理 ID。條件區塊會驗證
sub和aud是否相符。將政策寫入名為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
將最終政策套用至 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" } } } }'
驗證連線
確認目錄背景中繼資料重新整理週期已順利完成,且命名空間已同步。
確認重新整理狀態顯示成功:
gcloud alpha biglake iceberg catalogs describe FEDERATED_CATALOG_NAME \ --project="PROJECT_ID" \ --location="REGION"
確認遠端資料庫顯示為已同步的命名空間:
gcloud alpha biglake iceberg namespaces list \ --catalog="FEDERATED_CATALOG_NAME" \ --project="PROJECT_ID" \ --location="REGION"