Conéctate a Blob Storage

Como administrador de BigQuery, puedes crear una conexión para permitir que los analistas de datos accedan a los datos almacenados en Azure Blob Storage.

BigQuery Omni accede a los datos de Blob Storage mediante conexiones. BigQuery Omni admite la federación de identidades para cargas de trabajo de Azure. La compatibilidad de BigQuery Omni con la federación de identidades para cargas de trabajo de Azure te permite otorgar acceso a una cuenta de servicio de Google para una aplicación de Azure en tu usuario. No hay secretos de cliente de aplicación que tú o Google administren.

Después de crear una conexión de BigQuery Azure, puedes consultar los datos de Blob Storage o exportar los resultados de las consultas a Blob Storage.

Antes de comenzar

Roles obligatorios

Cuotas

Para obtener más información acerca de las cuotas, consulta API de BigQuery Connection.

Crea una conexión de Azure

Para crear una fuente de Azure, sigue estos pasos:

  1. Crea una aplicación en tu instancia de Azure.
  2. Crea la conexión de BigQuery de Azure.
  3. Agrega una credencial federada.
  4. Asigna un rol a las aplicaciones de BigQuery Azure AD.

Si deseas obtener más información sobre el uso de credenciales de identidad federada para acceder a los datos en Azure, consulta Federación de Workload Identity.

Crea una aplicación en tu instancia de Azure

Para crear una aplicación en tu instancia de Azure, sigue estos pasos:

Portal de Azure

  1. En el portal de Azure, ve a Registros de apps y, luego, haz clic en Nuevo registro.

  2. En Nombres, ingresa un nombre para tu aplicación.

  3. En Tipos de cuentas compatibles, selecciona Cuentas en este directorio de la organización solo.

  4. Para registrar la aplicación nueva, haz clic en Registrar.

  5. Toma nota del ID de aplicación (cliente). Debes proporcionar este ID cuando crees la conexión.

    Portal de Azure para crear aplicaciones

Terraform

Agrega lo siguiente al archivo de configuración de Terraform:

  resource "azuread_application" "example" {
    display_name = "bigquery-omni-connector"
  }

  resource "azuread_service_principal" "example" {
    application_id               = azuread_application.example.application_id
    app_role_assignment_required = false
  }

Si deseas obtener más información, consulta cómo registrar una aplicación en Azure.

Crear una conexión

Console

  1. En la consola de Google Cloud, ve a la página de BigQuery.

    Ir a BigQuery

  2. En el menú Agregar datos, selecciona Fuentes de datos externa.

  3. En el panel Fuente de datos externa, ingresa la siguiente información:

    • En Tipo de conexión, selecciona BigLake on Azure (mediante BigQuery Omni).
    • En ID de conexión, ingresa un identificador para el recurso de conexión. Puedes usar letras, números, guiones y guiones bajos.
    • Selecciona la ubicación en la que deseas crear la conexión.
    • En Nombre descriptivo, ingresa un nombre fácil de usar para la conexión, como My connection resource (opcional). El nombre descriptivo puede ser cualquier valor que te ayude a identificar el recurso de conexión si necesitas modificarlo más adelante.
    • En Descripción, ingresa una descripción para este recurso de conexión (opcional).
    • En ID de usuario de Azure, ingresa el ID del usuario de Azure, que también se conoce como ID del directorio (usuario).
    • Habilita la casilla de verificación Usar identidad federada y, luego, ingresa el ID de la aplicación federada de Azure (cliente).

      Para obtener información sobre cómo obtener IDs de Azure, consulta Crea una aplicación en tu instancia de Azure.

  4. Haz clic en Crear conexión (Create connection).

  5. Haz clic en Ir a la conexión.

  6. En la sección Información de conexión, anota el valor de Identidad de Google de BigQuery, que es el ID de la cuenta de servicio. Este ID es para la cuenta de servicio de Google Cloud que autorizas a acceder a tu aplicación.

Terraform

  resource "google_bigquery_connection" "connection" {
    connection_id = "omni-azure-connection"
    location      = "azure-eastus2"
    description   = "created by terraform"

    azure {
      customer_tenant_id              = "TENANT_ID"
      federated_application_client_id = azuread_application.example.application_id
    }
  }

Reemplaza TENANT_ID por el ID de usuario del directorio de Azure que contiene la cuenta de Blob Storage.

bq

Usa el comando bq mk. Para obtener el resultado en formato JSON, usa el parámetro --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_ID

Reemplaza lo siguiente:

  • TENANT_ID: El ID de usuario del directorio de Azure que contiene la cuenta de Azure Storage.
  • AZURE_LOCATION: La región de Azure en la que se encuentran los datos de Azure Storage BigQuery Omni admite la región azure-eastus2.
  • APP_ID: El ID de la aplicación de Azure (cliente). Para aprender a obtener este ID, consulta Crear aplicación en un usuario de Azure.
  • CONNECTION_ID: Es el nombre de la conexión.

El resultado es similar a este:

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

