O blog da AWS

O runtime Ruby 3.2 agora está disponível no AWS Lambda

Este post foi escrito por Praveen Koorse, arquiteto sênior de soluções da AWS , e adaptado para Português por Daniel ABIB, arquiteto sênior de soluções para Entreprise .

 

O AWS Lambda agora oferece suporte ao runtime Ruby 3.2. Com essa versão, os desenvolvedores em Ruby agora podem aproveitar os novos recursos e melhorias introduzidos no Ruby 3 ao criar aplicativos Serverless no Lambda. Use esse runtime hoje especificando o parâmetro de runtime ruby3.2 ao criar ou atualizar funções do Lambda.

O Ruby 3.2 adiciona muitos recursos e melhorias de desempenho, incluindo melhorias na transmissão de argumentos anônimos, métodos “infinitos”, melhorias no Regexp, uma nova classe Data, suporte para correspondência de padrões em Time e MatchData e suporte para “encontrar padrão” na correspondência de padrões.

Nossos testes mostram que as partidas a frio (cold start) em Ruby 3.2 são um pouco mais lentas do que as em Ruby 2.7 para uma função simples de “hello world”. No entanto, para muitos workloads de caráter mais produtivo, o desempenho aprimorado de execução em Ruby 3.2 resulta em um desempenho geral semelhante ou melhor.

Os clientes atuais do Lambda que usam o runtime Ruby 2.7 devem migrar para o runtime Ruby 3.2 o mais rápido possível. Embora o suporte da comunidade para o Ruby 2.7 tenha terminado, o Lambda estendeu o suporte ao runtime Ruby 2.7 até 7 de dezembro de 2023 para fornecer aos clientes existentes em Ruby tempo de transição para o Ruby 3.2. As funções que usam o Ruby 2.7 continuam qualificadas para suporte técnico e o Lambda continuará aplicando atualizações de segurança do sistema operacional ao tempo de execução até essa data.

“Argumentos anônimos” aprovando melhorias

O Ruby 3.2 introduziu melhorias na forma como você pode transmitir argumentos anônimos, facilitando e limpando o trabalho com argumentos de palavras-chave no código. Anteriormente, você podia passar argumentos de palavras-chave anônimos para um método usando a sintaxe de delegação (…) ou usar o Módulo #ruby2_keywords e delegar *args, &block. Esse método não era intuitivo e carecia de clareza ao trabalhar com vários argumentos.

Agora, se uma declaração de método incluir argumentos posicionais ou de palavras-chave anônimos, eles poderão ser passados para o próximo método como argumentos em si. As mesmas vantagens do encaminhamento de blocos anônimo se aplicam ao encaminhamento de argumentos rest e de palavras-chave REST.

Métodos infinitos (endless)

O Ruby 3 introduziu métodos infinitos que permitem aos desenvolvedores definir métodos de exatamente uma instrução com uma sintaxe def method () = statement. A sintaxe não precisa de um end e permite que os métodos sejam definidos como um atalho, facilitando a criação de métodos utilitários básicos e ajudando os desenvolvedores a escrever código limpo e melhorar a legibilidade e a manutenção do código.

Melhorias no Regexp

A correspondência de expressões regulares pode levar um tempo inesperadamente longo. Se seu código tentar comparar uma Regexp possivelmente ineficiente com uma entrada não confiável, um atacante (invasor) poderá explorá-la para uma negação de serviço eficiente (a chamada expressão regular DoS, ou RedOS).

O Ruby 3.2 introduz duas melhorias para mitigar isso.

O primeiro é um algoritmo aprimorado de correspondência de Regexp usando uma abordagem baseada em cache que permite que a maior parte da correspondência de Regexp seja concluída em tempo linear, melhorando significativamente o desempenho geral da correspondência.

Como a otimização anterior não pode ser aplicada a algumas expressões regulares, como aquelas que usam recursos avançados ou trabalham com um grande número fixo de repetições, uma melhoria no tempo limite de Regexp agora permite que você especifique um tempo limite para operações de Regexp como uma medida alternativa.

Há duas APIs para definir o tempo limite:

  • Timeout.Timeout: Essa é uma configuração global e se aplica a todos os Regexps no processo.
  • palavra-chave de Timeout para Regexp.new: Isso permite que você especifique uma configuração de tempo limite diferente para alguns Regexps. Se usado, ele tem precedência sobre a configuração global.

 

