
Dando continuidade à nossa arquitetura, hoje iremos utilizar o Serverless Framework para fazer o deploy de nossas funções lambda e de um bucket de armazenamento, o S3, e também como criar gatilhos para despertar as funções.
Este artigo tutorial é auxiliar ao vídeo gravado pelo trainee Guilherme Ferreira Rocha, que está no Youtube do TerraLAB. Veja aqui:
Esta é a parte 2 deste tutorial, então aconselhamos que, caso ainda não esteja acompanhando desde a primeira parte, volte para entender exatamente o que estamos arquitetando. O repositório HandsOn AWS-TerraLAB contém todo o código utilizado nos tutoriais.
Retomando o Projeto
A principal parte de nossa arquitetura, são as funções lambdas, as quais são responsáveis por adquirir as informações sobre os pokémons, tal como armazenar essas informações da maneira que desejamos. Para invocarmos uma função a ser executada, o mais comum é a utilização de gatilhos, provenientes de serviços da própria provedora, em nosso caso, a AWS. Neste tutorial utilizaremos dois tipos de gatilho, sendo eles uma rota http, gerenciada pelo AWS API Gateway, e via mensagens na fila Amazon MQ. Outro serviço que faremos o deploy, é o S3 (Simple Storage Service), o qual irá armazenar as informações particionadas por tipo dos pokémons.
Para continuar o tutorial, você precisa ter o Serverless Framework instalado, neste artigo temos os passos para realizar a instalação.
Para iniciar, abra o terminal no diretório que irá conter seu código serverless e digite o seguinte comando, para gerar um template básico em python 3 e aws:
serverless create --template aws-python3
Para mais detalhes sobre comandos do serverless, você pode encontrar na documentação do framework.
Feito isso você deverá obter esses dois arquivos principais:
|_handler.py
|_serverless.yml
Para esse tutorial, estaremos mexendo no arquivo serverless.yml para configurar todo o nosso deploy das funções lambda. A princípio, a configuração terá 3 partes principais: a do provedor, a das funções e a dos recursos.
No provedor iremos especificar qual o runtime das nossa funções, o quanto de memória será alocadas para elas, a região dos serviços e algumas permissões, como no código a seguir (no vídeo, cada campo da configuração é mais detalhado e explicado).
service: tutorial-pokemon
frameworkVersion: '2'
provider:
name: aws
runtime: python3.8
lambdaHashingVersion: 20201221
region: us-east-1
memorySize: 128
iam:
role:
statements:
- Effect: Allow
Action:
- s3:PutObject
- mq:DescribeBroker
- secretsmanager:GetSecretValue
- kms:Decrypt
Resource:
- "*"
Nas funções, temos que indicar qual arquivo e sua respectiva função será atrelada a Lambda assim como os seus respectivos gatilhos, caso existentes. Infelizmente um dos gatilhos que precisamos utilizar (gatilho MQ) ainda não tem suporte de configuração via serverless framework, será necessário posteriormente criá-lo manualmente pela AWS.
A seguir temos a configuração da lambda 1 e seu gatilho, e da lambda da 2 sem o gatilho definido.
functions:
lambda1-pokemon:
handler: lambda1.main
events:
- http:
path: lambda1/pokemon
method: GET
lambda2-pokemon:
handler: lambda2.main
E por último, os recursos necessários, como o S3 Bucket na configuração seguinte.
resources:
Resources:
BucketUpload:
Type: AWS::S3::Bucket
Properties:
BucketName: bucket-pokemon-tutorial-v2
Dessa forma, o arquivo serverless.yml ficará assim:
service: tutorial-pokemon
frameworkVersion: '2'
provider:
name: aws
runtime: python3.8
lambdaHashingVersion: 20201221
region: us-east-1
memorySize: 128
iam:
role:
statements:
- Effect: Allow
Action:
- s3:PutObject
- mq:DescribeBroker
- secretsmanager:GetSecretValue
- kms:Decrypt
Resource:
- "*"
functions:
lambda1-pokemon:
handler: lambda1.main
events:
- http:
path: lambda1/pokemon
method: GET
lambda2-pokemon:
handler: lambda2.main
resources:
Resources:
BucketUpload:
Type: AWS::S3::Bucket
Properties:
BucketName: bucket-pokemon-tutorial-v2
Estamos aptos a fazer o deploy desses serviços, para isso usaremos o seguinte comando no terminal, no diretório do nosso arquivo serverless.yml :
serverless deploy
Após o sucesso do deploy, iremos nos direcionar ao console da AWS com o intuito de criar o gatilho da lambda 2, que ficou pendente. Para acessar a lambda 2 siga o seguinte caminho: digite lambda na pesquisa > vá até funções na barra lateral > e entre em tutorial-pokemon-dev-lambda2-pokemon
Clique em adicionar gatilho > MQ e preencha as informações da seguinte forma como no gif a seguir:
Agente do Amazon MQ: fila-pokemon
Tamanho do lote: 1
Nome da fila: save-pokemon
Segredo de acesso de origem: tutorial/mq/users
Pronto, nossa configuração do serverless está completa e pronta para receber nossos códigos das funções.
Conclusão
O serverless framework foi responsável pelo provisionamento de nossas funções e o seu S3 bucket de armazenamento. Com o arquivo serverless.yml criado, somos capazes de realizar rapidamente o deploy de múltiplas funções a cada mudança necessária, facilitando a vida do programador que poderá focar seus esforços apenas no código a partir de agora.
Se você se interessou pelo assunto, temos mais sobre o tema em nosso blog, e fique ligado para os próximos passos desse tutorial.
Você sabia que este artigo foi escrito por um trainee do TerraLAB? Você sabe como a escassez de profissionais qualificados impacta as empresas de Tecnologia da Informação? Clique aqui para conhecer os desafios desta indústria e como uma parceria com o TerraLAB pode ajudar você e a sua empresa. O TerraLAB é um celeiro de talentos que prepara estudantes para o mercado de trabalho, oferecendo vivências em projetos reais e experiência nos mais modernos processos e ferramentas de desenvolvimento de software. Siga-nos nas redes sociais para saber mais!
Este artigo foi escrito por Guilherme Ferreira Rocha, revisado por Prof. Rodrigo Silva.