Ligue-se ao armazenamento de blobs

Como administrador do BigQuery, pode criar uma associação para permitir que os analistas de dados acedam aos dados armazenados no Azure Blob Storage.

O BigQuery Omni acede aos dados do Blob Storage através de ligações. O BigQuery Omni suporta a federação de identidade de carga de trabalho do Azure. O suporte do BigQuery Omni para a federação de identidade da carga de trabalho do Azure permite-lhe conceder acesso a uma aplicação do Azure no seu inquilino a uma conta de serviço da Google. Não existem segredos de clientes de aplicações a serem geridos por si ou pela Google.

Depois de criar uma ligação do Azure ao BigQuery, pode consultar os dados do Blob Storage ou exportar os resultados da consulta para o Blob Storage.

Antes de começar

Funções necessárias

Quotas

Para mais informações acerca das quotas, consulte a API BigQuery Connection.

Crie uma ligação ao Azure

Para criar uma associação do Azure, siga estes passos:

  1. Crie uma aplicação no seu inquilino do Azure.
  2. Crie a ligação do Azure ao BigQuery.
  3. Adicione uma credencial federada.
  4. Atribua uma função às aplicações do Azure AD do BigQuery.

Para mais informações sobre a utilização de credenciais de identidade federadas para aceder a dados no Azure, consulte o artigo Federação de identidades da carga de trabalho.

Crie uma aplicação no seu inquilino do Azure

Para criar uma aplicação no seu inquilino do Azure, siga estes passos:

Portal do Azure

  1. No portal do Azure, aceda a Registos de apps e, de seguida, clique em Novo registo.

  2. Em Nomes, introduza um nome para a sua aplicação.

  3. Para Tipos de contas suportados, selecione Apenas contas neste diretório organizacional.

  4. Para registar a nova aplicação, clique em Registar.

  5. Tome nota do ID (de cliente) da aplicação. Tem de fornecer este ID quando criar a associação.

    Portal do Azure para criar aplicações

Terraform

Adicione o seguinte ao ficheiro de configuração do Terraform:

  data "azuread_client_config" "current" {}

  resource "azuread_application" "example" {
    display_name = "bigquery-omni-connector"
    owners       = [data.azuread_client_config.current.object_id]
  }

  resource "azuread_service_principal" "example" {
    client_id                    = azuread_application.example.client_id
    app_role_assignment_required = false
    owners                       = [data.azuread_client_config.current.object_id]
  }

Para mais informações, veja como registar uma aplicação no Azure.

Crie uma associação

Consola

  1. Na Google Cloud consola, aceda à página BigQuery.

    Aceda ao BigQuery

  2. No painel Explorador, clique em Adicionar dados.

    É apresentada a caixa de diálogo Adicionar dados.

  3. No painel Filtrar por, na secção Tipo de origem de dados, selecione Bases de dados.

    Em alternativa, no campo Pesquisar origens de dados, pode introduzir Azure.

  4. Na secção Origens de dados em destaque, clique em Azure Blob Storage.

  5. Clique no cartão da solução Azure Blob Storage Omni: BigQuery Federation.

  6. Na caixa de diálogo Criar tabela, no campo ID da associação, selecione Criar uma nova associação ABS.

  7. No painel Origem de dados externa, introduza as seguintes informações:

    • Em Tipo de ligação, selecione BigLake no Azure (através do BigQuery Omni).
    • Para o ID da ligação, introduza um identificador para o recurso de ligação. Pode usar letras, números, travessões e sublinhados.
    • Selecione a localização onde quer criar a associação.
    • Opcional: para Nome amigável, introduza um nome amigável para a ligação, como My connection resource. O nome amigável pode ser qualquer valor que ajude a identificar o recurso de associação se precisar de o modificar mais tarde.
    • Opcional: em Descrição, introduza uma descrição do recurso de ligação.
    • Para o ID de inquilino do Azure, introduza o ID de inquilino do Azure, que também é conhecido como ID do diretório (inquilino).
    • Ative a caixa de verificação Usar identidade federada e, em seguida, introduza o ID (de cliente) da aplicação federada do Azure.

      Para saber como obter IDs do Azure, consulte o artigo Crie uma aplicação no seu inquilino do Azure.

  8. Clique em Criar associação.

  9. Clique em Aceder à associação.

  10. Na secção Informações da ligação, tome nota do valor da identidade Google do BigQuery, que é o ID da conta de serviço. Este ID destina-se à conta de serviço que autoriza a aceder à sua aplicação.Google Cloud

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

