创建 BigQuery Azure 连接

BigQuery Omni 通过连接访问 Azure Blob Storage 数据。BigQuery Omni 提供了两种从 Azure Blob Storage 安全访问数据的方法。您可以通过向 Google Cloud 服务帐号授予对 Azure 应用的访问权限来使用身份联合,也可以直接向租户中的 Azure Active Directory (AD) 应用授予访问权限:

  • 使用 Azure 联合身份(预览版)借助 BigQuery Omni 支持 Azure 工作负载身份联合(预览版),您可以为 Google 服务帐号授予对租户中的 Azure 应用的访问权限。身份联合比使用非联合身份授予对数据的访问权限更安全,因为应用存在于 Azure 租户中,并且您或 Google 不必管理应用客户端密钥。身份联合还可让您更好地控制为其授予对数据的访问权限的应用。此功能处于预览版阶段。

  • 使用非联合身份每个连接都有自己唯一的 Azure Active Directory (Azure AD) 应用。系统会通过 Azure Identity and Access Management (IAM) 角色为应用授予权限。授予的 Azure IAM 角色决定了 BigQuery 可以在每个连接中访问的数据。

创建 BigQuery Azure 连接后,您可以查询 Azure Blob Storage 中的数据,也可以将数据从 Azure 导出到 BigQuery

准备工作

配额

您的项目最多可以为每个项目创建 50 个 Azure 连接。配额包括联合和非联合 Azure 连接。如需详细了解配额,请参阅 BigQuery Connection API

使用 Azure 联合身份

如需使用联合身份(预览版)访问数据,请按照以下步骤操作:

  1. 在 Azure 租户中创建应用
  2. 创建 BigQuery Azure 连接
  3. 添加联合凭据
  4. 为 BigQuery 的 Azure AD 应用分配角色

如需详细了解如何使用联合身份访问 Azure 中的数据,请参阅工作负载身份联合(预览版)

在 Azure 租户中创建应用

如需在 Azure 租户中创建应用,请按照以下步骤操作:

  1. 在 Azure 门户中,转到应用注册,然后点击新注册

  2. 对于名称,请输入应用的名称。

  3. 对于 Supported account types(支持的帐号类型),选择 Accounts in this organizational directory only(仅此组织目录中的帐号)。

  4. 如需注册新应用,请点击注册

  5. 记下 Application (client) ID(应用(客户端)ID)。创建 BigQuery Azure 连接时,您需要提供此 ID。

    用于创建应用的 Azure 门户

如需了解详情,请参阅如何在 Azure 中注册应用

创建 BigQuery Azure 连接

如需创建 BigQuery Azure 连接,请使用 Google Cloud 控制台或 bq 命令行工具:

控制台

  1. 在 Google Cloud Console 中,转到 BigQuery 页面。

    转到 BigQuery

  2. 添加数据菜单中,选择外部数据源

  3. 外部数据源窗格中,输入以下信息:

    • 对于连接类型,选择 Azure 上的 BigLake(通过 BigQuery Omni)
    • 对于连接 ID,输入连接资源的标识符。可使用字母、数字、短划线和下划线。
    • 对于连接位置,选择 azure-eastus2
    • 可选:对于易记名称,输入方便用户使用的连接名称,例如 My connection resource。易记名称可以是任何容易辨识的值,让您以后在需要修改连接资源时能够轻松识别。
    • 可选:对于说明,输入此连接资源的说明。
    • 对于 Azure 租户 ID,输入 Azure 租户 ID,也称为目录(租户)ID。
    • 对于应用 ID,输入 Azure 应用(客户端)ID。

      如需了解如何获取 Azure ID,请参阅在 Azure 租户中创建应用

  4. 点击创建连接

  5. 探索器面板中,点击您在其中创建连接 ID 的数据集,然后点击连接 ID 以查看其详细信息。

  6. 连接信息部分中,记下身份的值,即服务帐号 ID。此 ID 适用于您授权其访问应用的 Google Cloud 服务帐号。

bq

使用 bq mk 命令。 如需获取采用 JSON 格式的输出,请使用 --format=json 参数。

