Nesta postagem, falaremos como criar uma função utilizando Cloud Functions que é acionada pelo Pub/Sub do Google Cloud.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdetu_K5ZBMZ9Pibk6VnYXGmbKYM2bliuQ9IAQcgyAszYNuBFBozDdsCzJNqeqXbu006MNM0iGUzdAyMhc3EiRsTQ9sTXovOr1XQ2UXfcA_xG0oQ_2jj4mEURnZJxW-lUXykEaZAFzus5M/w547-h308/Untitled.png)
O que é o Cloud Functions?
É um serviço totalmente gerenciado do GCP que permite a execução de códigos sem a necessidade de gerenciar um servidor ou uma VM, é cobrado conforme as execuções e permite escalonamento automático.
O que é Pub/Sub?
O Pub/Sub (Publish/Subscribe) é um serviço de mensagens assíncronas do GCP.
Permite armazenamento e entrega de mensagens em formato de tópicos e assinaturas.
O que é Cloud Storage?
Fornece, a nível mundial, um armazenamento de objetos altamente durável que escalona para exabytes de dados. É possível acessar dados instantaneamente de qualquer classe de armazenamento, integrar o armazenamento aos seus aplicativos com uma API exclusiva unificada e otimizar o preço e desempenho de forma fácil.
Passo a Passo
1. O primeiro passo a fazer é o login em sua conta do GCP, para este tutorial você vai precisar de uma conta que possua um projeto.
![](https://miro.medium.com/max/625/0*Krq7iUXz_wUIfv2D.png)
2. Vá até o menu, selecione Pub/Sub > Tópicos:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiv_Pjn1HEEo3Y-8Kaa6O24VEeHwX4Q74uCU0MTcS0uUE0PsJfadR4l8MHVErQF3_etkYjmYyZpJQOrFDw3nXMztwpJGqo569cdlz191G6RJRxl6Zz6zsDg2h0SOlOleILMRCTPyql4O7EB/w505-h407/Untitled+1.png)
3. Selecione Criar Tópico:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgUwpWmTEvb07i_OU0AbzuYs6UpsGZkoMNsBzGZZFiu9gZf0A9dA9PltI-M1Ef9euPAwzNtn92rCyuDrBNR2OnPmgeAnJ1U9Fr8i2nhZUThK_eMZKuzA_8DjA5xygZWD-3xczCsMAgeIZm0/w629-h179/Untitled+2.png)
4. Dê um nome/id para seu tópico, ele precisa ter de 3 a 255 caracteres, começar com uma letra e conter apenas estes tipos de caracteres: letras, números, traços (-), pontos (.), sublinhados (_), indicadores diacríticos (~), símbolos de porcentagem (%) ou indicadores de adição (+). Não é possível iniciar com "goog". Neste exemplo usaremos o nome "eventos":
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMbecbsMr2I8cMOVhjKruOaLq0evwC4zcvbZsgxctkfHk8cLOBeoWYFUH3elryYc_uaHO4vjl8ck7dIM491bQBHRN0IiNInRI2dOVxoVKSugZlF2BgkOkBJXrR_EHLNNW9245gI9ZfDrO9/w527-h341/Untitled+3.png)
5. Verifique o tópico criado:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBE7_ix12rmfZfPlaDWJ9UnkQ541eqxWsflWy4vzywN8ML1LW8uH7FEupzWeOx49_LKnGl7OO-TtFG_NBjXwi-bgpXuCCD301sBDH5PoaXWvFYrMjAF5fiBvte7DCuqI9EZIMBUq9W8iuy/w638-h162/Untitled+4.png)
6. Vá até menu, selecione Storage > Navegador.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyrQMxhl4iMMAadDpHl8-BBVDXVSMJ_hwi15_yBWNrApoJIyp4qqEfuCEKk_MsRIXq29Xfj8K3XM0LqUlrG4xHr_mj9Ck8bJErplMWkU7-WeEddZyhJ1qx_2GJpOdME7LciKbJq5bi-76J/w514-h275/Untitled+1.png)
7.Clique em Criar Intervalo ou Criar Bucket:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhErlJF5zk-p1e5ipWUDcqXYU3oTLRoJp6pzi2VxwsfUwhuM0XX_-_u0gcj9YPxVE43lnlFg30CSxefddb5MDwh39AEN2nIARO78qErROq_SvuCM_Kte8PV-olyBo3aSSgyzj0mV4AOfl8M/w634-h293/Untitled+2.png)
8.Especifique um nome para seu bucket, o nome precisa ser exclusivo no mundo, precisam começar e terminar com um número ou uma letra. Precisam conter apenas letras minúsculas, números, traços (-), sublinhados (_) e pontos (.). Precisam ter de 3 a 63 caracteresNão é permitido usar espaços e não podem começar com o prefixo "goog", e não podem conter a palavra "google".
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgyWqyVTMF6JOrCLxMSbg1CP4JqYSuBOR1lTR7wSBxAagrDtv0H32dC5cmxXPxim0h-HanJZMk1PXnd_DL4kPq7YQugjXyl8aB9WTMmhYwDw8Dt1h13rdyOypR3F6ncYfuZgQT9XrWJtOeP/w686-h444/Untitled+3.png)
9. Defina a região conforme abaixo e clique em continuar:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjytoDoB4beQ7PhyAD1wRDVGBjJhylimo960yH7EwSOVXNe1JpTWPbacE7OM5fzm560YzEN5yqtS-pMOzl77nH-R2wbrUr_oFk3otjAWFH6mq_adkqje4H_Fdg4EE8QsHmLt-A_DK3YvtO1/w655-h383/Untitled+4.png)
10. Defina o tipo de armazenamento como Standard e clique em continuar:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjs0vGYZm1NX1B21vE4iY1qaMtpQFOgZICif0GxPDfNdawaNDuagMTFq162fYL-iMFzd5gBZKtLrhxaYGxkTQQohLZ0r6DfI9DcvF6OKsh6i3wHYQbCAFj1U9HNO8gio7PxTlVUXQxbYlor/w581-h385/Untitled+5.png)
11. Escolha o controle de acesso como detalhado e clique em continuar.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhTAHU7z4vR-4phe2oUoQBwOme0uRVorBVmVlCw15_vVTQWSwKY1PtGvpoMD4pfuidh071U2BCcZia99HAeeNN3Wh_eKApNlPoPhA0-W-mUDIOJAytITP4kCmpLIHO6-nQ20OTFXS446QOG/w594-h314/Untitled+6.png)
12. Clique em criar:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjglS1PF0JPit8AGdgm3ZeXT1MqiCNr9E3qv0Ww328DzlCLcasK3dyFke0TZb-7z2Cfw-WlcKM1mpNzFYaTvBZiRIbb6owPecdUad0R2LHjvUMsINhsfMqOFRd4bGSv1EDS9XT8_sgC2nag/w620-h438/Untitled+7.png)
13. Verifique se o bucket foi criado com sucesso:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiGrdF9G4PuJSJg_awDRHEExInijWTBv4LUB15vgTThMotwRTDf4051Gl7HXAvEKx8KZrbcBoUDYD4TeVlbGvSUmIofOYWL2qG0uDD_ul6nRy1FI57GVF9hmeSiiat2sGZkt_tigpch7TyE/w608-h165/Untitled+8.png)
14. Vá até menu, selecione Cloud Functions.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhlkt2HHAVSTVQZCsgLXK5excbMHPexS6_sf8quweTGH-O0EfFhAK83i-PDh99nP19F_oK_dnkc1AGDr_FgI3S1wInbqsrvcZPiN2xXMBUgQvgRagthoHRj3831Gtl8ZIyiQu6_jAj1crSA/s320/Untitled+5.png)
15.Clique em Criar Função:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg5GJziCCoDqw9t20ooqdWZ_F5BjTjOYPNalLAy0fBhR_aS1boLGXvGeScxFeZV9aNVfpw3bclNtItjMZPgIN4EU2wFsRGZlQm1zoBp1K-hlh8nwGaSJLG3TYZLypZ9IGAagYxpBi7W7tOw/w542-h201/Untitled+6.png)
16.Especifique um nome para sua função, o nome deve começar com uma letra, seguida por até 62 letras, números, hífens e sublinhados, e terminar com uma letra ou um número, nesse exemplo usaremos o nome "verifica-mensagem":
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj1Ew1PBiHwESkZS1kbHTti7XSEtYfkmUkaTvd_6xRKWCZhJ7-wXpH1vFyjXGzbv3EdTkVKKgylj7vuUO00n3PEQlOr242o7QRXSriOb0zYXBnGeDdYh0557jxZ5tF7pFfVY2tKyRrxEc1F/w590-h236/Untitled+7.png)
17. Defina a região conforme abaixo:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiMUdEDnAk-n-R3s55k7emmhkgl9-sloPYfKD61VzPzyEYGRAjZwIBSUmpouBMbF18LLQbH_cukN47iM4_ob4OTaPP4rPvraHeOvgY-IWOZzofSgQoO39TXPF4obL21RafZufHdHPaiIl6x/w568-h78/Untitled+8.png)
18. Existem vários tipos de "Gatilhos"/acionadores para nossa função, no nosso exemplo vamos usar o tipo Pub/sub, ou seja, ao chegar uma nova mensagem no tópico nossa função será executada:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhATDRCLHvqvIWm8S9kteRzyGgO4qFA6T4kI8ZnH4iK3E4y49ZfQd7-rtQpfO1hjCat-90I1FnvQbY4TpjSMjLQ-2IZaxR8qOAsinwOeuh4E7XkURxojZalv3_Tkrf-eXSPHSzj-HLJ0R-u/w521-h307/Untitled+9.png)
Não será preciso alterar a memória ou outros itens, clique em Salvar.
19. Confirme as informações da função e clique em Próxima:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1vvoMNSzcjcy2NTf9vCcHVX_P_pjz7u4lBH-7blPgOzoN82J5M3ZZmQEJA8T__yPdwHecZmzbOdt0LBLX6d_kenp0Cqwliv5XOOj9ND9dMtswFXScXyPFr3N7H17DnBVWfM9LC_8ExJJ2/w453-h537/Untitled+10.png)
20. Neste passo usaremos a linguagem Node.Js 10 com o código abaixo, depois de colocar o código, após altere o arquivo package.json que nem abaixo, depois clique em Implantar:
'use strict';
const {Storage} = require('@google-cloud/storage');
const storage = new Storage();
exports.minha_funcao = (event, context) => {
const fs = require('fs');
const datetime = new Date();
const data_atual = Date.now()
const meu_diretorio = '/'
const meu_arquivo = 'eventos' + '-' + data_atual + '.txt'
const message = event.data ? Buffer.from(event.data, 'base64').toString(): 'Erro ao ler a mensagem';
console.log(message);
const bucket = storage.bucket("id_do_meu_projeto_meu_bucket");
const file = bucket.file(meu_arquivo);
const stream = require('stream')
const dataStream = new stream.PassThrough()
dataStream.push(message)
dataStream.push(null)
const blobStream = dataStream.pipe(file.createWriteStream({
resumable: false,
gzip: true
}))
blobStream.on('error', (err) => {
console.log('Error blobStream: ',err)
});
blobStream.on('finish', () => {
console.log('Arquivo gerado com sucesso')
});
};
{
"name": "minha_funcao",
"version": "1.0.0",
"private": true,
"engines": {
"node": ">=12.0.0"
},
"dependencies": {
"@google-cloud/functions-framework": "^1.1.1",
"@google-cloud/pubsub": "^2.0.0",
"@google-cloud/storage": "^5.0.0"
}
}
21.Aguarde a criação da função:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWGLWRBr1m9jmJP-XAow2m_249-kDrYV6kRE-Prft7Ys-KUyq8kPfTafb5exVTOnzAarP9PSsOhstv5WEd0wxh4lYoJNOn9rmbjHJYClhEgx4y1QXEcu3gNIy93HjlLrijoHQwAnmG_Y8k/w640-h100/Untitled+12.png)
22. Volte ao pub/sub e clique em publicar mensagem:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjd8Wpo7hCpXuD1oOuWKeGyy4eYhhTtYGp5gfeGUYz2d7c2Fn7tt4dBJ_oHXFIlKlmDJ_VnLHZlr6O3MgllWLpFmpPHwzgYGc3QX9G2Ri_ZiXH-ZmV9qdNeoQXEb0bP4IxN3-VX0C_XKHeg/w645-h129/Untitled+13.png)
23. Digite sua mensagem e clique em Publicar:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiS2fvEUs2WatRA8ExjNZCA-E_1Xe0WLj8awAC42_FAA4LcDtlpI4aa6PU4A8LmObEInhg35mYr44u1J7GNdtRFsbsoGERNTZXl1dhmcjBXC6qiN6DKY5qWhJ9eKSIrKQ6j8qyEhLxCRxYX/w647-h320/Untitled+14.png)
24. Volte na sua função do Cloud Function e clique em Registros, será possível ver que a mensagem do tópico iniciou o evento da nossa função, verifique também o arquivo gerado no cloudstorage:
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgF_YKSBR2UoUo0DYENTJrOsyvz5UQdJ3_Jrst9FYh6MsimzgIcAtoAK3tKoKIwaY4-6L3Iit1Tiw905C3tn-FZw-zyt-kJPkkF6n-quVEfJcCNhcVamb3lvwZCd6sI3MKjeY9iUwh6wniJ/w838-h233/Untitled+15.png)
Referências
- Cloud Functions documentation
https://cloud.google.com/functions
- Por que usar Pub/Sub?
https://inside.contabilizei.com.br/por-que-usar-pub-sub-378f0e212e67
- Pub/Sub
https://cloud.google.com/pubsub?hl=pt-br
- O que é o Pub/Sub?
https://cloud.google.com/pubsub/docs/overview