Conectar ao armazenamento de blobs

Como administrador do BigQuery, é possível criar uma conexão para permitir que os analistas de dados acessem dados armazenados no Armazenamento de blobs do Azure.

O BigQuery Omni usa conexões para acessar os dados do Armazenamento de blobs. O BigQuery Omni é compatível com a federação de identidade da carga de trabalho do Azure. O suporte do BigQuery Omni à federação de identidade da carga de trabalho do Azure permite conceder acesso a um aplicativo do Azure no seu locatário a uma conta de serviço do Google. Não há segredos do cliente do aplicativo a serem gerenciados por você ou pelo Google.

Depois de criar uma conexão com o BigQuery Azure, consulte os dados do Armazenamento de blobs ou exporte os resultados da consulta para o Armazenamento de blobs.

Antes de começar

Funções exigidas

Cotas

Para mais informações sobre cotas, consulte API BigQuery Connection.

Criar uma conexão do Azure

Para criar uma origem do Azure, siga estas etapas:

  1. Crie um aplicativo no locatário do Azure.
  2. Crie a conexão do BigQuery para Azure.
  3. Adicione uma credencial federada.
  4. Atribua um papel aos aplicativos Azure AD do BigQuery.

Para mais informações sobre o uso de credenciais de identidade federadas para acessar dados no Azure, consulte Federação de identidade da carga de trabalho.

Criar um aplicativo no locatário do Azure

Para criar um aplicativo no locatário do Azure, siga estas etapas:

Portal do Azure

  1. No portal do Azure, acesse App registrations e clique em New registration.

  2. Em Nomes, digite um nome para o aplicativo.

  3. Em Supported account types, selecione Accounts in this organizational directory only.

  4. Para registrar o novo aplicativo, clique em Register.

  5. Anote o ID do aplicativo (cliente). É necessário fornecer esse ID ao criar a conexão.

    Portal do Azure para criar aplicativos

Terraform

Adicione o seguinte ao seu arquivo de configuração do 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
  }

Para mais informações, confira como registrar um aplicativo no Azure.

Criar uma conexão

Console

  1. No Console do Google Cloud, acesse a página BigQuery.

    Ir para o BigQuery

  2. No menu Adicionar, selecione Fonte de dados externa.

  3. No painel Fonte de dados externa, insira as seguintes informações:

    • Em Tipo de conexão, selecione BigLake on Azure (via BigQuery Omni).
    • Em ID da conexão, insira um identificador para o recurso de conexão. Você pode usar letras, números, traços e sublinhados.
    • Selecione o local em que você quer criar a conexão.
    • (Opcional) Em Nome amigável, insira um nome fácil de usar para a conexão, como My connection resource. O nome intuitivo pode ser qualquer valor que ajude você a identificar o recurso de conexão se precisar modificá-lo mais tarde.
    • Opcional: em Descrição, insira uma descrição para este recurso de conexão.
    • Em ID do locatário do Azure, insira o ID do locatário do Azure, também conhecido como ID do diretório (locatário).
    • Ative a caixa de seleção Usar identidade federada e insira o ID do aplicativo federado do Azure (cliente).

      Para saber como conseguir os IDs do Azure, consulte Criar um aplicativo no locatário do Azure.

  4. Clique em Criar conexão.

  5. Clique em Ir para conexão.

  6. Na seção Informações da conexão, anote o valor da identidade do Google BigQuery, que é o ID da conta de serviço. Esse ID é da conta de serviço do Google Cloud que você autoriza a acessar seu aplicativo.

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

Substitua TENANT_ID pelo ID de locatário do diretório do Azure que contém a conta do Armazenamento de Blobs.

bq

Use o comando bq mk. Para receber a saída no formato JSON, use o 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

Substitua:

  • TENANT_ID: o ID do locatário do diretório do Azure que contém a conta do Azure Storage.
  • AZURE_LOCATION: a região do Azure onde os dados do Azure Storage estão localizados. O BigQuery Omni é compatível com a região azure-eastus2.
  • APP_ID: o ID do aplicativo (cliente) do Azure. Para saber como conseguir esse ID, consulte Criar aplicativo no locatário do Azure.
  • CONNECTION_ID: o nome da conexão.