bq mk --connection --connection_type='Azure' \
  --tenant_id=TENANT_ID \
  --location=AZURE_LOCATION \
  --federated_azure=true \
  --federated_app_client_id=APP_ID \
  CONNECTION_NAME

替换以下内容:

  • TENANT_ID:包含 Azure Storage 帐号的 Azure 目录的租户 ID。
  • AZURE_LOCATION:Azure Storage 数据所在的 Azure 区域。BigQuery Omni 支持 azure-eastus2 区域。
  • APP_ID:Azure 应用(客户端)ID。如需了解如何获取此 ID,请参阅在 Azure 租户中创建应用
  • CONNECTION_NAME:连接的名称。

输出内容类似如下:

Connection CONNECTION_NAME successfully created
Please add the following identity to your Azure application APP_ID
Identity: SUBJECT_ID

此输出包括以下值:

  • APP_ID:您创建的应用的 ID。
  • SUBJECT_ID:用户授权其访问应用的 Google Cloud 服务帐号的 ID。在 Azure 中创建联合凭据时,此值是必需的。

请记下 APP_IDSUBJECT_ID 值,以便在后续步骤中使用。

接下来,为您的应用添加联合凭据。

添加联合凭据

如需创建联合凭据,请按照以下步骤操作:

  1. 在 Azure 门户中,转到应用注册,然后点击您的应用。

  2. 选择“Certificates & secrets”(证书和密钥)>“Federated credentials”(联合凭据)> 添加凭据。之后,执行以下操作:

    1. Federated credential scenario(联合凭据场景)列表中,选择 Other issuer(其他颁发者)。

    2. 对于颁发者,输入 https://accounts.google.com

    3. 对于 Subject identifier(使用者标识符),输入您在创建 BigQuery Azure 连接时获得的 Google Cloud 服务帐号的 ID。

    4. 对于名称,输入凭据的名称。

    5. 点击添加

如需了解详情,请参阅将应用配置为信任外部身份提供方(预览版)

为 BigQuery 的 Azure 应用分配角色

如需为 BigQuery 的 Azure 应用分配角色,请使用 Azure 门户、Azure PowerShell 或 Microsoft Management REST API:

Azure 门户

您可以具有 Microsoft.Authorization/roleAssignments/write 权限的用户身份登录 Azure 门户,以在该门户中执行角色分配。通过角色分配,BigQuery Azure 连接可以访问角色政策中指定的 Azure Storage 数据。

如需使用 Azure 门户添加角色分配,请按照以下步骤操作:

  1. 从 Azure Storage 帐号,在搜索栏中输入 IAM

  2. 点击 Access Control (IAM)(访问权限控制 (IAM))。

  3. 点击添加,然后选择添加角色分配

  4. 如需提供只读权限,请选择 Storage Blob Data Reader 角色。如需提供读写权限,请选择 Storage Blob Data Contributor 角色。

  5. 分配权限设置为用户、群组或服务主帐号

  6. 点击选择成员

  7. 选择字段中,输入您在 Azure 租户中创建应用时提供的 Azure 应用名称。

  8. 点击保存

如需了解详情,请参阅使用 Azure 门户分配 Azure 角色

Azure PowerShell

如需在资源范围内为服务主帐号添加角色分配,您可以使用 New-AzRoleAssignment 命令

  New-AzRoleAssignment`
   -SignInName APP_NAME`
   -RoleDefinitionName ROLE_NAME`
   -ResourceName RESOURCE_NAME`
   -ResourceType RESOURCE_TYPE`
   -ParentResource PARENT_RESOURCE`
   -ResourceGroupName RESOURCE_GROUP_NAME

替换以下内容:

  • APP_NAME:应用名称。
  • ROLE_NAME:您要分配的角色名称。
  • RESOURCE_NAME:资源名称。
  • RESOURCE_TYPE:资源类型。
  • PARENT_RESOURCE:父级资源。
  • RESOURCE_GROUP_NAME:资源组名称。

如需详细了解如何使用 Azure PowerShell 添加新的服务主帐号,请参阅使用 Azure PowerShell 分配 Azure 角色