Substitua TENANT_ID pelo ID do inquilino do diretório do Azure que contém a conta de armazenamento de blobs.

bq

Use o comando bq mk. Para obter o resultado 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 o seguinte:

  • TENANT_ID: o ID de inquilino do diretório do Azure que contém a conta de armazenamento do Azure.
  • AZURE_LOCATION: a região do Azure onde se encontram os dados do Azure Storage. O BigQuery Omni suporta a região azure-eastus2.
  • APP_ID: o ID da aplicação (cliente) do Azure. Para saber como obter este ID, consulte o artigo Crie uma aplicação no inquilino do Azure.
  • CONNECTION_ID: o nome da associação.

O resultado é semelhante ao seguinte:

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 da aplicação que criou.

  • SUBJECT_ID: o ID da Google Cloud conta de serviço que o utilizador autoriza a aceder à respetiva aplicação. Este valor é obrigatório quando cria uma credencial federada no Azure.

Tome nota dos valores APP_ID e SUBJECT_ID para utilização nos passos seguintes.

Em seguida, adicione uma credencial federada para a sua aplicação.

Adicione uma credencial federada

Para criar uma credencial federada, siga estes passos:

Portal do Azure

  1. No portal do Azure, aceda a Registos de apps e, de seguida, clique na sua aplicação.

  2. Selecione Certificados e segredos > Credenciais federadas > Adicionar credenciais. Em seguida, faça o seguinte:

    1. Na lista Cenário de credenciais federadas, selecione Outro emissor.

    2. Em Emissor, introduza https://accounts.google.com.

    3. Como Identificador do assunto, introduza a identidade Google do BigQuery da Google Cloud conta de serviço que obteve quando criou a associação.

    4. Em Nome, introduza um nome para a credencial.

    5. Clique em Adicionar.

Terraform