O resultado será assim:

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

Esta saída inclui os seguintes valores:

  • APP_ID: o ID do aplicativo que você criou.

  • SUBJECT_ID: o ID da conta de serviço do Google Cloud que o usuário autoriza a acessar o aplicativo. Esse valor é necessário ao criar uma credencial federada no Azure.

Anote os valores APP_ID e SUBJECT_ID para usar nas próximas etapas.

Em seguida, adicione uma credencial federada para o aplicativo.

Adicionar uma credencial federada

Para criar uma credencial federada, siga estas etapas:

Portal do Azure

  1. No portal do Azure, acesse App registrations e, em seguida, clique no aplicativo.

  2. Selecione Certificates & secrets > Federated credentials > Add credentials. Em seguida, faça o seguinte:

    1. Na lista Federated credential scenario, selecione Other issuer.

    2. Em Issuer, digite https://accounts.google.com.

    3. Em Identificador de assunto, insira a identidade do Google BigQuery da conta de serviço do Google Cloud que você recebeu quando criou a conexão.

    4. Em Name, digite um nome para a credencial.

    5. Clique em Adicionar.

Terraform

Adicione o seguinte ao seu arquivo de configuração do 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 saber mais, consulte Configurar um aplicativo para confiar em um provedor de identidade externo.

Atribuir um papel aos aplicativos Azure do BigQuery

Para atribuir um papel ao aplicativo do Azure AD do BigQuery, use o portal do Azure, o Azure PowerShell ou a API REST Microsoft Management:

Portal do Azure

É possível executar atribuições de papéis no Portal do Azure fazendo login como um usuário com a permissão Microsoft.Authorization/roleAssignments/write. A atribuição de papéis permite que a conexão do BigQuery para Azure acesse os dados do Azure Storage, conforme especificado na política de papéis.

Para adicionar atribuições de papéis usando o portal do Azure, siga estas etapas:

  1. Na conta do Azure Storage, insira IAM na barra de pesquisa.

  2. Clique em Controle de acesso (IAM).

  3. Clique em Adicionar e selecione Adicionar atribuições de função.

  4. Para conceder o acesso somente leitura, selecione o papel Leitor de dados de blob do Storage. Para conceder o acesso de leitura e gravação, selecione o papel Colaborador de dados de blob do Storage.

  5. Defina Atribuir acesso a como Usuário, grupo ou principal de serviço.

  6. Clique em Selecionar participantes.

  7. No campo Selecionar, insira o nome que você deu ao aplicativo Azure quando o criou no locatário do Azure.

  8. Clique em Salvar.

Para mais informações, consulte Atribuir papéis do Azure usando o portal do Azure.

Terraform

Adicione o seguinte ao seu arquivo de configuração do 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 adicionar uma atribuição de papel a um principal de serviço em um escopo de recurso, use o comando New-AzRoleAssignment:

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

Substitua:

  • APP_NAME: o nome do aplicativo.
  • ROLE_NAME: o nome do papel que você quer atribuir.
  • RESOURCE_NAME: o nome do recurso.
  • RESOURCE_TYPE: o tipo de recurso.
  • PARENT_RESOURCE: o recurso pai.
  • RESOURCE_GROUP_NAME: o nome do grupo de recursos.

Para mais informações sobre como usar o Azure PowerShell para adicionar um novo principal de serviço, consulte Atribuir papéis do Azure usando o Azure PowerShell.

CLI do Azure

Para adicionar uma atribuição de papel a um principal de serviço em um escopo de recurso, use a ferramenta de linha de comando do Azure. É necessário ter a permissão Microsoft.Authorization/roleAssignments/write para que a conta de armazenamento conceda papéis.

Para atribuir um papel, como o de colaborador de dados de blob do Storage, ao principal de serviço, execute o az role assignment create comando:

  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

