Bem-vindo ao Dia 4 dos 12 Dias do DigitalOcean! Ontem, adicionamos notificações por SMS do Twilio ao nosso Serviço de Lembrete de Aniversário, tornando-o capaz de enviar mensagens de texto para os aniversários de hoje. 🎂
Hoje, levaremos as coisas para o próximo nível implantando nosso script no DigitalOcean Functions. Isso permite que nosso serviço funcione na nuvem sem a necessidade de um servidor dedicado, tornando nosso aplicativo leve, escalável e pronto para automação.
Com essa configuração, você receberá lembretes de aniversário mesmo quando seu computador estiver desligado ou não conectado à internet—não há mais necessidade de executar o script manualmente na sua máquina. 🎉
✨ Por que DigitalOcean Functions?
Às vezes, tudo que você precisa é de um script simples que roda ocasionalmente. Gerenciar a infraestrutura para algo assim pode ser um exagero. É aí que Functions entra. É uma plataforma sem servidor, o que significa que você pode implantar código que roda apenas quando necessário, e você paga apenas pelo que usa. Perfeito para nosso caso de uso—verificar aniversários e enviar lembretes diariamente.
🚀 O Que Você Vai Aprender
No final de hoje, você saberá como:
- Configurar a ferramenta
doctl
CLI da DigitalOcean. - Criar e conectar-se a um namespace sem servidor (a forma da DigitalOcean de manter funções organizadas).
- Empacotar e implantar seu Serviço de Lembrete de Aniversário para DigitalOcean Functions.
- Testar sua função implantada na nuvem.
🛠 O Que Você Vai Precisar
Antes de começar, certifique-se de ter:
- Uma conta na DigitalOcean.
- Um arquivo
.env
com suas credenciais de banco de dados PostgreSQL e credenciais Twilio
🧑🍳 Receita para o Dia 4: Implementando as Funções do DigitalOcean
Passo 1: Configurar o doctl
CLI
Se você já configurou o doctl em sua máquina, pode pular esta etapa. Para aqueles que precisam configurá-lo, sigam estas instruções:
Antes de começarmos, vamos falar rapidamente sobre doctl
. É a ferramenta oficial de interface de linha de comando da DigitalOcean que permite gerenciar seus recursos em nuvem diretamente do seu terminal. Usaremos para criar um namespace (uma pasta para nossas funções serverless), implantar nosso script em Python e testar a função.
Configurar é simples:
-
Instale
doctl
: Siga o guia de instalação para o seu sistema operacional. -
Autentique
doctl
: Conecte-o à sua conta DigitalOcean executando: -
Verifique a instalação: Certifique-se de que tudo está funcionando executando:
Se for bem-sucedido, este comando retornará detalhes sobre sua conta DigitalOcean, como seu e-mail e ID da conta.
Passo 2: Instale o Software Serverless
As Funções DigitalOcean requerem software de suporte serverless, que você precisará instalar. Esta é uma configuração única, então uma vez instalado, você não precisará fazer isso novamente para projetos futuros.
Execute o seguinte comando:
Você pode verificar o status da instalação com:
Se você vir um erro como:
Não se preocupe—isso apenas significa que ainda não criamos ou nos conectamos a um namespace. Nós vamos lidar com isso no próximo passo.
Passo 3: Crie e Conecte-se a um Namespace
Os namespaces são como pastas para organizar funções sem servidor. Vamos criar um para o nosso Serviço de Lembrete de Aniversário:
-
Criar um novo namespace:
-
Conectar ao namespace:
-
Verificar a conexão:
Você deve agora ver uma confirmação de que está conectado ao namespace.
Dica Profissional: Para ver uma lista de todos os namespaces disponíveis, use o seguinte comando:
Isso pode ser útil se você estiver gerenciando vários projetos ou quiser verificar o namespace que acabou de criar.
Passo 4: Inicializar e Configurar a Estrutura do Projeto
O DigitalOcean Functions espera uma estrutura de projeto específica para implantações serverless. Você pode iniciar essa estrutura usando doctl serverless init
, criá-la manualmente ou até mesmo clonar um repositório inicial. Para manter as coisas simples, vamos configurá-la usando doctl serverless init
:
-
Execute o seguinte comando para inicializar o projeto:
Isso cria um diretório de projeto local chamado
my-birthday-reminder-service
com a seguinte estrutura padrão: -
Navegue até o diretório do projeto:
-
Renomeie as pastas para corresponder ao nosso caso de uso:
-
Crie os arquivos necessários:
- Crie um arquivo .env vazio na raiz do projeto:
Este arquivo conterá suas credenciais do banco de dados e do Twilio. O arquivo estará localizado na raiz da pasta
my-birthday-reminder-service
.- Crie um arquivo
requirements.txt
na pastabirthdays
:
Este arquivo listará as dependências do Python necessárias para a sua função. Ele estará localizado em
packages/reminders/birthdays
.- Crie um arquivo build.sh na pasta birthdays:
O script
build.sh
é necessário para implantar funções com dependências externas. O comandochmod
garante que o script seja executável em sistemas Mac/Linux.
Estrutura Atualizada: Após concluir essas etapas, a estrutura do seu projeto deve ser parecida com isto:
Dica Profissional: Se você acidentalmente renomear uma pasta de forma incorreta, pode executar o comando novamente ou renomeá-la manualmente em seu explorador de arquivos.
Passo 5: Atualizar Arquivos
Agora que a estrutura está em vigor, vamos preenchê-la com os arquivos necessários. Abra o diretório my-birthday-reminder-service em seu editor de código favorito
1. Atualize project.yml
O arquivo project.yml
é um arquivo de configuração que define a estrutura do seu projeto serverless, variáveis de ambiente e funções. Substitua seu conteúdo por:
Este arquivo configura o pacote de lembretes e mapeia as variáveis de ambiente para as Funções da DigitalOcean. Cada variável corresponde às credenciais necessárias para seu banco de dados e integração com Twilio.
2. Atualize seu arquivo .env
Consulte Dia 1: Configurando um Banco de Dados PostgreSQL para Lembretes de Aniversário para as credenciais do banco de dados e Dia 3: Verificando Aniversários e Enviando Notificações SMS para as credenciais do Twilio para preencher os seguintes valores:
Nota: O arquivo .env
é usado para armazenar credenciais sensíveis de forma segura. Esses valores serão lidos pelo seu arquivo project.yml
e mapeados para o ambiente serverless durante a implantação, tornando-os acessíveis à sua função na nuvem.
3. Adicionar Dependências
Atualize o arquivo requirements.txt
com as seguintes dependências:
pg8000
: Uma biblioteca cliente PostgreSQL em Python puro.
python-dotenv
: Usado para carregar variáveis de ambiente do arquivo .env
.
twilio
: A biblioteca Twilio para Python para enviar mensagens SMS.
4. Atualizar build.sh
Adicione o seguinte script ao arquivo build.sh
:
Este script garante que todas as dependências sejam empacotadas corretamente com sua função. O comando chmod +x
do Passo 4 garante que ele seja executável.
5. Atualizar __main__.py
Este é o script principal para o seu Serviço de Lembrete de Aniversário. Estamos essencialmente usando o script que construímos no Dia 3 para enviar notificações de aniversário. No entanto, para torná-lo compatível com as Funções do DigitalOcean, precisamos fazer alguns pequenos ajustes.
Atualize o arquivo __main__.py
com o seguinte conteúdo:
Aqui está o que mudamos:
-
Adicionada uma função
main(params)
: As Funções do DigitalOcean esperam uma função de ponto de entrada chamadamain
, que aceita um argumentoparams
. É aqui que a função começa a execução. -
Movida a lógica do script dentro da função
main
:
O código do Dia 3 foi encapsulado dentro da funçãomain
para se alinhar a esse requisito. -
Tudo o mais permanece o mesmo:
A lógica de conexão com o banco de dados, verificações de aniversário e lógica de notificação por SMS permanecem inalteradas.
Passo 5: Empacotar e Implementar
Com tudo em ordem, implemente seu projeto nas Funções da DigitalOcean:
- Implemente o projeto:
Para verificar se sua função foi implementada com sucesso no namespace:
- Acesse o Painel de Controle da DigitalOcean e vá para Funções no menu do lado esquerdo.
- Localize seu namespace (por exemplo, meu-namespace-de-lembrete-de-aniversario).
- Verifique se sua função aparece no namespace, geralmente listada como
lembretes/aniversarios
. - Clique no nome da função para ver detalhes, incluindo logs, configuração e histórico de invocações.
Passo 6: Teste Sua Função Implementada
Depois de implantar sua função, é hora de testá-la. Você pode invocar a função manualmente para garantir que ela funcione conforme o esperado. Existem duas maneiras de fazer isso:
Opção 1: Usando a CLI do DigitalOcean
Se tudo estiver configurado corretamente, sua função será executada na nuvem, verificando os aniversários de hoje e enviando notificações por SMS.
Opção 2: Usando o Painel de Controle do DigitalOcean
- Acesse o Painel de Controle do DigitalOcean.
- Navegue até Funções e localize sua função de lembretes/aniversários.
- Clique em Executar para executá-la manualmente.
- Visualize a saída e os logs diretamente no console.
Este método é especialmente útil se você prefere uma interface visual ou deseja verificar os logs em um formato limpo e fácil de ler.
Dicas de Teste
Quando você invocar a função, ela verificará os aniversários que coincidem com a data de hoje. Se houver uma correspondência, você receberá uma mensagem de texto com os detalhes. Para testar a função de forma eficaz:
- Adicione um ou mais aniversários em seu banco de dados que correspondam à data atual.
- Verifique o console ou os logs da CLI para confirmar que a função foi executada com sucesso.
🎁 Conclusão
Aqui está o que conseguimos hoje:
✅ Configuramos doctl
e criamos um namespace para nosso projeto.
✅ Refatoramos o script em Python para implantação.
✅ Empacotamos e implantamos o Serviço de Lembrete de Aniversário nas Funções do DigitalOcean.
✅ Testamos a função na nuvem usando tanto a CLI quanto o Painel do DigitalOcean.
Próximo passo: Embora este seja um grande avanço, ainda estamos executando a função manualmente. No próximo post, vamos automatizar esse processo para que o Serviço de Lembrete de Aniversário seja executado automaticamente todos os dias a uma hora específica. Imagine acordar com um lembrete de texto sem levantar um dedo—vamos fazer isso acontecer amanhã! 🚀