Pacote de implantação do AWS Lambda em Java - AWS Lambda

Pacote de implantação do AWS Lambda em Java

Um pacote de implantação é um arquivo ZIP que contém as dependências e o código da função compilados. Você pode fazer upload do pacote diretamente no Lambda ou pode usar um bucket do Amazon S3 e fazer upload dele no Lambda. Se o pacote de implantação for maior do que 50 MB, você deverá usar Amazon S3.

O AWS Lambda fornece as seguintes bibliotecas para funções em Java:

Essas bibliotecas estão disponíveis no repositório central do Maven. Adicione-as à sua definição de compilação da seguinte forma.

Gradle
dependencies { implementation 'com.amazonaws:aws-lambda-java-core:1.2.1' implementation 'com.amazonaws:aws-lambda-java-events:2.2.9' runtimeOnly 'com.amazonaws:aws-lambda-java-log4j2:1.2.0' }
Maven
<dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-core</artifactId> <version>1.2.1</version> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-events</artifactId> <version>2.2.9</version> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-log4j2</artifactId> <version>1.2.0</version> </dependency> </dependencies>

Para criar um pacote de implantação, compile o código e as dependências da sua função em um único arquivo ZIP ou Java Archive (JAR). Para o Gradle, use o tipo de compilação Zip. Para o Maven, use o plug-in Maven Shade.

nota

Para manter o pacote de implantação pequeno, empacote as dependências da função em camadas. As camadas permitem gerenciar as suas dependências de forma independente, podem ser usadas por várias funções e podem ser compartilhadas com outras contas. Para obter mais detalhes, consulte Camadas do AWS Lambda.

É possível fazer upload do seu pacote de implantação usando o console do Lambda, a API do Lambda ou o AWS SAM.

Como fazer upload de um pacote de implantação com o console do Lambda

  1. Abra a página Functions (Funções) do console do Lambda.

  2. Escolha uma função.

  3. Em Function code (Código de função), escolha Upload (Fazer upload).

  4. Faça upload do pacote de implantação.

  5. Escolha Save (Salvar).

Compilar um pacote de implantação com o Gradle

Use o tipo de compilação Zip para criar um pacote de implantação com o código e as dependências da função.

exemplo build.gradle – tarefa de compilação

task buildZip(type: Zip) { from compileJava from processResources into('lib') { from configurations.runtimeClasspath } }

Essa configuração de compilação produz um pacote de implantação na pasta build/distributions. A tarefa compileJava compila as classes da função. As tarefas processResources copiam bibliotecas do classpath da compilação em uma pasta chamada lib.

exemplo build.gradle – dependências

dependencies { implementation platform('software.amazon.awssdk:bom:2.10.73') implementation 'software.amazon.awssdk:lambda' implementation 'com.amazonaws:aws-lambda-java-core:1.2.1' implementation 'com.amazonaws:aws-lambda-java-events:2.2.9' implementation 'com.google.code.gson:gson:2.8.6' implementation 'org.apache.logging.log4j:log4j-api:2.13.0' implementation 'org.apache.logging.log4j:log4j-core:2.13.0' runtimeOnly 'org.apache.logging.log4j:log4j-slf4j18-impl:2.13.0' runtimeOnly 'com.amazonaws:aws-lambda-java-log4j2:1.2.0' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.0' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.6.0' }

O Lambda carrega arquivos JAR em Unicode em ordem alfabética. Se vários arquivos JAR na pasta lib contiverem a mesma classe, a primeira será usada. Use o script de shell a seguir para identificar classes duplicadas.

exemplo test-zip.sh

mkdir -p expanded unzip path/to/my/function.zip -d expanded find ./expanded/lib -name '*.jar' | xargs -n1 zipinfo -1 | grep '.*.class' | sort | uniq -c | sort

Compilar um pacote de implantação com o Maven

Para compilar um pacote de implantação com o Maven, use o plug-in Maven Shade. O plug-in cria um arquivo JAR que contém o código de função compilado e todas as suas dependências.

exemplo pom.xml – configuração do plug-in

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.2</version> <configuration> <createDependencyReducedPom>false</createDependencyReducedPom> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> </execution> </executions> </plugin>

Para compilar o pacote de implantação, use o comando mvn package.

