Google Cloud Functions - Um Breve Tutorial

Extraindo dados carregados ao Cloud Storage para o BigQuery utilizando Cloud Functions e Python

Lucas de Sá
5 min readSep 13, 2021

A versão em inglês deste artigo está disponível aqui.

Há diversos cenarios em que é necessário armazenar dados para serem lidos posteriormente. Na Google Cloud Platform (GCP) pode-se guardar arquivos no Google Cloud Storage (GCS), que atua como um data lake, e carregá-los no BigQuery, uma poderosa ferramenta para construir um data warehouse, que permite armazenar vastas quantidades de dados e realizar consultas SQL sem precisar gerenciar infraestrutura. Uma maneira de levar dados guardados no GCS ao BigQuery é com o uso das Google Cloud Functions através do processo de Extração, Transformação e Carregamento (ETL) desrito abaixo:

A ideia deste artigo é dar uma breve introdução as Cloud Functions, criando um Pipeline de dados na GCP em que arquivos são represados em buckets do Cloud Storage, lidos e transformados por uma Cloud Function e carregados nma tabela do BigQuery.

Mas afinal o que são as Google Cloud Functions?

Para entender o que são Cloud Functons primeiro precisamos ter uma ideia dos diferentes serviços de computação disponíveis.

A imagem acima mostra um espectro desses serviços disponíveis, sendo eles: Infraestrutura Como Serviço (IaaS), Containers Como Serviço (CaaS), Plataforma Como Serviço (PaaS) e Funções Como Serviço (FaaS). Note que embora os serviços a esquerda dêem mais controle e customização em suas configurações, eles requerem um time de pessoas especializadas para manter a infraestrutura. Já os serviços a direita, embora não ofereçam tanto controle, possuem abstrações de alto nível e a manutenção é gerenciada pelo provedor do serviço.

As Cloud Functions estão no espectro a direita como FaaS. Tipicamente esses serviços executam um código escrito por um desenvolvedor como resposta a um evento pré definido, com um tempo limite de execução com manutenção e escalabilidade gerenciada pelo provedor. A arquitetura desse tipo de serviço é referida como Arquitetura Serverless, onde a precificação é dada pelo total de invocações da função e a quantidade de memória e CPU utilizadas. Esse tipo de serviço é atraente já que com pouco esforço a função está rodando sem as preocupações gerenciar um servidor.

O diagrama abaixo mostra os diferentes modelos de serviço de computação oferecidos pela GCP, abrangendo do IaaS ao FaaS.

Em sumário as Cloud Functions são Funções Como Serviço, com um ambiente de execução serverless e código executado num ambiente gerenciado, onde funções de propósito único são escritas e ativadas por eventos pré definidos emitidos por outros serviços da GCP, e o modelo de pagamento é baseado no total de invocações e recursos computacionais utilizados.

Configurando uma Cloud Function

A ideia desta function é instantaneamente processar um arquivo json no momento que ele é represado em um bucket no Cloud Storage e armazenar seu conteúdo no BigQuery.

Abaixo definimos o bucket test_function onde os arquivos serão armazenados:

Agora definiremos a tabela no BigQuery onde os dados serão carregados. Ela se chama my_table, está no dataset a_dataset e possui os campos abaixo:

Para criar uma Cloud Function basta ir no dashboard das Cloud Functions no Cloud Console e selecionar Create Function:

Em seguida vamos preencher as configurações desejadas para a Function.

Opções de Configuração de uma Cloud Function

Primeiro é necessário inserir o nome da função e a região na qual ela será criada.

Na aba de Trigger há uma gama de opções de Trigger Type. Nós selecionaremos a opção de Cloud Storage e o tipo de evento como Finalize/Create. Por fim vamos especificar o bucket desejado do Cloud Storage para que a Cloud Function seja ativada pelos arquivos que são criados neste bucket.

Em Runtime, Build, Connections and Security Settings é possível configurar outras opções. Em Advanced há duas configurações obrigatórias: a quantidade de memória alocada e o tempo para que a function dê timeout.

Esses configurações vem por padrão com 256MB de memória e 60 segundos para o tempo de timeout, porém é possível alocar até 8GB de memória e 540 segundos (9 minutos) para timeout.

Agora com as configurações selecionadas, podemos salvá-las e prosseguir para a aba do código. Há diversas opções de linguagem e maneiras para subir o código. Iremos utilizar Python 3.7 e usar o próprio editor do google para escrever o código.

É necessário específicar qual o entry point da Function, ou seja, definir qual método será lido na execução do código. Também é possível especificar os pacotes Python no arquivo requirements.txt

Editor de Código de uma Cloud Function

Segue abaixo o código escrito na função:

É importante notar que o BigQuery aceita um formato específico de arquivos json, o NDJSON, que nada mais é um arquivo json onde cada linha possui um objeto diferente, como mostra o exemplo abaixo:

{"key": 1, "value": "my_value"}{"key": 2, "value": "another value"}{"key": 3, "value": "this is NDJSON"}

Com o código pronto podemos clicar em Deploy e ver a magia acontecer =)

Colocando a Cloud Function em uso

Agora podemos finalmente testar a Cloud Function! Todos os logs são referentes a function são registrados no Logging da GCP. Há também a aba Logs na página de cada Cloud Function.

Para ver a nossa Function em execução basta subir um arquivo NDJSON no bucket test-function na GCS. Os logs ficarão disponíveis logo após a execução da function.

Logs da Function após subir o arquivo my_example.json no GCS

Feito isso é possível ver os dados carregados no BigQuery ao fim da execução da Function!

Considerações Finais

As Cloud Functions são uma excelente ferramenta de ETL para jobs simples e pouco custosos devido a sua versatilidade e agilidade para fazer o deploy de um fluxo de propósito único de workloads orientados a eventos (Pub/Sub, Storage, Firestore, etc) e chamadas HTTP.

Ainda assim é importante levar em conta as limitações das Cloud Functions. O seu limite de execução de 9 minutos a torna inviavel para trabalhos custosos, limitando seus casos de uso para trabalhos mais leves como micro-batching e injestão via streaming.

--

--

Lucas de Sá

Stockholm based Data Engineer and Functional Programming Practioner.