Classe de dados

O Ruby 3.2 introduz uma nova classe principal — ‘Data’ — para representar objetos simples semelhantes a valores. A classe é semelhante à Struct e compartilha parcialmente a implementação, mas pretende ser imutável com uma interface mais moderna.

Depois que uma classe Data é definida usando Data.define, argumentos posicionais e de palavra-chave podem ser usados ao construir objetos.

Melhorias na correspondência de padrões

A correspondência de padrões é um recurso que permite a correspondência profunda de valores estruturados: verificando a estrutura e vinculando as partes correspondentes às variáveis locais.

O Ruby 3.2 introduz o “Find pattern”, permitindo que você verifique se o objeto fornecido tem algum elemento que corresponda a um padrão. Esse padrão é semelhante ao padrão Array, exceto que ele encontra a primeira correspondência em um determinado objeto contendo vários elementos.

Por exemplo, anteriormente, se você usou o seguinte em uma função Lambda:


Isso não corresponderia porque não procura o elemento na matriz ‘filhos’. Ele corresponde apenas a uma matriz com um único elemento chamado “Mark”.

Para encontrar um elemento em uma matriz com vários elementos, use ‘encontrar padrão’:

Como parte de um esforço para tornar as classes principais mais amigáveis à correspondência de padrões, o Ruby 3.2 também introduz a capacidade de desconstruir chaves em Time e MatchData, permitindo seu uso em declarações maiúsculas e minúsculas para correspondência de padrões.

As classes Standard Date e DateTime também têm implementações semelhantes para desconstrução de chaves.

Correspondência de padrões com a desconstrução do resultado MatchData:

YJIT — Mais um Ruby JIT

O YJIT, um compilador Ruby JIT leve e minimalista construído dentro do Cruby, agora é uma parte oficial do runtime Ruby 3.2. Ele fornece um desempenho significativamente maior, mas também usa mais memória do que o interpretador Ruby e geralmente é adequado para cargas de trabalho em Ruby on Rails.

Por padrão, o YJIT não está habilitado no runtime Lambda Ruby 3.2. Você pode habilitá-lo para funções específicas definindo a variável de ambiente RUBY_YJIT_ENABLE como 1. Uma vez ativado, você pode verificá-lo imprimindo o resultado no método RubyVM::YJIT.enabled?.

Usando Ruby 3.2 no Lambda

Via CDK – Kit de desenvolvimento em nuvem da AWS (AWS CDK):

No AWS CDK, defina o atributo runtime como runtime.RUBY_3_2 ao criar a função para usar essa versão. Em TypeScript:

Usando a Console de gerenciamento da AWS

No console do Lambda, especifique um valor de parâmetro de runtime Ruby 3.2 ao criar ou atualizar uma função. O runtime Ruby 3.2 agora está disponível no menu suspenso Runtime na página Criar função.

Create function

Para atualizar uma função existente do Lambda para o Ruby 3.2, navegue até a função no console do Lambda e escolha Editar no painel de configurações do Runtime. A nova versão em Ruby está disponível no menu suspenso Runtime:

Edit runtime settings

Usando o SAM – Serverless Application Model da AWS

No AWS Serverless Application Model (AWS SAM), defina o atributo Runtime como ruby3.2 para usar essa versão em suas implantações de aplicativos:

Conclusão

Comece a usar o Ruby 3.2 hoje mesmo, fazendo as alterações necessárias para compatibilidade com o Ruby 3.2 e especificando um valor de parâmetro de runtime ruby3.2 ao criar ou atualizar suas funções do Lambda. Você pode ler sobre o modelo de programação Ruby na documentação do Lambda para saber mais sobre funções de escrita no Ruby 3.2.

Para obter mais recursos de aprendizado Serverless, visite Serverless Land.

 

Este artigo foi traduzido do Blog da AWS em Inglês.


Sobre o autor

Praveen Koorse

 

 

 

 

Tradutor

Daniel Abib é Enterprise Solution Architect na AWS, com mais de 25 anos trabalhando com gerenciamento de projetos, arquiteturas de soluções escaláveis, desenvolvimento de sistemas e CI/CD, microsserviços, arquitetura Serverless & Containers e segurança. Ele trabalha apoiando clientes corporativos, ajudando-os em sua jornada para a nuvem.

https://www.linkedin.com/in/danielabib/