Azure CLI

如需在资源范围内为服务主帐号添加角色分配,您可以使用 Azure 命令行工具。您必须拥有存储帐号的 Microsoft.Authorization/roleAssignments/write 权限才能授予角色。

如需为服务主帐号分配角色(例如 Storage Blob Data Contributor 角色),请运行 az role assignment create 命令

  az role assignment create --role "Storage Blob Data Contributor" \
    --assignee-object-id ${SP_ID} \
    --assignee-principal-type ServicePrincipal \
    --scope   subscriptions/SUBSCRIPTION_ID/resourcegroups/RESOURCE_GROUP_NAME/providers/Microsoft.Storage/storageAccounts/STORAGE_ACCOUNT_NAME

替换以下内容:

  • SP_ID:服务主帐号 ID。此服务主帐号适用于您创建的应用。如需获取联合连接的服务主帐号,请参阅服务主帐号对象
  • STORAGE_ACCOUNT_NAME:存储帐号名称。
  • RESOURCE_GROUP_NAME:资源组名称。
  • SUBSCRIPTION_ID:订阅 ID。

如需了解详情,请参阅使用 Azure CLI 分配 Azure 角色

Microsoft REST API

如需为服务主帐号添加角色分配,您可以向 Microsoft Management 发送 HTTP 请求。

如需调用 Microsoft Graph REST API,请检索应用的 OAuth 令牌。如需了解详情,请参阅在没有用户的情况下获取访问权限。调用 Microsoft Graph REST API 的应用必须具有 Application.ReadWrite.All 应用权限。

如需生成 OAuth 令牌,请运行以下命令:

  export TOKEN=$(curl -X POST \
    https://login.microsoftonline.com/TENANT_ID/oauth2/token \
    -H 'cache-control: no-cache' \
    -H 'content-type: application/x-www-form-urlencoded' \
    --data-urlencode "grant_type=client_credentials" \
    --data-urlencode "resource=https://graph.microsoft.com/" \
    --data-urlencode "client_id=CLIENT_ID" \
    --data-urlencode "client_secret=CLIENT_SECRET" \
  | jq --raw-output '.access_token')

替换以下内容:

  • TENANT_ID:与包含 Azure Storage 帐号的 Azure 目录的 ID 匹配的租户 ID。
  • CLIENT_ID:Azure 客户端 ID。
  • CLIENT_SECRET:Azure 客户端密钥。

获取要为服务主帐号分配的 Azure 内置角色的 ID。

以下是一些常见角色:

如需为服务主帐号分配角色,请针对 Azure Resource Management REST API 调用 Microsoft Graph REST API:

  export ROLE_ASSIGNMENT_ID=$(uuidgen)
  curl -X PUT \
'https://management.azure.com/subscriptions/SUBSCRIPTION_ID/resourcegroups/RESOURCE_GROUP_NAME/providers/Microsoft.Storage/storageAccounts/STORAGE_ACCOUNT_NAME/providers/Microsoft.Authorization/roleAssignments/ROLE_ASSIGNMENT_ID?api-version=2018-01-01-preview' \
    -H "authorization: Bearer ${TOKEN?}" \
    -H 'cache-control: no-cache' \
    -H 'content-type: application/json' \
    -d '{
        "properties": {
            "roleDefinitionId": "subscriptions/SUBSCRIPTION_ID/resourcegroups/RESOURCE_GROUP_NAME/providers/Microsoft.Storage/storageAccounts/STORAGE_ACCOUNT_NAME/providers/Microsoft.Authorization/roleDefinitions/ROLE_ID",
            "principalId": "SP_ID"
        }
    }'

替换以下内容:

  • ROLE_ASSIGNMENT_ID:角色 ID。
  • SP_ID:服务主帐号 ID。此服务主帐号适用于您创建的应用。如需获取联合连接的服务主帐号,请参阅服务主对象
  • SUBSCRIPTION_ID:订阅 ID。
  • RESOURCE_GROUP_NAME:资源组名称。
  • STORAGE_ACCOUNT_NAME:存储帐号名称。
  • SUBSCRIPTION_ID:订阅 ID。

