連結至 Amazon S3
身為 BigQuery 管理員,您可以建立連線,讓資料分析師存取儲存在 Amazon Simple Storage Service (Amazon S3) 值區中的資料。
BigQuery Omni 會透過連線存取 Amazon S3 資料。每個連線都有專屬的 Amazon Web Services (AWS) 身分與存取權管理 (IAM) 使用者。您可以透過 AWS IAM 角色將權限授予使用者。AWS 身分與存取權管理角色中的政策會決定 BigQuery 可存取的每個連線資料。
您必須建立連線,才能查詢 Amazon S3 資料,並將查詢結果從 BigQuery 匯出至 Amazon S3 值區。
事前準備
請確認您已建立下列資源:
- 已啟用 BigQuery Connection API 的 Google Cloud 專案。
- 如果您採用容量型定價模式,請確認您已為專案啟用 BigQuery Reservation API。如要瞭解價格,請參閱 BigQuery Omni 定價。
- 具有修改 AWS 中 IAM 政策權限的 AWS 帳戶。
必要的角色
如要取得建立連線存取 Amazon S3 資料所需的權限,請要求管理員授予您專案的 BigQuery 連線管理員 (roles/bigquery.connectionAdmin
) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
為 BigQuery 建立 AWS 身分與存取權管理政策
請務必遵循 Amazon S3 的安全性最佳做法。建議您採取以下做法:
- 設定 AWS 政策,禁止透過 HTTP 存取 Amazon S3 值區。
- 設定 AWS 政策,禁止公開存取 Amazon S3 值區。
- 使用 Amazon S3 伺服器端加密機制。
- 請將授予 Google 帳戶的權限限制在最低必要權限。
- 設定 CloudTrail 並啟用 Amazon S3 資料事件。
如要建立 AWS 身分與存取權管理政策,請使用 AWS 主控台或 Terraform:
AWS 主控台
前往 AWS 身分與存取權管理主控台。請確認您登入的是擁有所需 Amazon S3 值區的帳戶。
依序選取「政策」>「建立政策」 (在新分頁中開啟)。
按一下「JSON」JSON,然後將下列內容貼到編輯器中:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::BUCKET_NAME" ] }, { "Effect": "Allow", "Action": [ "s3:GetObject", EXPORT_PERM ], "Resource": [ "arn:aws:s3:::BUCKET_NAME", "arn:aws:s3:::BUCKET_NAME/*" ] } ] }
更改下列內容:
BUCKET_NAME
:您要讓 BigQuery 存取的 Amazon S3 儲存桶。EXPORT_PERM
(選用):如果您想將資料匯出至 Amazon S3 儲存體,請提供額外權限。以"s3:PutObject"
取代- 如要分開匯出存取權控管,建議您使用其他 AWS IAM 角色建立另一個連線,並授予該角色唯寫存取權。如要更精細控管存取權,您也可以限制角色對值區特定路徑的存取權。
在「名稱」欄位中輸入政策名稱,例如
bq_omni_read_only
。按一下「建立政策」。
政策會使用 Amazon Resource Name (ARN) 建立,格式如下:
arn:aws:iam::AWS_ACCOUNT_ID:policy/POLICY_NAME
更改下列內容:
AWS_ACCOUNT_ID
:連線的 AWS IAM 使用者 ID 編號。POLICY_NAME
:您選擇的政策名稱。
AWS CLI
如要建立 AWS IAM 政策,請使用 aws iam create-policy
指令:
aws iam create-policy \ --policy-name POLICY_NAME \ --policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::BUCKET_NAME" ] }, { "Effect": "Allow", "Action": [ "s3:GetObject", EXPORT_PERM ], "Resource": [ "arn:aws:s3:::BUCKET_NAME", "arn:aws:s3:::BUCKET_NAME/*" ] } ] }'
更改下列內容:
POLICY_NAME
:您要建立的政策名稱。BUCKET_NAME
:您希望 BigQuery 存取的 Amazon S3 儲存桶。EXPORT_PERM
(選用):如果您想將資料匯出至 Amazon S3 儲存空間,請授予額外權限。以"s3:PutObject"
取代- 如要分開匯出存取權控管,建議您使用其他 AWS IAM 角色建立另一個連線,並授予該角色唯寫存取權。如要更精細控管存取權,您也可以限制角色只能存取值區的特定路徑。
政策會使用 Amazon Resource Name (ARN) 建立,格式如下:
arn:aws:iam::AWS_ACCOUNT_ID:policy/POLICY_NAME
更改下列內容:
AWS_ACCOUNT_ID
:連線的 AWS IAM 使用者 ID 編號。POLICY_NAME
:您選擇的政策名稱。
Terraform
將下列內容加入 Terraform 設定,將政策附加至 Amazon S3 值區資源:
resource "aws_iam_policy" "bigquery-omni-connection-policy" { name = "bigquery-omni-connection-policy" policy = <<-EOF { "Version": "2012-10-17", "Statement": [ { "Sid": "BucketLevelAccess", "Effect": "Allow", "Action": ["s3:ListBucket"], "Resource": ["arn:aws:s3:::BUCKET_NAME"] }, { "Sid": "ObjectLevelAccess", "Effect": "Allow", "Action": ["s3:GetObject",EXPORT_PERM], "Resource": [ "arn:aws:s3:::BUCKET_NAME", "arn:aws:s3:::BUCKET_NAME/*" ] } ] } EOF }
更改下列內容:
BUCKET_NAME
:您要讓 BigQuery 存取的 Amazon S3 儲存桶。EXPORT_PERM
(選用):如果您想將資料匯出至 Amazon S3 儲存體,請提供額外權限。以"s3:PutObject"
取代- 如要區隔匯出存取權,建議您建立另一個使用其他 AWS IAM 角色的連線,並授予該角色唯寫存取權。如要進一步控管存取權,您也可以限制角色對儲存桶特定路徑的存取權。
為 BigQuery 建立 AWS 身分與存取權管理角色
接著,請建立角色,允許 BigQuery 存取 Amazon S3 值區。這個角色會使用您在上一節建立的政策。
如要建立 AWS 身分與存取權管理角色,請使用 AWS 主控台或 Terraform:
AWS 主控台
前往 AWS 身分與存取權管理主控台。請確認您登入的是擁有所需 Amazon S3 值區的帳戶。
依序選取「角色」>「建立角色」。
在「選取信任實體類型」部分,選取「Web Identity」。
在「識別資訊提供者」部分,選取「Google」。
在「目標對象」中,輸入
00000
做為預留位置值。您稍後會替換這個值。點選 [Next: Permissions] (下一步:權限)。
如要授予角色 Amazon S3 資料的存取權,請將 IAM 政策附加至該角色。搜尋您在上一節中建立的政策,然後按一下切換鈕。
按一下「下一步:代碼」。
按一下「下一步:檢閱」。輸入角色名稱,例如
BQ_Read_Only
。按一下「建立角色」。
AWS CLI
使用下列指令建立 IAM 角色,並將政策指派給所建立的角色:
aws iam create-role \ --role-name bigquery-omni-connection \ --max-session-duration 43200 \ --assume-role-policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "accounts.google.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "accounts.google.com:sub": "00000" } } } ] }'
Terraform
將下列內容加入 Terraform 設定,建立 IAM 角色,並將政策指派給所建立的角色:
resource "aws_iam_role" "bigquery-omni-connection-role" { name = "bigquery-omni-connection" max_session_duration = 43200 assume_role_policy = <<-EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "accounts.google.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "accounts.google.com:sub": "00000" } } } ] } EOF } resource "aws_iam_role_policy_attachment" "bigquery-omni-connection-role-attach" { role = aws_iam_role.bigquery-omni-connection-role.name policy_arn = aws_iam_policy.bigquery-omni-connection-policy.arn } output "bigquery_omni_role" { value = aws_iam_role.bigquery-omni-connection-role.arn }
然後將政策附加至角色:
aws iam attach-role-policy \ --role-name bigquery-omni-connection \ --policy-arn arn:aws:iam::AWS_ACCOUNT_ID:policy/POLICY_NAME
更改下列內容:
AWS_ACCOUNT_ID
:連線的 AWS IAM 使用者 ID 編號。POLICY_NAME
:您選擇的政策名稱。
建立連線
如要連線至 Amazon S3 儲存貯體,請使用Google Cloud 主控台、bq 指令列工具或用戶端程式庫:
主控台
前往「BigQuery」頁面
在「Explorer」窗格中,按一下
「Add data」(新增資料)。「Add data」對話方塊隨即開啟。
在「Filter By」窗格中的「Data Source Type」部分,選取「Storage/Data Lakes」。
或者,您也可以在「Search for data sources」欄位中輸入
aws
或Amazon S3
。在「精選資料來源」部分,按一下「Amazon S3」。
按一下「Amazon S3 Omni:BigQuery 聯盟」解決方案資訊卡。
在「Create table」對話方塊的「Connection ID」欄位中,選取「Create a new S3 connection」。
在「外部資料來源」窗格中,輸入下列資訊:
- 在「連線類型」中,選取「AWS 中的 BigLake (透過 BigQuery Omni)」。
- 在「Connection ID」(連線 ID) 專區中輸入連線資源的 ID。您可以使用英文字母、數字、破折號和底線。
- 在「Region」(區域) 中,選取要建立連線的位置。
- 選用:在「Friendly name」(好記名稱) 中輸入使用者容易記得的連線名稱,例如
My connection resource
。好記名稱可以是任何值,只要您日後需要修改時可以輕鬆識別連線資源即可。 - 選用:在「Description」(說明) 中輸入這項連線資源的說明。
- 針對「AWS 角色 ID」,請輸入您建立的完整 IAM 角色 ID,格式如下:
arn:aws:iam::AWS_ACCOUNT_ID:role/ROLE_NAME
點選「建立連線」。
按一下「前往連線」。
在「連線資訊」窗格中,複製 BigQuery Google 身分。這是每個連線專屬的 Google 管理員。範例:
BigQuery Google identity: IDENTITY_ID
Terraform
resource "google_bigquery_connection" "connection" { connection_id = "bigquery-omni-aws-connection" friendly_name = "bigquery-omni-aws-connection" description = "Created by Terraform" location = "AWS_LOCATION" aws { access_role { # This must be constructed as a string instead of referencing the # AWS resources directly to avoid a resource dependency cycle # in Terraform. iam_role_id = "arn:aws:iam::AWS_ACCOUNT:role/IAM_ROLE_NAME" } } }
更改下列內容:
AWS_LOCATION
: Google Cloud中的 Amazon S3 位置AWS_ACCOUNT
:您的 AWS 帳戶 ID。IAM_ROLE_NAME
:允許從 BigQuery 存取 Amazon S3 值區的角色。在「為 BigQuery 建立 AWS 身分與存取權管理角色」中,使用aws_iam_role
資源的name
引數值。
bq
bq mk --connection --connection_type='AWS' \ --iam_role_id=arn:aws:iam::AWS_ACCOUNT_ID:role/ROLE_NAME \ --location=AWS_LOCATION \ CONNECTION_ID
更改下列內容:
AWS_ACCOUNT_ID
:連線的 AWS IAM 使用者 ID 編號ROLE_NAME
:您選擇的角色政策名稱AWS_LOCATION
: Google Cloud中的 Amazon S3 位置CONNECTION_ID
:您為此連線資源指定的 ID。
指令列會顯示以下輸出內容:
Identity: IDENTITY_ID
輸出內容包含下列項目:
IDENTITY_ID
:Google 原則,用於控管各個連線。 Google Cloud
請記下 IDENTITY_ID
的值。
Java
在嘗試這個範例之前,請先按照 BigQuery 快速入門:使用用戶端程式庫中的 Java 設定說明進行操作。詳情請參閱 BigQuery Java API 參考說明文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
為 AWS 角色新增信任關係
BigQuery Omni 提供兩種方法,可安全存取 Amazon S3 中的資料。您可以將 AWS 角色的存取權授予 Google Cloud 服務帳戶,如果您的 AWS 帳戶有 accounts.google.com
的自訂身分識別提供者,則必須將 Google Cloud 服務帳戶新增為提供者的目標對象:
為 AWS 角色新增信任政策
信任關係可讓連線假設角色,並根據角色政策中指定的內容存取 Amazon S3 資料。
如要新增信任關係,請使用 AWS 主控台或 Terraform:
AWS 主控台
前往 AWS 身分與存取權管理主控台。請確認您登入的是擁有所需 Amazon S3 值區的帳戶。
選取「角色」。
選取您建立的
ROLE_NAME
。按一下「編輯」,然後執行下列操作:
將「工作階段持續時間上限」設為 12 小時。由於每項查詢最多可執行六小時,因此這個時間長度可讓您額外重試一次。將工作階段持續時間增加到超過 12 小時,就無法再重試。詳情請參閱「查詢/多個陳述式的查詢執行時間限制」。
按一下 [儲存變更]。
選取「信任關係」,然後按一下「編輯信任關係」。將政策內容替換為以下內容:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "accounts.google.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "accounts.google.com:sub": "IDENTITY_ID" } } } ] }
將
IDENTITY_ID
替換為 BigQuery Google 身分值,您可以在 Google Cloud 主控台上找到您建立的連線。按一下「更新信任政策」。
AWS CLI
如要建立 BigQuery 連線的信任關係,請使用 aws iam update-assume-role-policy
指令:
aws iam update-assume-role-policy \ --role-name bigquery-omni-connection \ --policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "accounts.google.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "accounts.google.com:sub": "IDENTITY_ID" } } } ] }' aws iam update-assume-role-policy \ --role-name bigquery-omni-connection \ --policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "accounts.google.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "accounts.google.com:sub": "IDENTITY_ID" } } } ] }'
更改下列內容:
IDENTITY_ID
:BigQuery Google 身分識別碼值,您可以在 Google Cloud 主控台上找到您建立的連線。
Terraform
更新 Terraform 設定中的 aws_iam_role
資源,以新增信任關係:
resource "aws_iam_role" "bigquery-omni-connection-role" { name = "bigquery-omni-connection" max_session_duration = 43200 assume_role_policy = <<-EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "accounts.google.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "accounts.google.com:sub": "${google_bigquery_connection.connection.aws[0].access_role[0].identity}" } } } ] } EOF }
連線現在已可使用。
設定自訂 AWS 識別資訊提供者
如果您的 AWS 帳戶有 accounts.google.com
的自訂身分識別提供者,您必須將 IDENTITY_ID 新增為供應商的目標對象。方法如下:
前往 AWS 身分與存取權管理主控台。請確認您登入的是擁有所需 Amazon S3 值區的帳戶。
依序前往「身分與存取權管理」>「識別資訊提供者」。
選取 accounts.google.com 的識別資訊提供者。
按一下「新增目標對象」,然後將 IDENTITY_ID 新增為目標對象。
連線現在已可使用。
與使用者分享連線
您可以授予下列角色,讓使用者查詢資料及管理連線:
roles/bigquery.connectionUser
:可讓使用者使用連線連結外部資料來源,並對這些資料來源執行查詢。roles/bigquery.connectionAdmin
:讓使用者管理連線。
如要進一步瞭解 BigQuery 中的 IAM 角色和權限,請參閱「預先定義的角色與權限」一文。
選取下列選項之一:
主控台
前往「BigQuery」頁面
連線會列在專案中,位於名為「External connections」的群組中。
在「Explorer」窗格中,依序點選「專案名稱」>「外部連線」>「連線」。
在「Details」窗格中,按一下「Share」,即可分享連線。接著,按照下列步驟操作:
在「Connection permissions」對話方塊中,新增或編輯主體,與其他主體共用連線。
按一下 [儲存]。
bq
您無法透過 bq 指令列工具共用連線。如要分享連線,請使用 Google Cloud 主控台或 BigQuery Connections API 方法。
API
請使用 BigQuery Connections REST API 參考資料部分的 projects.locations.connections.setIAM
方法,並提供 policy
資源的例項。
Java
在嘗試這個範例之前,請先按照 BigQuery 快速入門:使用用戶端程式庫中的 Java 設定說明進行操作。詳情請參閱 BigQuery Java API 參考說明文件。
如要向 BigQuery 進行驗證,請設定應用程式預設憑證。詳情請參閱「設定用戶端程式庫的驗證機制」。
後續步驟
- 瞭解不同的連線類型。
- 瞭解如何管理連線。
- 瞭解 BigQuery Omni。
- 使用 BigQuery Omni 與 AWS 實驗室。
- 瞭解 BigLake 資料表。
- 瞭解如何查詢 Amazon S3 資料。
- 瞭解如何將查詢結果匯出至 Amazon S3 值區。