google_looker_instance provisiona uma instância do Looker (plataforma enterprise de BI com LookML), não do Looker Studio. São produtos distintos. Looker Studio não tem recurso Terraform; é configurado via UI.

O Looker é um serviço gerenciado: a instância roda na infraestrutura do Google, não em VMs do seu projeto. O que o Terraform controla é a configuração da instância (edição, OAuth, rede, janela de manutenção).

Recurso principal

resource "google_looker_instance" "principal" {
  name   = "${local.prefixo}-looker"
  region = var.regiao
 
  platform_edition = var.looker_edition
 
  oauth_config {
    client_id     = var.looker_oauth_client_id
    client_secret = var.looker_oauth_client_secret
  }
 
  admin_settings {
    allowed_email_domains = ["empresa.com"]  # restringe login por domínio
  }
 
  maintenance_window {
    day_of_week = "SUNDAY"  # MONDAY..SUNDAY
    start_time {
      hours   = 23
      minutes = 0
    }
  }
 
  depends_on = [google_project_service.looker_api]
}

Parâmetros principais

platform_edition

ValorDescriçãoQuando usar
LOOKER_CORE_TRIALTrial gratuito, limitado a 10 usuários e 30 diasAvaliação inicial
LOOKER_CORE_STANDARDMensal, sem SLA de produçãoDev ou projetos pequenos
LOOKER_CORE_STANDARD_ANNUALAnual, SLA 99.5%Prod com orçamento menor
LOOKER_CORE_ENTERPRISE_ANNUALAnual, SLA 99.95%, CMEK, PSC nativoProd enterprise
LOOKER_CORE_EMBED_ANNUALAnual, para embedding em aplicações externasProdutos SaaS com BI embarcado

A edição não pode ser alterada via Terraform após a criação sem recriar a instância. Escolher errado em prod resulta em destruição e recriação do ambiente Looker.

oauth_config

Looker usa OAuth 2.0 para autenticação dos usuários. É necessário criar uma credencial OAuth no Google Cloud antes de provisionar:

# Crie manualmente no console ou via gcloud:
# APIs & Services > Credentials > OAuth 2.0 Client IDs
# Tipo: Web Application
# Authorized redirect URIs: https://<looker-uri>/oauth/redirect
# Armazene as credenciais no Secret Manager, nunca em tfvars em plain text
data "google_secret_manager_secret_version" "looker_oauth_id" {
  secret = "looker-oauth-client-id"
}
 
data "google_secret_manager_secret_version" "looker_oauth_secret" {
  secret = "looker-oauth-client-secret"
}
 
resource "google_looker_instance" "principal" {
  oauth_config {
    client_id     = data.google_secret_manager_secret_version.looker_oauth_id.secret_data
    client_secret = data.google_secret_manager_secret_version.looker_oauth_secret.secret_data
  }
  # ...
}

maintenance_window

maintenance_window {
  day_of_week = "SUNDAY"
  start_time {
    hours   = 23  # 0-23
    minutes = 0   # 0, 15, 30 ou 45
    seconds = 0
    nanos   = 0
  }
}
 
# Período onde manutenção é proibida (ex.: semana de fechamento)
deny_maintenance_period {
  start_date {
    year  = 2026
    month = 12
    day   = 20
  }
  end_date {
    year  = 2027
    month = 1
    day   = 5
  }
  time {
    hours = 0
  }
}

Conectividade de rede

IP público (padrão)

resource "google_looker_instance" "principal" {
  public_ip_enabled = true
  private_ip_enabled = false
  # ...
}

Acesso via URL pública gerada pelo Google. Adequado para dev e ambientes sem restrição de rede.

IP privado via PSC (Private Service Connect)

Para ambientes enterprise onde o Looker deve se conectar ao BigQuery e ser acessado sem tráfego pela internet pública:

resource "google_looker_instance" "principal" {
  public_ip_enabled  = false
  private_ip_enabled = true
 
  consumer_network = "projects/${var.projeto_id}/global/networks/${var.vpc_name}"
  reserved_range   = google_compute_global_address.looker_range.name
 
  psc_enabled = true
  psc_config {
    # Projetos autorizados a criar endpoints PSC para esta instância
    allowed_vpcs = [
      "projects/${var.projeto_id}/global/networks/${var.vpc_name}",
    ]
  }
 
  # ...
}
 
# Range de IPs reservado para a instância Looker dentro da VPC
resource "google_compute_global_address" "looker_range" {
  name          = "${local.prefixo}-looker-range"
  purpose       = "VPC_PEERING"
  address_type  = "INTERNAL"
  prefix_length = 20
  network       = "projects/${var.projeto_id}/global/networks/${var.vpc_name}"
}
 
resource "google_service_networking_connection" "looker_vpc" {
  network                 = "projects/${var.projeto_id}/global/networks/${var.vpc_name}"
  service                 = "servicenetworking.googleapis.com"
  reserved_peering_ranges = [google_compute_global_address.looker_range.name]
}

PSC requer que servicenetworking.googleapis.com esteja habilitado e a VPC tenha conectividade com o BigQuery via private endpoint ou VPC Service Controls.

IAM na instância

resource "google_looker_instance_iam_binding" "admins" {
  instance = google_looker_instance.principal.name
  region   = var.regiao
  role     = "roles/looker.admin"
 
  members = [
    "user:[email protected]",
    "group:[email protected]",
  ]
}

Roles do Looker:

RoleAcesso
roles/looker.adminAdministração total da instância
roles/looker.developerDesenvolvimento de LookML e Explores
roles/looker.userAcesso à interface de exploração e dashboards
roles/looker.viewerSomente visualização de dashboards

IAM do GCP controla acesso à instância em si. Dentro do Looker, permissões de modelo e dados são configuradas via LookML (access_grants) e grupos internos do Looker.

Habilitando a API

resource "google_project_service" "looker_api" {
  service            = "looker.googleapis.com"
  disable_on_destroy = false
}

Outputs úteis

output "looker_uri" {
  description = "URL de acesso à instância Looker"
  value       = google_looker_instance.principal.looker_uri
}
 
output "looker_version" {
  description = "Versão do Looker instalada"
  value       = google_looker_instance.principal.looker_version
}
 
output "ingress_private_ip" {
  description = "IP privado da instância (disponível apenas com private_ip_enabled = true)"
  value       = google_looker_instance.principal.ingress_private_ip
}

Quotas e limitações relevantes

  • Instâncias por projeto: 1 por padrão; aumentar requer quota request via console GCP
  • Regiões disponíveis: nem todas as regiões GCP suportam Looker; verificar disponibilidade antes de escolher região de prod (us-central1, us-east1, europe-west1, asia-northeast1 são as mais cobertas)
  • Trial: expira em 30 dias; não pode ser convertido para edição paga via Terraform (requer recriação)
  • PSC: disponível apenas nas edições ENTERPRISE_ANNUAL e EMBED_ANNUAL; Standard usa peering de VPC, não PSC
  • Provisionamento: google_looker_instance pode levar de 20 a 40 minutos para ficar disponível; o provider aguarda o recurso ficar ACTIVE antes de retornar
  • LookML: o código LookML em si não é gerenciado pelo Terraform; é versionado em repositório Git e sincronizado via integração nativa do Looker com GitHub/GitLab/Bitbucket
  • Usuários e grupos internos: não gerenciados via Terraform; use a API Admin do Looker ou provisionamento SCIM com o Identity Provider

Conexões

Ver também: gcp-looker | gcp-bigquery | terraform-gcp-ambientes | terraform-gcp-bigquery | terraform-cloud-gcp | gcp-boas-praticas