连接现在可以使用了。但是,Azure 中的角色分配可能存在传播延迟。如果您由于权限问题而无法使用连接,请稍后重试。

使用非联合身份

如需使用非联合身份访问数据,请按照以下步骤操作:

  1. 创建 BigQuery Azure 连接
  2. 创建 Azure AD 服务主帐号
  3. 为 BigQuery 的 Azure AD 应用分配角色

如需详细了解如何使用非联合身份访问 Azure 中的数据,请参阅 Azure AD 应用

创建 BigQuery Azure 连接

如需创建 BigQuery Azure 连接,请使用 Google Cloud 控制台或 bq 命令行工具:

控制台

  1. 在 Google Cloud Console 中,转到 BigQuery 页面。

    转到 BigQuery

  2. 添加数据菜单中,选择外部数据源

  3. 外部数据源窗格中,输入以下信息:

    • 对于连接类型,选择 Azure 上的 BigLake(通过 BigQuery Omni)
    • 对于连接 ID,输入连接资源的标识符。可使用字母、数字、短划线和下划线。
    • 对于连接位置,选择 azure-eastus2
    • 可选:对于易记名称,输入方便用户使用的连接名称,例如 My connection resource。易记名称可以是任何容易辨识的值,让您以后在需要修改连接资源时能够轻松识别。
    • 可选:对于说明,输入此连接资源的说明。
    • 对于 Azure 租户 ID,输入 Azure 租户 ID,也称为目录(租户)ID。

  4. 点击创建连接

  5. 探索器面板中,点击您在其中创建连接 ID 的数据集,然后点击连接 ID 以查看其详细信息。

  6. 连接信息部分中,记下 Azure 应用 IDAzure 应用名称的值。为 BigQuery 的 Azure 应用分配角色时,这些值是必需的。

bq

使用 bq mk 命令。 如需获取采用 JSON 格式的输出,请使用 --format=json 参数。

bq mk --connection --connection_type='Azure' \
  --tenant_id=TENANT_ID \
  --location=AZURE_LOCATION \
  CONNECTION_NAME

替换以下内容:

  • TENANT_ID:包含 Azure Storage 帐号的 Azure 目录的租户 ID。
  • AZURE_LOCATION:Azure Storage 数据所在的 Azure 区域。BigQuery Omni 支持 azure-eastus2 区域。
  • CONNECTION_NAME:连接的名称。

输出内容类似如下:

  Please create a Service Principal in your directory for
  appId: APP_ID,
  and perform role assignment to
  app: APP_NAME
  to allow BigQuery to access your Azure data.

此输出包括以下值:

  • APP_ID:您创建的应用的 ID。
  • APP_NAME:分配角色以允许 BigQuery 访问 Azure 数据所需的应用名称。

请记下 APP_IDAPP_NAME 值,以便在后续步骤中使用。

如需了解详情,请参阅创建 BigQuery Azure 连接

创建 Azure AD 服务主帐号

如需创建 Azure AD 服务主帐号,请使用 Google Cloud 控制台、Azure PowerShell、Azure 命令行工具或 Microsoft Graph REST API:

控制台

  1. 在控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 探索器面板中,点击您创建的 BigQuery Azure 连接。

  3. 连接信息窗格上,点击登录 Azure 帐号

  4. 登录您的 Azure 帐号。

  5. 请求的权限页面上,点击接受

Azure PowerShell

如需为之前返回的应用 ID APP_ID 创建服务主帐号,用户必须拥有 Microsoft.directory/servicePrincipals/create 权限。

如需创建服务主帐号,请运行 New-AzADServicePrincipal 命令

New-AzADServicePrincipal`
-ApplicationId APP_ID`
-SkipAssignment

APP_ID 替换为之前返回的应用 ID。

Azure CLI

如需为之前返回的应用 ID APP_ID 创建服务主帐号,您可以使用 Azure 命令行工具。您必须拥有 Microsoft.directory/servicePrincipals/create 权限才能创建服务主帐号。

如需创建服务主帐号,请运行 az ad sp 命令

