Rachid Calazans de Viveiros

July 6, 2021

AWS Lambda em Ruby e Docker

docker-lambda-ruby.png

Nesse post irei mostrar de uma forma simples e direta como integrar uma função lambda em Ruby e Docker. Além de mostrar maneira correta de testar localmente seu código.

O que você vai ver nesse post:

  1. Como criar uma função lambda em ruby
  2. Como configurar o Dockerfile para utilizar a imagem do aws-lambda-ruby
  3. Como testar sua aplicação lambda localmente


Como criar a função lambda em ruby


1. Criar um novo diretório para o projeto. No terminal digite:
mkdir lambda-ruby-hello

2. Dentro no novo diretório, criar um novo arquivo ruby que possuirá a função (método) que será executando pelo lambda. Digite no terminal:
touch app.rb

3. Declarar a função no padrão lambda, com seus parâmetros corretos:
# ./app.rb

def run(event:, context:)
  pp '=== Event ==='
  pp event
end
Foi definido o método #run com os dois parâmetros necessários (event:, context:) para que o método seja chamado corretamente quando o Lambda for executado.

No nosso exemplo, o método #run irá fazer apenas o print do parâmetro :event que está recebendo da execução feita no lambda.

Detalhe importante, o nome do método pode ser qualquer um, o método lambda precisa apenas dos parâmetros corretos.

Caso o projeto necessite de qualquer dependência, basta você criar o Gemfile dentro da raiz. Um exemplo do arquivo:
# ./Gemfile

source 'https://rubygems.org'

# Basta declarar todas as dependências

Agora que temos o arquivo com a função e Gemfile com as dependências, vamos para a próxima etapa, criar o Dockerfile.


Como configurar o Dockerfile para utilizar a imagem do aws-lambda-ruby


A imagem oficial aws-lambda-ruby já contém todo o código lambda que vai ser executado. Precisamos apenas fazer algumas configurações:

1. Setar o FROM com a imagem oficial
2. Setar o COPY com os arquivos que iremos colocar dentro do container
3. Setar o RUN para instalar as dependências que estão no Gemfile
4. Setar o CMD para informar qual é o arquivo e método (função) que será executado pelo lambda

Segue o arquivo Dockerfile configurado:

# ./Dockerfile

FROM public.ecr.aws/lambda/ruby:2.7

COPY app.rb Gemfile ./

# Install ruby dependencies
RUN gem install bundler
RUN bundle install --path vendor/bundle

# Basic command script
CMD ["app.run"]

Na etapa 2 estamos informando que irá ser copiado para o container os arquivos app.rb e Gemfile.
Na etapa 3 estamos instalando a gem bundler e logo em seguida instalando todas as gems dependentes que estão dentro do Gemfile

Note a opção que estamos passando para o bundle install, --path vendor/bundle. Essa opção é importante porque se não colocá-la quando rodar o bundle install, as gems serão salvas em um diretório diferente da que o lambda irá ser executado. Irei comentar mais sobre isso no tópico sobre testar o lambda localmente.

Na etapa 4 estamos indicando o comando com o nome do arquivo e o nome do método que está definido dentro do arquivo, ou seja, qual é o método lambda que será executado:
CMD ["NOME_ARQUIVO.NOME_MÉTODO"] => CMD ["app.run"]
 
Com o Dockerfile configurado, está na hora de testar nossa função lambda localmente.


Como testar sua aplicação lambda localmente


Uma dependência para poder testar o container é ter o Docker instalado. Caso não tenha, clique aqui para acessar o site oficial e instalar.

Primeira etapa é fazer o build do nosso Docker image através do comando docker build. Vamos dar o nome de hello-world:
docker build -t hello-world .

Para podermos testar corretamente o lambda, é necessário iniciar o nosso Docker image hello-world.
docker run -p 9000:8080 hello-world

Agora com nosso lambda server levantado, podemos fazer o teste de executar como um lambda. Vamos executar um curl com um evento POST para um endpoint padrão do aws-lambda (que o container já possui por conta da imagem oficial que utilizamos) com os parâmetros que queremos passar:
curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload": "Hello World"}'

Esse comando irá executar a função lambda que está rodando no container e retornará uma resposta.
Um detalhe importante é que a opção -d (são os parâmetros que iremos passar para o lambda) é obrigatório.

Importante

Se você quiser subir o container com:
docker exec -it HASH_ID bash
Entrar no container e tentar executar seu código através do console ou até executar com o comando ruby, você precisa ter ciência de uma coisa:

As gems que foram instaladas não estarão na pasta correta para serem executadas com esses comandos, ou seja, seu código vai informar que as Gem's precisam ser instaladas. Portanto a maneira mais correta para testar seu código lambda é através do CURL.

Pronto, agora você já criou seu projeto lambda e testou localmente. O próximo passo é fazer o deploy para o AWS. Porém esse passo não iremos cobrir nesse post.
 
Caso você tenha gostado desse post e gostaria de um outro post  explicando como fazer Deploy em diferentes formas, deixa um comentário ou envia um email :)

Obrigado.

Referências