Adicione o seguinte ao ficheiro de configuração do Terraform:

  resource "azuread_application_federated_identity_credential" "example" {
    application_id = azuread_application.example.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 mais informações, consulte o artigo Configure uma app para confiar num fornecedor de identidade externo.

Atribua uma função às aplicações do Azure do BigQuery

Para atribuir uma função à aplicação Azure do BigQuery, use o portal do Azure, o Azure PowerShell ou a API REST de gestão da Microsoft:

Portal do Azure

Pode fazer atribuições de funções no portal do Azure iniciando sessão como um utilizador com a autorização Microsoft.Authorization/roleAssignments/write. A atribuição de funções permite que a ligação do Azure do BigQuery aceda aos dados do Azure Storage, conforme especificado na política de funções.

Para adicionar atribuições de funções através do portal do Azure, siga estes passos:

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

  2. Clique em Controlo de acesso (IAM).

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

  4. Para conceder acesso só de leitura, selecione a função Leitor de dados do blob de armazenamento. Para conceder acesso de leitura/escrita, selecione a função Colaborador de dados do blob de armazenamento.

  5. Defina Atribuir acesso a como Utilizador, grupo ou principal do serviço.

  6. Clique em Selecionar membros.

  7. No campo Selecionar, introduza o nome da aplicação Azure que atribuiu quando criou a aplicação no inquilino do Azure.

  8. Clique em Guardar.

Para mais informações, consulte o artigo Atribua funções do Azure através do portal do Azure.

Terraform

Adicione o seguinte ao ficheiro 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 função a um principal de serviço ao nível de um recurso, pode usar 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 o seguinte:

  • APP_NAME: o nome da aplicação.
  • ROLE_NAME: o nome da função que quer atribuir.
  • RESOURCE_NAME: o nome do recurso.
  • RESOURCE_TYPE: o tipo de recurso.
  • PARENT_RESOURCE: o recurso principal.
  • 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 o artigo Atribua funções do Azure com o Azure PowerShell.

CLI do Azure

Para adicionar uma atribuição de função para um principal de serviço ao nível de um recurso, pode usar a ferramenta de linha de comandos do Azure. Tem de ter a autorização Microsoft.Authorization/roleAssignments/write para a conta de armazenamento para conceder funções.

Para atribuir uma função, como a função Storage Blob Data Reader, ao principal de serviço, execute o 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

Substitua o seguinte:

  • SP_ID: o ID da entidade de serviço. Este principal de serviço destina-se à aplicação que criou. Para obter o principal de serviço de uma ligação federada, consulte o objeto 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 subscrição.

Para mais informações, consulte o artigo Atribua funções do Azure através da CLI do Azure.

API REST da Microsoft

Para adicionar atribuições de funções a um principal de serviço, pode enviar um pedido HTTP à gestão da Microsoft.

Para chamar a API REST Microsoft Graph, obtenha um token OAuth para uma aplicação. Para mais informações, consulte o artigo Obtenha acesso sem um utilizador. A aplicação que chamou a API REST Microsoft Graph tem de ter a autorização da aplicaçã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 o seguinte:

  • TENANT_ID: o ID de inquilino correspondente ao ID do diretório do Azure que contém a conta de armazenamento do Azure.
  • CLIENT_ID: o ID do cliente do Azure.
  • CLIENT_SECRET: o segredo do cliente do Azure.

Obtenha o ID das funções incorporadas do Azure que quer atribuir à entidade de serviço.

Seguem-se algumas funções comuns:

Para atribuir uma função 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 o seguinte:

  • ROLE_ASSIGNMENT_ID: o ID da função.
  • SP_ID: o ID da entidade de serviço. Este principal de serviço destina-se à aplicação que criou. Para obter o principal de serviço de uma ligação federada, consulte o objeto principal de serviço.
  • SUBSCRIPTION_ID: o ID da subscrição.
  • RESOURCE_GROUP_NAME: o nome do grupo de recursos.
  • STORAGE_ACCOUNT_NAME: o nome da conta de armazenamento.
  • SUBSCRIPTION_ID: o ID da subscrição.

A ligação está agora pronta a usar. No entanto, pode haver um atraso na propagação para uma atribuição de função no Azure. Se não conseguir usar a ligação devido a problemas de autorização, tente novamente após algum tempo.

Partilhe ligações com utilizadores

Pode conceder as seguintes funções para permitir que os utilizadores consultem dados e geram ligações:

  • roles/bigquery.connectionUser: permite que os utilizadores usem associações para estabelecer ligação a origens de dados externas e executar consultas nas mesmas.

  • roles/bigquery.connectionAdmin: permite que os utilizadores geram associações.

Para mais informações sobre as funções e as autorizações do IAM no BigQuery, consulte o artigo Funções e autorizações predefinidas.

Selecione uma das seguintes opções:

Consola

  1. Aceda à página do BigQuery.

    Aceda ao BigQuery

    As associações são apresentadas no seu projeto, num grupo denominado Associações.

  2. No painel esquerdo, clique em Explorador:

    Botão realçado para o painel do explorador.

    Se não vir o painel do lado esquerdo, clique em Expandir painel do lado esquerdo para o abrir.

  3. Clique no seu projeto, clique em Ligações e, de seguida, selecione uma ligação.

  4. No painel Detalhes, clique em Partilhar para partilhar uma associação. Depois, faça o seguinte:

    1. Na caixa de diálogo Autorizações de ligação, partilhe a ligação com outros responsáveis adicionando ou editando responsáveis.

    2. Clique em Guardar.

bq

Não pode partilhar uma ligação com a ferramenta de linhas de comando bq. Para partilhar uma associação, use a Google Cloud consola ou o método da API BigQuery Connections para partilhar uma associação.

API

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

Java

Antes de experimentar este exemplo, siga as Javainstruções de configuração no início rápido do BigQuery com bibliotecas cliente. Para mais informações, consulte a API Java BigQuery documentação de referência.

Para se autenticar no BigQuery, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure 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");
    }
  }
}

O que se segue?