export SP_ID=$(az ad sp create --id APP_ID | jq --raw-output '.objectId')

APP_ID 替换为之前返回的应用 ID。

Microsoft REST API

如需为之前返回的应用 ID APP_ID 创建服务主帐号,您可以向 Microsoft Graph REST API 发送 HTTP 请求。

如需调用 Microsoft Graph REST API,请检索应用的 OAuth 令牌。如需了解详情,请参阅在没有用户的情况下获取访问权限。用于调用 Microsoft Graph REST API 的应用应具有 Application.ReadWrite.All 应用权限。

TENANT_ID 应与包含 Azure Storage 帐号的 Azure 目录的 ID 匹配。

如需生成 OAuth 令牌,请运行以下命令:

export TOKEN=$(curl -X POST \
https://login.microsoftonline.com/TENANT_ID/oauth2/token \
-H 'cache-control: no-cache' \
-H 'content-type: application/x-www-form-urlencoded' \
--data-urlencode "grant_type=client_credentials" \
--data-urlencode "resource=https://graph.microsoft.com/" \
--data-urlencode "client_id=CLIENT_ID" \
--data-urlencode "client_secret=CLIENT_SECRET" \
| jq --raw-output '.access_token')

请替换以下内容:

  • TENANT_ID:包含 Azure Storage 帐号的 Azure 目录的租户 ID。
  • CLIENT_ID:Azure 客户端 ID。
  • CLIENT_SECRET:Azure 客户端密钥。

运行以下命令:

export APP_ID=APP_ID

APP_ID 替换为返回的应用 ID。

如需通过调用 Microsoft Graph REST API 来创建服务主帐号,请运行以下命令:

export SP_ID=$(curl -X POST \
https://graph.microsoft.com/v1.0/serviceprincipals \
-H "authorization: Bearer ${TOKEN?}" \
-H 'cache-control: no-cache' \
-H 'content-type: application/json' \
-d "{
  \"appId\": \"${APP_ID?}\"
}" | jq --raw-output '.id')

替换以下内容:

  • TOKEN:应用的 OAuth 令牌。
  • APP_ID:之前返回的应用 ID。

为 BigQuery 的 Azure AD 应用分配角色

Azure 门户

您可以具有 Microsoft.Authorization/roleAssignments/write 权限的用户身份登录 Azure 门户,以在该门户中执行角色分配。通过角色分配,BigQuery Azure 连接可以访问角色政策中指定的 Azure Storage 数据。

如需使用 Azure 门户添加角色分配,请按照以下步骤操作:

  1. 从 Azure Storage 帐号,在搜索栏中输入 IAM

  2. 点击 Access Control (IAM)(访问权限控制 (IAM))。

  3. 点击添加,然后选择添加角色分配

  4. 如需提供只读权限,请选择 Storage Blob Data Reader 角色。如需提供读写权限,请选择 Storage Blob Data Contributor 角色。

  5. 分配权限设置为用户、群组或服务主帐号

  6. 点击选择成员

  7. 选择字段中,输入您在创建 BigQuery Azure 连接时返回的 Azure 应用名称。

  8. 点击保存

如需了解详情,请参阅使用 Azure 门户分配 Azure 角色

Azure PowerShell

如需在资源范围内为服务主帐号添加角色分配,您可以使用 New-AzRoleAssignment 命令

  New-AzRoleAssignment`
   -SignInName APP_NAME`
   -RoleDefinitionName ROLE_NAME`
   -ResourceName RESOURCE_NAME`
   -ResourceType RESOURCE_TYPE`
   -ParentResource PARENT_RESOURCE`
   -ResourceGroupName RESOURCE_GROUP_NAME

替换以下内容:

  • APP_NAME:应用名称。
  • ROLE_NAME:您要分配的角色名称。
  • RESOURCE_NAME:资源名称。
  • RESOURCE_TYPE:资源类型。
  • PARENT_RESOURCE:父级资源。
  • RESOURCE_GROUP_NAME:资源组名称。

如需详细了解如何使用 Azure PowerShell 添加新的服务主帐号,请参阅使用 Azure PowerShell 分配 Azure 角色

