Pular para o conteúdo

BigQuery do cliente e Sheets por conta de serviço

Aula 5 de 88 minOperarAtualizada em 2026-10-04

Vídeo em produção

A gravação desta aula está no lote de produção. O objetivo, o exercício e a documentação já valem. Duração-alvo: 8 min.

Objetivo: Configurar SA; distinguir projeto de dados × billing

Selo de estado: Preview (teto atual do produto) · Curso ACD-210 — Conectores e conexões · Aula 5 de 8 · Atualizado em 2026-10-04.

Objetivo#

Ao final desta aula você vai configurar SA; distinguir projeto de dados × billing — e autorizar uma planilha por compartilhamento, sem pedir a senha do Google de ninguém.

Vídeo#

Identificador no manifesto: acd-210-05-bigquery-e-google-sheets · duração-alvo 8 min · tela do produto: /conexoes.

Roteiro de gravação (6 capítulos):

#Minutagem-alvoCapítuloTela do produto
10:00–0:50Abertura: título + selo. O seu BigQuery como origem × o BigQuery interno do produto (destino)./conexoes/nova
20:50–2:40Campos do conector BigQuery: projectId, billingMode, billingProjectId, dataset, location, chave da conta de serviço./conexoes/nova
32:40–4:10Projeto de dados × projeto de billing: dataViewer num, jobUser no outro — e quem paga a consulta./conexoes/nova
44:10–5:40Google Sheets: saMode plataforma × própria; compartilhar a planilha como Leitor com o e-mail da conta de serviço./conexoes/nova
55:40–7:00spreadsheet (cole o link), sheetTitles, headerRow. Teste e descoberta das abas./conexoes/nova
67:00–8:00Erros de IAM e de planilha não compartilhada; o "faça você mesmo"./conexoes

Conteúdo#

Os dois conectores desta aula são Disponível (maturidade GA-candidato) e compartilham a mesma ideia: autenticação por conta de serviço do Google, não por usuário e senha.

O seu BigQuery não é o nosso

O conector BigQuery lê tabelas do projeto BigQuery do cliente, com a conta de serviço dele, e as traz para a camada Bronze do workspace. Não confunda com o BigQuery interno do produto — o datalake de destino (aurora_bronze / _silver / _gold), que roda com outra identidade. Esta aula é sobre usar o seu BigQuery como origem.

BigQuery: os seis campos que importam

CampoRótulo na telaObrigatórioObservação
projectIdProjeto dos dados (Project ID)simOnde os datasets e tabelas moram
billingModeCobrança das consultas (billing)nãosame (padrão) ou separate
billingProjectIdProjeto de billing (Project ID)nãoSó aparece quando billingMode = separate
datasetDatasetnãoVazio lista todos os acessíveis
locationLocationnãoEx.: southamerica-east1; vazio = automático
serviceAccountJson 🔒Chave da service account (JSON)simCole o JSON inteiro; é cifrado e nunca reexibido

Projeto de dados × projeto de billing

É a distinção que decide quem paga e qual IAM conceder. Os jobs de consulta do BigQuery são cobrados no projeto onde rodam, não onde os dados estão.

Projeto de dadosProjeto de billing
O que guardaDatasets e tabelas que serão lidasNada: é só onde o job de consulta roda e é cobrado
Papel mínimo da SAroles/bigquery.dataViewerroles/bigquery.jobUser
Quando é o mesmobillingMode = same (padrão) — o projeto de dados paga—
Quando separarCliente com projeto de dados e projeto de custo distintosbillingMode = separate + billingProjectId

Os dois sintomas de IAM são inconfundíveis quando você conhece a divisão: Access Denied: … dataViewer é falta de leitura no projeto de dados; User does not have bigquery.jobs.create é falta de jobUser no projeto de billing.

Na carga, o produto cria o job de consulta e faz um probe de 1 linha (descartada) para validar SQL e partição antes de enviar qualquer fragmento — assim um retry nunca duplica dado na landing. Tabelas com require_partition_filter são tratadas automaticamente: o produto monta um predicado que cobre todas as linhas, em vez de falhar. O filtro incremental usa parâmetro nomeado (@since), nunca concatenação.

Google Sheets: autorização por compartilhamento

O Sheets não pede senha do Google nem acesso ao Drive inteiro. Você compartilha a planilha com o e-mail de uma conta de serviço, com permissão de Leitor.

CampoRótulo na telaObservação
spreadsheetLink ou ID da planilhaCole o link da barra de endereço — o ID é extraído sozinho
sheetTitlesAbasSepare por vírgula ou ponto e vírgula; vazio traz todas
headerRowLinha do cabeçalhoPadrão 1
saModeConta de serviçoplataforma (padrão) ou propria
serviceAccountJson 🔒Chave JSON da conta de serviçoSó aparece quando saMode = propria