Substitua:

  • SP_ID: o ID do principal de serviço. Esse principal de serviço é do aplicativo que você criou. Para acessar o principal de serviço de uma conexão federada, consulte Objeto de principal de serviço.
  • STORAGE_ACCOUNT_NAME: o nome da conta de armazenamento.
  • RESOURCE_GROUP_NAME: o nome do grupo de recursos.
  • SUBSCRIPTION_ID: O ID da assinatura.

Para mais informações, consulte Atribuir papéis do Azure usando a CLI do Azure.

API REST Microsoft

Para adicionar atribuições de papel a um principal de serviço, envie uma solicitação HTTP ao Microsoft Management.

Para chamar a API REST Microsoft Graph, recupere um token OAuth de um aplicativo. Para mais informações, consulte Receber acesso sem um usuário. O aplicativo que chamou a API REST Microsoft Graph precisa ter a permissão Application.ReadWrite.All.

Para gerar um token OAuth, execute o seguinte 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')

Substitua:

  • TENANT_ID: o ID do locatário correspondente ao ID do diretório do Azure que contém a conta do Azure Storage.
  • CLIENT_ID: o ID do cliente do Azure.
  • CLIENT_SECRET: a chave secreta do cliente do Azure.

Consiga o ID dos papéis integrados do Azure que você quer atribuir ao principal de serviço.

Confira alguns papéis comuns:

Para atribuir um papel ao principal de serviço, chame a API REST Microsoft Graph para a API REST 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"
        }
    }'

Substitua:

  • ROLE_ASSIGNMENT_ID: o ID do papel.
  • SP_ID: o ID do principal de serviço. Esse principal de serviço é do aplicativo que você criou. Para acessar o principal de serviço de uma conexão federada, consulte Objeto de principal de serviço.
  • SUBSCRIPTION_ID: O ID da assinatura.
  • RESOURCE_GROUP_NAME: o nome do grupo de recursos.
  • STORAGE_ACCOUNT_NAME: o nome da conta de armazenamento.
  • SUBSCRIPTION_ID: O ID da assinatura.

A conexão está pronta para ser usada. No entanto, pode haver um atraso de propagação para uma atribuição de papel no Azure. Se não for possível usar a conexão devido a problemas de permissão, tente novamente após algum tempo.

Compartilhar conexões com os usuários

Você pode conceder os seguintes papéis para permitir que os usuários consultem dados e gerenciem conexões:

  • roles/bigquery.connectionUser: permite aos usuários usar conexões para se conectar a fontes de dados externas e executar consultas nelas.

  • roles/bigquery.connectionAdmin: permite que os usuários gerenciem conexões.

Para mais informações sobre os papéis e as permissões do IAM no BigQuery, consulte Papéis e permissões predefinidos.

Selecione uma das seguintes opções:

Console

  1. Acessar a página do BigQuery.

    Ir para o BigQuery

    As conexões são listadas no projeto, em um grupo chamado Conexões externas.

  2. No painel Explorer, clique no nome do seu projeto > Conexões externas > conexão.

  3. No painel Detalhes, clique em Compartilhar para compartilhar uma conexão. Em seguida, siga estas etapas:

    1. Na caixa de diálogo Permissões de conexão, compartilhe a conexão com outros principais adicionando ou editando principais.

    2. Clique em Salvar.

bq

Não é possível compartilhar uma conexão com a ferramenta de linha de comando bq. Para compartilhar um recurso de conexão, use o console do Google Cloud ou o método da API BigQuery Connections para compartilhar uma conexão.

API

Consulte o método projects.locations.connections.setIAM na seção de referência da API REST BigQuery Connections e forneça uma instância do recurso policy.

Java

Antes de testar esta amostra, siga as instruções de configuração do Java no Guia de início rápido do BigQuery: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API BigQuery em Java.

Para autenticar no BigQuery, configure o Application Default Credentials. Para mais informações, acesse Configurar a autenticação para bibliotecas de 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");
    }
  }
}

A seguir