[INFO] Scanning for projects... [INFO] -----------------------< com.example:java-maven >----------------------- [INFO] Building java-maven-function 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- ... [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ java-maven --- [INFO] Building jar: target/java-maven-1.0-SNAPSHOT.jar [INFO] [INFO] --- maven-shade-plugin:3.2.2:shade (default) @ java-maven --- [INFO] Including com.amazonaws:aws-lambda-java-core:jar:1.2.1 in the shaded jar. [INFO] Including com.amazonaws:aws-lambda-java-events:jar:2.2.9 in the shaded jar. [INFO] Including joda-time:joda-time:jar:2.6 in the shaded jar. [INFO] Including com.google.code.gson:gson:jar:2.8.6 in the shaded jar. [INFO] Replacing original artifact with shaded artifact. [INFO] Replacing target/java-maven-1.0-SNAPSHOT.jar with target/java-maven-1.0-SNAPSHOT-shaded.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 8.321 s [INFO] Finished at: 2020-03-03T09:07:19Z [INFO] ------------------------------------------------------------------------

Esse comando gera um arquivo JAR na pasta target.

Se você usar a biblioteca appender (aws-lambda-java-log4j2), também será necessário configurar um transformador para o plug-in Maven Shade. A biblioteca do transformador combina versões de um arquivo de cache que aparecem na biblioteca appender e no Log4j.

exemplo pom.xml – configuração do plug-in com o appender do Log4j 2

<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.2</version> <configuration> <createDependencyReducedPom>false</createDependencyReducedPom> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="com.github.edwgiz.maven_shade_plugin.log4j2_cache_transformer.PluginsCacheFileTransformer"> </transformer> </transformers> </configuration> </execution> </executions> <dependencies> <dependency> <groupId>com.github.edwgiz</groupId> <artifactId>maven-shade-plugin.log4j2-cachefile-transformer</artifactId> <version>2.13.0</version> </dependency> </dependencies> </plugin>

Fazer upload de um pacote de implantação com a API do Lambda

Para atualizar o código de uma função com a AWS CLI ou o AWS SDK, use a operação de API UpdateFunctionCode. Para a CLI da AWS, use o comando update-function-code. O comando a seguir faz upload de um pacote de implantação chamado my-function.zip no diretório atual.

~/my-function$ aws lambda update-function-code --function-name my-function --zip-file fileb://my-function.zip { "FunctionName": "my-function", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "Runtime": "java8", "Role": "arn:aws:iam::123456789012:role/lambda-role", "Handler": "example.Handler", "CodeSha256": "Qf0hMc1I2di6YFMi9aXm3JtGTmcDbjniEuiYonYptAk=", "Version": "$LATEST", "TracingConfig": { "Mode": "Active" }, "RevisionId": "983ed1e3-ca8e-434b-8dc1-7d72ebadd83d", ... }

Se o pacote de implantação for maior que 50 MB, não será possível fazer upload diretamente. Faça upload em um bucket do Amazon S3 e aponte o Lambda para o objeto. Os exemplos de comando a seguir fazem upload de um pacote de implantação em um bucket chamado my-bucket e o usam para atualizar o código de uma função.

~/my-function$ aws s3 cp my-function.zip s3://my-bucket upload: my-function.zip to s3://my-bucket/my-function ~/my-function$ aws lambda update-function-code --function-name my-function \ --s3-bucket my-bucket --s3-key my-function.zip { "FunctionName": "my-function", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "Runtime": "java8", "Role": "arn:aws:iam::123456789012:role/lambda-role", "Handler": "example.Handler", "CodeSha256": "Qf0hMc1I2di6YFMi9aXm3JtGTmcDbjniEuiYonYptAk=", "Version": "$LATEST", "TracingConfig": { "Mode": "Active" }, "RevisionId": "983ed1e3-ca8e-434b-8dc1-7d72ebadd83d", ... }

É possível usar esse método para fazer upload de pacotes de função até 250 MB (descompactado).

Fazer upload de um pacote de implantação com o AWS SAM

É possível usar o Modelo de aplicativo sem servidor da AWS para automatizar implantações do código, da configuração e das dependências da sua função. O AWS SAM é uma extensão do AWS CloudFormation que fornece uma sintaxe simplificada para definir aplicativos sem servidor. O exemplo de modelo a seguir define uma função com um pacote de implantação no diretório build/distributions que o Gradle usa.

exemplo template.yml

AWSTemplateFormatVersion: '2010-09-09' Transform: 'AWS::Serverless-2016-10-31' Description: An AWS Lambda application that calls the Lambda API. Resources: function: Type: AWS::Serverless::Function Properties: CodeUri: build/distributions/java-basic.zip Handler: example.Handler Runtime: java8 Description: Java function MemorySize: 512 Timeout: 10 # Function's execution role Policies: - AWSLambdaBasicExecutionRole - AWSLambdaReadOnlyAccess - AWSXrayWriteOnlyAccess - AWSLambdaVPCAccessExecutionRole Tracing: Active

Para criar a função, use os comandos deploy e package. Esses comandos são personalizações para a CLI da AWS. Eles envolvem outros comandos para fazer upload do pacote de implantação no Amazon S3, reescrevem o modelo com o URI do objeto e atualizam o código da função.

O exemplo de script a seguir executa uma compilação do Gradle e faz upload do pacote de implantação que ele cria. Ele cria uma pilha do AWS CloudFormation na primeira vez que você executá-lo. Se a pilha já existir, o script a atualizará.

exemplo deploy.sh

#!/bin/bash set -eo pipefail aws cloudformation package --template-file template.yml --s3-bucket MY_BUCKET --output-template-file out.yml aws cloudformation deploy --template-file out.yml --stack-name java-basic --capabilities CAPABILITY_NAMED_IAM

Para obter um exemplo funcional completo, consulte os aplicativos de exemplo a seguir.

Aplicativos de exemplo do Lambda em Java

  • blank-java – uma função Java que mostra o uso das bibliotecas Java do Lambda, registro em log, variáveis de ambiente, camadas, rastreamento do AWS X-Ray, testes de unidade e do AWS SDK.

  • java-basic – uma função Java mínima com testes de unidade e configuração de registro em log variável.

  • java-events – uma função Java mínima que usa a biblioteca aws-lambda-java-events com tipos de evento que não exigem o AWS SDK como dependência, como o Amazon API Gateway.

  • java-events-v1sdk – uma função Java que usa a biblioteca aws-lambda-java-events com tipos de evento que exigem o AWS SDK como dependência (Amazon Simple Storage Service, Amazon DynamoDB e Amazon Kinesis).

  • s3-java – uma função Java que processa eventos de notificação do Amazon S3 e usa a Java Class Library (JCL) para criar miniaturas de arquivos de imagem enviados por upload.