Azure CLI

如需在资源范围内为服务主帐号添加角色分配,您可以使用 Azure 命令行工具。您必须拥有存储帐号的 Microsoft.Authorization/roleAssignments/write 权限才能授予角色。

如需为服务主帐号分配角色(例如 Storage Blob Data Contributor 角色),请运行 az role assignment create 命令

  az role assignment create --role "Storage Blob Data Contributor" \
    --assignee-object-id ${SP_ID} \
    --assignee-principal-type ServicePrincipal \
    --scope   subscriptions/SUBSCRIPTION_ID/resourcegroups/RESOURCE_GROUP_NAME/providers/Microsoft.Storage/storageAccounts/STORAGE_ACCOUNT_NAME

替换以下内容:

  • SP_ID:服务主帐号 ID。
  • STORAGE_ACCOUNT_NAME:存储帐号名称。
  • RESOURCE_GROUP_NAME:资源组名称。
  • SUBSCRIPTION_ID:订阅 ID。

如需了解详情,请参阅使用 Azure CLI 分配 Azure 角色

Microsoft REST API

如需为服务主帐号添加角色分配,您可以向 Microsoft Management 发送 HTTP 请求。

如需调用 Microsoft Graph REST API,请检索应用的 OAuth 令牌。如需了解详情,请参阅在没有用户的情况下获取访问权限。调用 Microsoft Graph REST API 的应用必须具有 Application.ReadWrite.All 应用权限。

如需生成 OAuth 令牌,请运行以下命令:

  export TOKEN=$(curl -X POST \
    https://login.microsoftonline.com/TENANT_ID/oauth2/token \
    -H 'cache-control: no-cache' \
    -H 'content-type: application/x-www-form-urlencoded' \
    --data-urlencode "grant_type=client_credentials" \
    --data-urlencode "resource=https://graph.microsoft.com/" \
    --data-urlencode "client_id=CLIENT_ID" \
    --data-urlencode "client_secret=CLIENT_SECRET" \
  | jq --raw-output '.access_token')

替换以下内容:

  • TENANT_ID:与包含 Azure Storage 帐号的 Azure 目录的 ID 匹配的租户 ID。
  • CLIENT_ID:Azure 客户端 ID。
  • CLIENT_SECRET:Azure 客户端密钥。

获取要为服务主帐号分配的 Azure 内置角色的 ID。

以下是一些常见角色:

如需为服务主帐号分配角色,请针对 Azure Resource Management REST API 调用 Microsoft Graph REST API:

  export ROLE_ASSIGNMENT_ID=$(uuidgen)
  curl -X PUT \
'https://management.azure.com/subscriptions/SUBSCRIPTION_ID/resourcegroups/RESOURCE_GROUP_NAME/providers/Microsoft.Storage/storageAccounts/STORAGE_ACCOUNT_NAME/providers/Microsoft.Authorization/roleAssignments/ROLE_ASSIGNMENT_ID?api-version=2018-01-01-preview' \
    -H "authorization: Bearer ${TOKEN?}" \
    -H 'cache-control: no-cache' \
    -H 'content-type: application/json' \
    -d '{
        "properties": {
            "roleDefinitionId": "subscriptions/SUBSCRIPTION_ID/resourcegroups/RESOURCE_GROUP_NAME/providers/Microsoft.Storage/storageAccounts/STORAGE_ACCOUNT_NAME/providers/Microsoft.Authorization/roleDefinitions/ROLE_ID",
            "principalId": "SP_ID"
        }
    }'

替换以下内容:

  • ROLE_ASSIGNMENT_ID:角色 ID。
  • SP_ID:服务主帐号 ID。
  • SUBSCRIPTION_ID:订阅 ID。
  • RESOURCE_GROUP_NAME:资源组名称。
  • STORAGE_ACCOUNT_NAME:存储帐号名称。
  • SUBSCRIPTION_ID:订阅 ID。

连接现在可以使用了。但是,Azure 中的角色分配可能存在传播延迟。如果您由于权限问题而无法使用连接,请稍后重试。

后续步骤