AWS Lambda
La extensión quarkus-amazon-lambda
le permite utilizar Quarkus para construir sus AWS Lambdas. Sus lambdas pueden utilizar anotaciones de inyección de CDI o Spring y otras facilidades de Quarkus según las necesite.
Las lambdas de Quarkus pueden desplegarse utilizando el tiempo de ejecución de Amazon Java, o puede construir un ejecutable nativo y utilizar el tiempo de ejecución personalizado de Amazon si desea una huella de memoria menor y un tiempo de arranque en frío más rápido.
La integración de Quarkus con las lambdas también es compatible con el ciclo de desarrollo Live Coding de Quarkus. Usted puede traer su proyecto Quarkus lambda en el modo de desarrollo o de prueba y el código en su proyecto en vivo.
Requisitos previos
To complete this guide, you need:
-
Roughly 30 minutes
-
An IDE
-
JDK 17+ installed with
JAVA_HOME
configured appropriately -
Apache Maven 3.9.9
-
Optionally the Quarkus CLI if you want to use it
-
Optionally Mandrel or GraalVM installed and configured appropriately if you want to build a native executable (or Docker if you use a native container build)
-
AWS SAM CLI, para pruebas locales
Para proyectos Gradle por favor vea más abajo, o para mayor referencia consulte la guía en la página de configuración de Gradle . |
Primeros pasos
Esta guía le mostrará cómo generar un proyecto Java de ejemplo mediante un arquetipo de maven e implementarlo en AWS.
Instalación de los bits de AWS
Instalar todos los bits de AWS es probablemente lo más difícil de esta guía. Asegúrate de seguir todos los pasos para instalar AWS CLI.
Creación del proyecto de Maven
Crea el proyecto Quarkus AWS Lambda maven usando nuestro Maven Archetype.
mvn archetype:generate \
-DarchetypeGroupId=io.quarkus \
-DarchetypeArtifactId=quarkus-amazon-lambda-archetype \
-DarchetypeVersion=3.16.3
Si prefiere utilizar Gradle, puede generar rápida y fácilmente un proyecto Gradle a través de code.quarkus.io añadiendo la extensión Copie el build.gradle, gradle.properties y settings.gradle en el proyecto arquetipo de Maven generado anteriormente, para seguir con esta guía. Ejecuta: gradle wrapper para configurar el gradle wrapper (recomendado). Para obtener todos los detalles de Gradle, consulte la sección de construcción de Gradle más abajo. |
Elija su lambda
La extensión quarkus-amazon-lambda
busca en tu proyecto una clase que implemente directamente la interfaz de Amazon RequestHandler<?, ?>
o RequestStreamHandler
. Debe encontrar una clase en tu proyecto que implemente esta interfaz o lanzará un fallo de compilación. Si encuentra más de una clase manejadora, también se lanzará una excepción de tiempo de compilación.
A veces, sin embargo, puede tener unas cuantas lambdas relacionadas que comparten código y crear varios módulos maven es una sobrecarga que no quiere hacer. La extensión quarkus-amazon-lambda
le permite agrupar varias lambdas en un proyecto y utilizar la configuración o una variable de entorno para elegir el manejador que desea desplegar.
El proyecto generado tiene tres lambdas en su interior. Dos que implementan la interfaz RequestHandler<?, ?>
y una que implementa la interfaz RequestStreamHandler
. Una que se utiliza y dos que no se utilizan. Si abre src/main/resources/application.properties
verá esto:
quarkus.lambda.handler=test
La propiedad quarkus.lambda.handler
le dice a Quarkus qué manejador lambda desplegar. Esto también puede anularse con una variable de entorno.
Si observas las tres clases manejadoras generadas en el proyecto, verás que son @Named
diferentes.
@Named("test")
public class TestLambda implements RequestHandler<InputObject, OutputObject> {
}
@Named("unused")
public class UnusedLambda implements RequestHandler<InputObject, OutputObject> {
}
@Named("stream")
public class StreamLambda implements RequestStreamHandler {
}
El nombre CDI de la clase manejadora debe coincidir con el valor especificado en la propiedad quarkus.lambda.handler
.
Implementar en AWS Lambda Java Runtime
Hay unos cuantos pasos para conseguir que su lambda funcione en AWS. El proyecto maven generado contiene un script útil para crear, actualizar, eliminar e invocar sus lambdas para implementaciones Java puras y nativas.
Construir y desplegar
Construye el proyecto:
quarkus build
./mvnw install
./gradlew build
Esto compilará y empaquetará su código.
Crear un rol de ejecución
Consulte la Guía de inicio para implementar un lambda con AWS CLI. Específicamente, asegúrese de haber creado un Execution Role
. Tendrá que definir una variable de entorno LAMBDA_ROLE_ARN
en su perfil o ventana de consola, Alternativamente, puede editar el script manage.sh
que es generado por la compilación y poner el valor del rol directamente allí:
LAMBDA_ROLE_ARN="arn:aws:iam::1234567890:role/lambda-role"
Archivos extra generados por la compilación
Después de ejecutar la compilación, hay algunos archivos adicionales generados por la extensión quarkus-amazon-lambda
. Estos archivos están en el directorio de construcción: target/
para maven, build/
para gradle.
-
function.zip
- archivo de despliegue de lambda -
manage.sh
- envoltura alrededor de las llamadas aws lambda cli -
bootstrap-example.sh
- ejemplo de secuencia de comandos de arranque para las implantaciones nativas -
sam.jvm.yaml
- (opcional) para su uso con sam cli y pruebas locales -
sam.native.yaml
- (opcional) para su uso con sam cli y pruebas locales nativas
Crear la función
El script target/manage.sh
sirve para administrar su lambda utilizando el tiempo de ejecución Java de AWS Lambda. Este script se proporciona únicamente para su comodidad. Examine la salida del script manage.sh
si desea saber qué comandos aws se ejecutan para crear, eliminar y actualizar sus lambdas.
manage.sh
admite cuatro operaciones: create
, delete
, update
, y invoke
.
Para verificar su configuración, que tiene la CLI de AWS instalada, ha ejecutado aws configure para las claves de acceso de AWS y ha configurado la variable de entorno LAMBDA_ROLE_ARN (como se ha descrito anteriormente), ejecute manage.sh sin ningún parámetro. Se imprimirá una declaración de uso para guiarte en consecuencia.
|
Si utiliza Gradle, la ruta a los binarios en manage.sh debe cambiarse de target a build
|
Para ver la declaración usage
, y validar la configuración de AWS:
sh target/manage.sh
Puede crear su función utilizando el siguiente comando, create
:
sh target/manage.sh create
o si no tiene LAMBDA_ROLE_ARN
ya definido en este shell:
LAMBDA_ROLE_ARN="arn:aws:iam::1234567890:role/lambda-role" sh target/manage.sh create
No cambie el interruptor del manejador. Este debe estar codificado de manera fija como io.quarkus.amazon.lambda.runtime.QuarkusStreamHandler::handleRequest . Este controlador inicializa Quarkus y envuelve su controlador real para que la inyección se puede realizar.
|
Si hay algún problema en la creación de la función, debe borrarla con la función delete
antes de volver a ejecutar el comando create
.
sh target/manage.sh delete
Los comandos también pueden apilarse:
sh target/manage.sh delete create
Invocar la lambda
Utilice el comando invoke
para invocar su función.
sh target/manage.sh invoke
La lambda de ejemplo toma la entrada pasada a través del modificador --payload
que apunta a un archivo json en el directorio raíz del proyecto.
La lambda también se puede invocar localmente con la CLI de SAM de la siguiente manera:
sam local invoke --template target/sam.jvm.yaml --event payload.json
Si está trabajando con su construcción de imagen nativa, simplemente reemplace el nombre de la plantilla con la versión nativa:
sam local invoke --template target/sam.native.yaml --event payload.json
Actualizar la lambda
Puede actualizar el código Java como considere oportuno. Una vez que haya reconstruido, puede volver a desplegar su lambda ejecutando el comando update
.
sh target/manage.sh update
Implementación en el tiempo de ejecución personalizado (nativo) de AWS Lambda
Si quieres una menor huella de memoria y tiempos de inicialización más rápidos para tu lambda, puedes compilar tu código Java a un ejecutable nativo. Sólo asegúrese de reconstruir su proyecto con el interruptor -Pnative
.
Para hosts Linux, ejecute:
quarkus build --native
./mvnw install -Dnative
./gradlew build -Dquarkus.native.enabled=true
Si está construyendo en un sistema que no sea Linux, tendrá que pasar también una propiedad indicando a Quarkus que utilice una construcción docker, ya que Amazon Lambda requiere binarios linux. Puede hacerlo pasando esta propiedad a su build: -Dquarkus.native.container-build=true . Sin embargo, esto requiere que tenga Docker instalado localmente.
|
quarkus build --native --no-tests -Dquarkus.native.container-build=true
# The --no-tests flag is required only on Windows and macOS.
./mvnw install -Dnative -DskipTests -Dquarkus.native.container-build=true
./gradlew build -Dquarkus.native.enabled=true -Dquarkus.native.container-build=true
Cualquiera de estos comandos compilará y creará una imagen ejecutable nativa. También genera un archivo zip target/function.zip
. Este archivo zip contiene su imagen ejecutable nativa renombrada a bootstrap
. Este es un requisito del tiempo de ejecución personalizado (proporcionado) de AWS Lambda.
Las instrucciones son exactamente las mismas que las anteriores con un cambio: tendrá que añadir native
como primer parámetro del script manage.sh
:
sh target/manage.sh native create
Como en el caso anterior, los comandos se pueden apilar. El único requisito es que native
sea el primer parámetro si desea trabajar con construcciones de imágenes nativas. El script se encargará del resto de los detalles necesarios para gestionar sus despliegues de funciones de imagen nativa.
Examine la salida del script manage.sh
si desea saber qué comandos aws se ejecutan para crear, eliminar y actualizar sus lambdas.
Una cosa a tener en cuenta sobre el comando de creación para nativos es que la llamada a aws lambda create-function
debe establecer una variable de entorno específica:
--environment 'Variables={DISABLE_SIGNAL_HANDLERS=true}'
Examinar el POM y la compilación Gradle
No hay nada especial en el POM aparte de la inclusión de la extensión quarkus-amazon-lambda
como dependencia. La extensión genera automáticamente todo lo que pueda necesitar para el despliegue de su lambda.
En versiones anteriores de esta extensión había que configurar el pom o gradle para comprimir el ejecutable para despliegues nativos, pero esto ya no es así. |
Construcción de Gradle
Del mismo modo, para los proyectos de Gradle, también sólo tienes que añadir la dependencia de quarkus-amazon-lambda
. La extensión genera automáticamente todo lo que puedas necesitar para el despliegue de tu lambda.
Ejemplo de dependencias de Gradle:
dependencies {
implementation enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}")
implementation 'io.quarkus:quarkus-resteasy'
implementation 'io.quarkus:quarkus-amazon-lambda'
testImplementation 'io.quarkus:quarkus-junit5'
testImplementation 'io.rest-assured:rest-assured'
}
Codificación en vivo y pruebas unitarias y de integración
Para reflejar el entorno de AWS Lambda lo más fielmente posible en un entorno de desarrollo, la extensión AWS Lambda de Quarkus inicia un servidor de eventos AWS Lambda simulado en el modo de desarrollo y prueba de Quarkus. Este servidor de eventos simulado simula un verdadero entorno de AWS Lambda.
Mientras se ejecuta en Quarkus Dev Mode, puede alimentarlo con eventos haciendo un POST HTTP a http://localhost:8080
. El servidor de eventos simulado recibirá los eventos y su lambda será invocada. Puede realizar codificación en vivo en su lambda y los cambios se recompilarán automáticamente y estarán disponibles en la siguiente invocación que realice. He aquí un ejemplo:
quarkus dev
./mvnw quarkus:dev
./gradlew --console=plain quarkusDev
$ curl -d "{\"name\":\"John\"}" -X POST http://localhost:8080
Para tus pruebas unitarias, también puedes invocar en el servidor de eventos falso usando cualquier cliente HTTP que quieras. Aquí hay un ejemplo usando rest-assured. Quarkus inicia un servidor de eventos simulados separado bajo el puerto 8081. El puerto por defecto para Rest Assured se establece automáticamente a 8081 por Quarkus para que pueda invocar en este punto final.
import org.junit.jupiter.api.Test;
import io.quarkus.test.junit.QuarkusTest;
import static io.restassured.RestAssured.given;
import static org.hamcrest.CoreMatchers.containsString;
@QuarkusTest
public class LambdaHandlerTest {
@Test
public void testSimpleLambdaSuccess() throws Exception {
Person in = new Person();
in.setName("Stu");
given()
.contentType("application/json")
.accept("application/json")
.body(in)
.when()
.post()
.then()
.statusCode(200)
.body(containsString("Hello Stu"));
}
}
El servidor de eventos simulados también se inicia para las pruebas de @NativeImageTest
y @QuarkusIntegrationTest
, por lo que también funcionará con binarios nativos. Todo esto proporciona una funcionalidad similar a las pruebas locales de SAM CLI, sin la sobrecarga de Docker.
Por último, si el puerto 8080 o el puerto 8081 no están disponibles en su ordenador, puede modificar los puertos de los modos dev y test con application.properties
quarkus.lambda.mock-event-server.dev-port=8082
quarkus.lambda.mock-event-server.test-port=8083
Un valor de puerto de cero resultará en un puerto asignado aleatoriamente.
Para desactivar el servidor de eventos simulado:
quarkus.lambda.mock-event-server.enabled=false
Pruebas con la CLI de SAM
Si no desea utilizar el servidor de eventos simulado, puede probar sus lambdas con SAM CLI.
La CLI SAM de AWS le permite ejecutar sus lambdas localmente en su portátil en un entorno Lambda simulado. Esto requiere que Docker esté instalado. Se trata de un enfoque opcional en caso de que decida aprovecharlo. De lo contrario, la integración JUnit de Quarkus debería ser suficiente para la mayoría de sus necesidades.
Se ha generado una plantilla de inicio para los modos de ejecución JVM y nativo.
Ejecute el siguiente comando CLI de SAM para probar localmente su función lambda, pasándole el parámetro apropiado de SAM template
. El parámetro event
toma cualquier archivo JSON, en este caso la muestra payload.json
.
Si se utiliza Gradle, la ruta a los binarios en las plantillas YAML debe cambiarse de target a build
|
sam local invoke --template target/sam.jvm.yaml --event payload.json
La imagen nativa también puede probarse localmente utilizando la plantilla sam.native.yaml
:
sam local invoke --template target/sam.native.yaml --event payload.json
Modificación de function.zip
Hay veces en las que puedes tener que añadir algunas adiciones al despliegue de lambda function.zip
que es generado por la construcción. Para ello crea un directorio zip.jvm
o zip.native
dentro de src/main
. Crea zip.jvm/
si estás haciendo una lambda puramente Java. zip.native/
si estás haciendo un despliegue nativo.
Todos los archivos y directorios que crees bajo tu directorio zip se incluirán dentro de function.zip
Guión personalizado de bootstrap
Hay ocasiones en las que puede querer establecer unas propiedades específicas del sistema u otros argumentos cuando lambda invoque su despliegue lambda nativo de quarkus. Si incluye un archivo de script bootstrap
dentro de zip.native
, la extensión quarkus renombrará automáticamente el ejecutable a runner
dentro de function.zip
y establecerá el modo unix del script bootstrap
a ejecutable.
El ejecutable nativo debe ser referenciado como runner si incluye un script personalizado de bootstrap .
|
La extensión genera un script de ejemplo dentro de target/bootstrap-example.sh
.
Rastreo con AWS XRay y GraalVM
Si estás construyendo imágenes nativas, y quieres usar AWS X-Ray Tracing con tu lambda necesitarás incluir quarkus-amazon-lambda-xray
como una dependencia en tu pom. La biblioteca de AWS X-Ray no es totalmente compatible con GraalVM, por lo que hemos tenido que hacer un trabajo de integración para que funcione.
Además, recuerde habilitar el parámetro de rastreo de AWS X-Ray en manage.sh
, en la función cmd_create()
. Esto también se puede configurar en la consola de administración de AWS.
--tracing-config Mode=Active
Para los archivos de plantilla sam, añada lo siguiente a las Propiedades de la función YAML.
Tracing: Active
AWS X-Ray añade muchas clases a su distribución, asegúrese de que está utilizando al menos el tamaño de memoria de 256 MB de AWS Lambda. Esto se establece explícitamente en manage.sh
cmd_create()
. Mientras que la imagen nativa potencialmente siempre puede utilizar una configuración de memoria inferior, sería recomendable mantener la misma configuración, especialmente para ayudar a comparar el rendimiento.
Uso de HTTPS o SSL/TLS
Si tu código hace llamadas HTTPS, como por ejemplo a un microservicio (o servicio AWS), tendrás que añadir la configuración a la imagen nativa, ya que GraalVM sólo incluirá las dependencias cuando se declaren explícitamente. Quarkus, por defecto habilita esta funcionalidad en las extensiones que implícitamente lo requieren. Para más información, consulta la Guía de Quarkus SSL
Abra src/main/resources/application.properties y añada la siguiente línea para habilitar SSL en su imagen nativa.
quarkus.ssl.native=true
Uso del AWS Java SDK v2
Quarkus tiene ahora extensiones para DynamoDB, S3, SNS y SQS (más en camino). Por favor, consulte esas guías sobre cómo utilizar los diversos servicios de AWS con Quarkus, en lugar de cablear manualmente como a continuación. |
Con una integración mínima, es posible aprovechar el AWS Java SDK v2, que puede utilizarse para invocar servicios como SQS, SNS, S3 y DynamoDB.
Para la imagen nativa, sin embargo, se debe preferir el cliente de Conexión URL sobre el Cliente HTTP de Apache cuando se utiliza el modo síncrono, debido a problemas en la compilación de GraalVM (en la actualidad).
Añade quarkus-jaxb
como dependencia en tu archivo Maven pom.xml
, o Gradle build.gradle
.
También debe forzar a su cliente de servicios de AWS para SQS, SNS, S3, entre otros, a utilizar el cliente de Conexión URL, que se conecta a los servicios de AWS a través de HTTPS, de ahí la inclusión de la propiedad SSL enabled, tal y como se describe en la sección Uso de HTTPS o SSL/TLS anterior.
// select the appropriate client, in this case SQS, and
// insert your region, instead of XXXX, which also improves startup time over the default client
client = SqsClient.builder().region(Region.XXXX).httpClient(software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient.builder().build()).build();
Para Maven, añada lo siguiente a su pom.xml
.
<properties>
<aws.sdk2.version>2.10.69</aws.sdk2.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>bom</artifactId>
<version>${aws.sdk2.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>url-connection-client</artifactId>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>apache-client</artifactId>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<!-- sqs/sns/s3 etc -->
<artifactId>sqs</artifactId>
<exclusions>
<!-- exclude the apache-client and netty client -->
<exclusion>
<groupId>software.amazon.awssdk</groupId>
<artifactId>apache-client</artifactId>
</exclusion>
<exclusion>
<groupId>software.amazon.awssdk</groupId>
<artifactId>netty-nio-client</artifactId>
</exclusion>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.jboss.logging</groupId>
<artifactId>commons-logging-jboss-logging</artifactId>
</dependency>
</dependencies>
Si ve java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty o un error SSL similar, debido al estado actual de GraalVM, hay algo de trabajo adicional para empaquetar el function.zip , como se indica a continuación. Para obtener más información, consulte la Guía de SSL nativa de Quarkus.
|
Requisitos adicionales para SSL cliente
El ejecutable nativo requiere algunos pasos adicionales para habilitar SSL de cliente que S3 y otras bibliotecas de AWS necesitan.
-
Un script personalizado de
bootstrap
-
libsunec.so
debe añadirse afunction.zip
-
cacerts
debe añadirse afunction.zip
Para ello, primero cree un directorio src/main/zip.native/
con su construcción. A continuación, cree un archivo de secuencia de comandos llamado bootstrap
dentro de src/main/zip.native/
, como se indica a continuación. Un ejemplo es crear automáticamente en su carpeta de construcción (target o build), llamado bootstrap-example.sh
#!/usr/bin/env bash
./runner -Djava.library.path=./ -Djavax.net.ssl.trustStore=./cacerts
Conjunto adicional -Djavax.net.ssl.trustStorePassword=changeit
si su archivo cacerts
está protegido por contraseña.
A continuación, debe copiar algunos archivos de su distribución GraalVM en src/main/zip.native/
.
Las versiones de GraalVM pueden tener diferentes rutas para estos archivos, y si se utiliza la versión de Java 8 o 11. Ajústalo en consecuencia. |
cp $GRAALVM_HOME/lib/libsunec.so $PROJECT_DIR/src/main/zip.native/
cp $GRAALVM_HOME/lib/security/cacerts $PROJECT_DIR/src/main/zip.native/
Ahora, cuando ejecute la compilación nativa, todos estos archivos se incluirán en function.zip
Si está utilizando una imagen Docker para compilar, debe extraer estos archivos de esta imagen. |
Para extraer el ssl necesario, debe iniciar un contenedor Docker en segundo plano, y adjuntar a ese contenedor para copiar los artefactos.
En primer lugar, vamos a iniciar el contenedor GraalVM, tomando nota de la salida de id de contenedor.
docker run -it -d --entrypoint bash quay.io/quarkus/ubi-quarkus-mandrel-builder-image:jdk-21
# This will output a container id, like 6304eea6179522aff69acb38eca90bedfd4b970a5475aa37ccda3585bc2abdde
# Note this value as we will need it for the commands below
En primer lugar, libsunec.so, la biblioteca C utilizada para la implementación de SSL:
docker cp {container-id-from-above}:/opt/graalvm/lib/libsunec.so src/main/zip.native/
En segundo lugar, cacerts, el almacén de certificados. Es posible que tenga que obtener periódicamente una copia actualizada, también.
docker cp {container-id-from-above}:/opt/graalvm/lib/security/cacerts src/main/zip.native/
Tu archivo final tendrá este aspecto:
jar tvf target/function.zip
bootstrap
runner
cacerts
libsunec.so
Implementación en AWS Lambda mediante una imagen de contenedor
AWS Lambda admite la creación de sus lambdas haciendo referencia a imágenes de contenedores en lugar de cargar archivos ZIP. Esto puede tener algunas ventajas, como evitar el límite de tamaño de los archivos ZIP cargados. Puede definir funciones lambda tanto para compilaciones nativas como para compilaciones JVM normales.
Imagen del contenedor JVM
Para una distribución regular de JVM necesitas basar tu imagen en las imágenes base oficiales de AWS Java. A continuación se muestra un ejemplo de un archivo Docker que crearía una imagen de contenedor de su proyecto Quarkus Lambda. Asume que mvn package
ha sido ejecutado y los binarios están disponibles en el directorio target/
:
FROM public.ecr.aws/lambda/java:11
ADD target/my-service-0.0.1-SNAPSHOT-runner.jar /var/task/lib/my-service.jar
ADD target/lib/ /var/task/lib/
CMD ["io.quarkus.amazon.lambda.runtime.QuarkusStreamHandler::handleRequest"]
Imagen contenedor ejecutable nativa
Para crear una imagen de contenedor lambda que utilice el ejecutable nativo tendremos que hacer las cosas de forma un poco diferente. En este caso, no necesitaremos utilizar la imagen base de java:11
de AWS, sino que utilizaremos una imagen especial que asume que se proporciona el entorno de ejecución para lambda. El siguiente ejemplo crea un contenedor de este tipo. Asume que se ha ejecutado una construcción de Maven (como mvn package -Dnative=true
) y ha generado el binario nativo en el directorio target/
. El binario necesita ser llamado bootstrap
y ser colocado en /var/runtime/
:
FROM public.ecr.aws/lambda/provided
ADD target/my-service-0.0.1-SNAPSHOT-runner /var/runtime/bootstrap
RUN chmod ugo+x /var/runtime/bootstrap
CMD ["io.quarkus.amazon.lambda.runtime.QuarkusStreamHandler::handleRequest"]
Despliegue de una imagen de contenedor lambda
A continuación, puede ver cómo las imágenes de contenedor creadas anteriormente pueden construirse e implementarse en AWS utilizando las herramientas de línea de comandos docker
y aws
. Estas instrucciones funcionan tanto para imágenes de contenedor nativas como jvm y asumen que la herramienta de línea de comandos aws
ha sido iniciada.
Construir la imagen Docker
# Assuming we are located in the root directory of the project and created a Dockerfile there
docker build .
[output omitted]
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:[SOME SHA] 0.0s
Crear un repositorio ECR en la cuenta AWS del usuario
aws ecr create-repository --repository-name my/test/quarkus-lambda
Etiquete la imagen utilizando la información de su registro ECR
docker tag [SOME SHA] [YOUR AWS ACCOUNT ID].dkr.ecr.[YOUR AWS ACCOUNT REGION].amazonaws.com/my/test/quarkus-lambda:v1
Registre Docker en su registro ECR y envíele la imagen Docker
aws ecr get-login-password --region region | docker login --username AWS --password-stdin [YOUR AWS ACCOUNT ID].dkr.ecr.[YOUR AWS ACCOUNT REGION].amazonaws.com
docker push [YOUR AWS ACCOUNT ID].dkr.ecr.[YOUR AWS ACCOUNT REGION].amazonaws.com/my/test/quarkus-lambda:v1
Crear la función AWS lambda con la herramienta AWS CLI
Asegúrate de que haces referencia a la imagen que has subido previamente (se supone que existe un rol que puede ser utilizado para ejecutar la lambda). Ten en cuenta que no es improbable que para la función lambda de JVM, el límite de memoria por defecto de 128Mb
no sea suficiente para ejecutar la función. En ese caso, puede aumentar el límite de memoria al crear la función proporcionando el parámetro --memory-size 256
a su comando aws lambda create-function
. También puede ajustar la función en la consola de AWS después de haberla creado.
aws lambda create-function --function-name my-test-quarkus-lambda-function --package-type Image --code ImageUri=[YOUR AWS ACCOUNT ID].dkr.ecr.[YOUR AWS ACCOUNT REGION].amazonaws.com/my/test/quarkus-lambda:v1 --role arn:aws:iam::[YOUR AWS ACCOUNT ID]:role/[SOME ROLE]
Ahora puedes utilizar la consola de AWS para ver y probar tu nueva función lambda.
Integración de Amazon Alexa
Para utilizar Alexa con Quarkus nativo, es necesario utilizar la extensión Quarkus Amazon Alexa alojada en Quarkiverse Hub.
<dependency>
<groupId>io.quarkiverse.alexa</groupId>
<artifactId>quarkus-amazon-alexa</artifactId>
<version>${quarkus-amazon-alexa.version}</version> (1)
</dependency>
1 | Defina la última versión de la extensión en su archivo POM. |
Crea tu manejador Alexa, como es normal, subclasificando el abstracto com.amazon.ask.SkillStreamHandler
, y añade la implementación de tu manejador de peticiones.
¡Eso es todo!
SnapStart
Para optimizar su aplicación para Lambda SnapStart, consulte la documentación de configuración de SnapStart.