En esta salida, se incluyen los siguientes valores:

  • APP_ID: el ID de la aplicación que creaste.

  • SUBJECT_ID: el ID de la cuenta de servicio de Google Cloud que el usuario autoriza para acceder a su aplicación. Este valor es obligatorio cuando creas una credencial federada en Azure.

Toma nota de los valores APP_ID y SUBJECT_ID para usarlos en los siguientes pasos.

A continuación, agrega una credencial federada para la aplicación.

Agrega una credencial federada

Para crear una credencial nueva, sigue estos pasos:

Portal de Azure

  1. En el portal de Azure, ve a Registros de apps y, luego, haz clic en tu aplicación.

  2. Selecciona Certificados y secretos > Credenciales federadas > Agregar credenciales. A continuación, sigue estos pasos:

    1. En la lista Situación de credencial federada, selecciona Otro emisor.

    2. En Emisor, ingresa https://accounts.google.com.

    3. En Identificador de asunto, ingresa la identidad de Google de BigQuery de la cuenta de servicio de Google Cloud que obtuviste cuando creaste la conexión.

    4. En Nombre, ingresa un nombre para la credencial.

    5. Haz clic en Agregar.

Terraform

Agrega lo siguiente al archivo de configuración de Terraform:

  resource "azuread_application" "example" {
    display_name = "bigquery-omni-connector"
  }

  resource "azuread_service_principal" "example" {
    application_id               = azuread_application.example.application_id
    app_role_assignment_required = false
  }

  resource "azuread_application_federated_identity_credential" "example" {
    application_object_id = azuread_application.example.object_id
    display_name          = "omni-federated-credential"
    description           = "BigQuery Omni federated credential"
    audiences             = ["api://AzureADTokenExchange"]
    issuer                = "https://accounts.google.com"
    subject               = google_bigquery_connection.connection.azure[0].identity
  }

Para obtener más información, consulta Configura una app para que confíe en un proveedor de identidad externo.

Asigna un rol a las aplicaciones de Azure de BigQuery

Para asignar un rol a la aplicación de Azure de BigQuery, usa el Portal de Azure, Azure PowerShell o la API de REST de Management de Microsoft:

Portal de Azure

Para realizar asignaciones de funciones en el Portal de Azure, accede como un usuario con el permiso Microsoft.Authorization/roleAssignments/write. La asignación de funciones permite que la conexión de BigQuery Azure acceda a los datos de Azure Storage como se especifica en la política de funciones.

Para agregar asignaciones de roles con el Portal de Azure, sigue estos pasos:

  1. Desde tu cuenta de Azure Storage, ingresa IAM en la barra de búsqueda.

  2. Haz clic en Control de acceso (IAM).

  3. Haz clic en Add y selecciona Add role assignments.

  4. Para proporcionar acceso de solo lectura, selecciona el rol Lector de datos de almacenamiento de BLOB. Para proporcionar acceso de lectura y escritura, selecciona el rol Colaborador de datos de BLOB de almacenamiento.

  5. Configura Assign access to como User, group, or service principal.

  6. Haz clic en Seleccionar miembros.

  7. En el campo Seleccionar, ingresa el nombre de la aplicación de Azure que le asignaste cuando creaste la aplicación en el usuario de Azure. .

  8. Haz clic en Guardar.

Para obtener más información, consulta Asigna roles de Azure mediante el portal de Azure.

Terraform

Agrega lo siguiente al archivo de configuración de Terraform:

  resource "azurerm_role_assignment" "data-role" {
    scope                = data.azurerm_storage_account.example.id
    # Read permission for Omni on the storage account
    role_definition_name = "Storage Blob Data Reader"
    principal_id         = azuread_service_principal.example.id
  }

Azure PowerShell

Para agregar una asignación de rol para una principal de servicio en el alcance de un recurso, puedes usar el comando New-AzRoleAssignment:

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

Reemplaza lo siguiente:

  • APP_NAME: Es el nombre de la aplicación.
  • ROLE_NAME: Es el nombre del rol que deseas asignar.
  • RESOURCE_NAME: Es el nombre del recurso.
  • RESOURCE_TYPE: Es el tipo de recurso.
  • PARENT_RESOURCE: El recurso superior.
  • RESOURCE_GROUP_NAME: Es el nombre del grupo de recursos.

Si deseas obtener más información sobre el uso de Azure PowerShell para agregar un principal de servicio nuevo, consulta Asigna roles de Azure PowerShell.

CLI de Azure

Para agregar una asignación de rol a una principal de servicio en un permiso de recursos, puedes usar la herramienta de línea de comandos de Azure. Debes tener el permiso Microsoft.Authorization/roleAssignments/write para que la cuenta de almacenamiento otorgue roles.

Para asignar un rol, como el rol de Lector de datos de BLOB de almacenamiento, al principal de servicio, ejecuta el comando az role assignment create:

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

Reemplaza lo siguiente:

  • SP_ID: El ID del principal del servicio. Este principal del servicio es para la aplicación que creaste. Para obtener el principal del servicio para una conexión federada, consulta Objeto del principal del servicio.
  • STORAGE_ACCOUNT_NAME: Es el nombre de la cuenta de almacenamiento.
  • RESOURCE_GROUP_NAME: Es el nombre del grupo de recursos.
  • SUBSCRIPTION_ID: El ID de suscripción.