Com saMode = plataforma você não cola chave nenhuma: a tela mostra o e-mail da conta de serviço a autorizar, e o seu único trabalho é compartilhar a planilha com ele. Com saMode = propria, você traz a sua própria conta de serviço e cola o JSON. O "Testar conexão" indica o e-mail a autorizar e, quando a autorização existe, a descoberta lista as abas e colunas.

Cada aba vira uma tabela na Bronze. Uma aba renomeada não derruba as demais: o erro fica naquela tabela e o laço segue.

Limites e custo

  • Paginação: teto duro por execução (default 10.000 páginas / 5.000.000 linhas), com guarda anti-loop.
  • BigQuery: extração fragmentada com batchSize default 5.000 (100–50.000) e maxRows default 200.000 (até 5.000.000).
  • Sheets: paginação por janela de linhas, com checkpoint; carga SaaS default batchSize 5.000, maxRows 200.000 por recurso.
  • Quem paga o quê: as consultas ao seu BigQuery são cobradas no seu projeto de billing (modelo on-demand). A carga para a Bronze consome load job do lado do produto. Custo faturado real = NÃO MEDIDO. A leitura da planilha é R$ 0.

No workspace Aurora Varejo

A Comércio Aurora já tem exportações de marketing num BigQuery próprio: projeto de dados aurora-dados-example, custos centralizados em aurora-billing-example. Maria escolhe billingMode = separate, informa os dois Project IDs, dataset = marketing, location = southamerica-east1 e cola o JSON de uma conta de serviço de treino. O teste volta User does not have bigquery.jobs.create — faltou roles/bigquery.jobUser no projeto de billing, não no de dados. Concedido o papel, a descoberta lista as tabelas.

Em paralelo, a planilha Metas 2026 (sintética) fica com saMode = plataforma: Maria copia o e-mail da conta de serviço que a tela mostra, compartilha a planilha como Leitor e deixa sheetTitles vazio para trazer todas as abas, com headerRow = 1.

Erros comuns

SintomaCausa provávelO que fazer
Access Denied: … dataViewerSA sem leitura nos dadosConceda roles/bigquery.dataViewer no projeto de dados
User does not have bigquery.jobs.createSA sem jobUser no billingConceda roles/bigquery.jobUser no projeto de billing
Not found: DatasetDataset ou location erradosConfira o nome do dataset e a location
Cannot query … requires a filterPartição obrigatória na tabelaO produto trata sozinho; persistindo, informe a coluna de partição
JSON inválidoChave colada incompletaCole o JSON inteiro da conta de serviço
Planilha "não encontrada"Não compartilhada com a conta de serviçoCompartilhe como Leitor com o e-mail que a tela indica
Abas faltando na descobertasheetTitles com nome erradoDeixe vazio para trazer todas, ou corrija o nome exato
Colunas com nome estranhoheaderRow apontando para a linha erradaAjuste a linha do cabeçalho

O que esta aula não faz

Ela não configura o BigQuery de destino do workspace (isso é provisionamento do datalake, não conexão) e não concede IAM para você — os GRANTs e papéis acontecem na conta do cliente. O conector é GA-candidato no motor; a extração real continua Preview, dependente da conta de serviço do cliente e do ambiente de nuvem do workspace. Sem ele a execução falha com mensagem.

Faça você mesmo#

No workspace de treino Aurora Varejo, como dono, com uma planilha sintética sua e identificadores *-example.

  1. Crie uma planilha de treino com duas abas (Metas e Filiais), cabeçalho na linha 1 e três linhas fictícias em cada.
  2. Em /conexoes, use Nova conexão → Google Sheets. Cole o link da planilha no campo spreadsheet e confirme que o produto aceita o link (sem você extrair o ID).
  3. Deixe saMode = plataforma, copie o e-mail da conta de serviço que a tela mostra e compartilhe a planilha com ele como Leitor.
  4. Deixe sheetTitles vazio e headerRow = 1. Use Testar conexão e confirme que a descoberta lista as duas abas, com as colunas do cabeçalho.
  5. Agora preencha sheetTitles com um nome de aba inexistente (Vendas) e teste de novo: registre a diferença na descoberta. Depois volte a deixar vazio e salve com Salvar conexão.
  6. Abra uma segunda tentativa, agora BigQuery, e preencha projectId = aurora-dados-example. Alterne billingMode entre same e separate e confirme que o campo Projeto de billing só aparece em separate.
  7. Escreva, em duas linhas, qual papel IAM você pediria em qual projeto para esse cenário (dataViewer em dados, jobUser em billing) — e Cancele a tentativa, sem salvar.

Você terminou quando a conexão do Sheets está salva com as duas abas descobertas via compartilhamento (sem nenhuma senha do Google), e você sabe dizer, sem consultar, qual dos dois papéis IAM vai em qual dos dois projetos do BigQuery.

Checagem rápida#

Três perguntas no final da aula, corrigidas no servidor. A aula só conta como concluída depois da checagem.

Documentação relacionada#

Capacidades ensinadas#

C04.1 — o selo exibido na aula é sempre o estado mais conservador entre as capacidades citadas; nada aqui é "GA".

Carregando seu progresso…