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:
- Como criar uma função lambda em ruby
- Como configurar o Dockerfile para utilizar a imagem do aws-lambda-ruby
- 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:
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:
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:
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
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