Para obtener más información, consulta Asigna funciones de Azure con la CLI de Azure.

API de REST de Microsoft

Para agregar asignaciones de roles a un principal de servicio, puedes enviar una solicitud HTTP a Microsoft Management.

A fin de llamar a la API de REST de Microsoft Graph, recupera un token de OAuth para una aplicación. Para obtener más información, consulta Obtén acceso sin un usuario. La aplicación que llamó a la API de REST del Microsoft Graph debe tener el permiso de la aplicación Application.ReadWrite.All.

Para generar un token de OAuth, ejecuta el siguiente comando:

  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')

Reemplaza lo siguiente:

  • TENANT_ID: el ID de usuario que coincide con el ID del directorio de Azure que contiene la cuenta de Azure Storage.
  • CLIENT_ID: el ID de cliente de Azure.
  • CLIENT_SECRET: el secreto del cliente de Azure.

Obtén el ID de los roles integrados de Azure que deseas asignar al principal del servicio.

Estos son algunos roles comunes:

Para asignar un rol al principio de servicio, llama a la API de REST del gráfico de Microsoft a la API de REST de Azure Resource Management:

  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"
        }
    }'

Reemplaza lo siguiente:

  • ROLE_ASSIGNMENT_ID: El ID del rol.
  • SP_ID: El ID del principal del servicio. Este principal del servicio es para la aplicación que creaste. A fin de obtener el principal de servicio para una conexión federada, consulta Objeto principal del servicio.
  • SUBSCRIPTION_ID: El ID de suscripción.
  • RESOURCE_GROUP_NAME: Es el nombre del grupo de recursos.
  • STORAGE_ACCOUNT_NAME: Es el nombre de la cuenta de almacenamiento.
  • SUBSCRIPTION_ID: El ID de suscripción.

La conexión ya está lista para usar. Sin embargo, puede haber una demora de propagación en las asignaciones de roles en Azure. Si no puedes usar la conexión debido a problemas de permisos, vuelve a intentarlo después de un tiempo.

Comparte conexiones con usuarios

Puedes otorgar los siguientes roles para permitir que los usuarios consulten datos y administren conexiones:

  • roles/bigquery.connectionUser: Permite que los usuarios usen conexiones para conectarse con fuentes de datos externas y ejecutar consultas en ellas.

  • roles/bigquery.connectionAdmin: Permite que los usuarios administren conexiones.

Para obtener más información sobre los roles y los permisos de IAM en BigQuery, consulta Roles y permisos predefinidos.

Selecciona una de las opciones siguientes:

Console

  1. Ve a la página de BigQuery.

    Ir a BigQuery

    Las conexiones se enumeran en tu proyecto, en un grupo llamado Conexiones externas.

  2. En el panel Explorador, haz clic en el nombre de tu proyecto > Conexiones externas > conexión.

  3. En el panel Detalles, haz clic en Compartir para compartir una conexión. A continuación, sigue estos pasos:

    1. En el cuadro de diálogo Permisos de conexión, agrega o edita las principales para compartir la conexión con otros principales.

    2. Haz clic en Guardar.

bq

No puedes compartir una conexión con la herramienta de línea de comandos de bq. Para compartir una conexión, usa la consola de Google Cloud o el método de la API de conexiones de BigQuery.

API

Consulta el método projects.locations.connections.setIAM en la sección de referencia de la API de REST de las conexiones de BigQuery y proporciona una instancia del recurso policy.

Java

Antes de probar este ejemplo, sigue las instrucciones de configuración para Java incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Java.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

import com.google.api.resourcenames.ResourceName;
import com.google.cloud.bigquery.connection.v1.ConnectionName;
import com.google.cloud.bigqueryconnection.v1.ConnectionServiceClient;
import com.google.iam.v1.Binding;
import com.google.iam.v1.Policy;
import com.google.iam.v1.SetIamPolicyRequest;
import java.io.IOException;

// Sample to share connections
public class ShareConnection {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "MY_PROJECT_ID";
    String location = "MY_LOCATION";
    String connectionId = "MY_CONNECTION_ID";
    shareConnection(projectId, location, connectionId);
  }

  static void shareConnection(String projectId, String location, String connectionId)
      throws IOException {
    try (ConnectionServiceClient client = ConnectionServiceClient.create()) {
      ResourceName resource = ConnectionName.of(projectId, location, connectionId);
      Binding binding =
          Binding.newBuilder()
              .addMembers("group:example-analyst-group@google.com")
              .setRole("roles/bigquery.connectionUser")
              .build();
      Policy policy = Policy.newBuilder().addBindings(binding).build();
      SetIamPolicyRequest request =
          SetIamPolicyRequest.newBuilder()
              .setResource(resource.toString())
              .setPolicy(policy)
              .build();
      client.setIamPolicy(request);
      System.out.println("Connection shared successfully");
    }
  }
}

¿Qué sigue?