Creación de aplicaciones - AWS Serverless Application Model

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Creación de aplicaciones

Para crear una aplicación sin servidor, utilice el comando sam build. Este comando también recopila los artefactos de compilación de las dependencias de la aplicación y los coloca en el formato y la ubicación adecuados para los siguientes pasos, como las pruebas, el empaquetado y la implementación locales.

Las dependencias de la aplicación se especifican en un archivo de manifiesto, como requirements.txt (Python) o package.json (Node.js), o mediante la propiedad Layers de un recurso de función. La propiedad Layers contiene una lista de los recursos de capa de AWS Lambda de los que depende la función de Lambda.

El formato de los artefactos de compilación de la aplicación depende de la propiedad PackageType de cada función. Las opciones de esta propiedad son:

  • Zip: un archivo .zip, que incluye el código de la aplicación y sus dependencias. Si empaqueta el código como un archivo .zip, debe especificar un tiempo de ejecución de Lambda para su función.

  • Image: una imagen del contenedor, que incluye el sistema operativo base, el tiempo de ejecución, las extensiones, el código de la aplicación y sus dependencias.

Para obtener más información sobre los tipos de paquetes de Lambda, consulte Paquetes de implementación de Lambda en la Guía para desarrolladores de AWS Lambda.

Creación de un archivo .zip

Para crear una aplicación sin servidor como un archivo .zip, declare PackageType: Zip para su función sin servidor.

AWS SAM crea la aplicación para la arquitectura que especifique. Si no especifica una arquitectura, AWS SAM utiliza x86_64 de forma predeterminada.

Si la función de Lambda depende de paquetes que tienen programas compilados de forma nativa, utilice el indicador --use-container. Esta marca compila localmente las funciones en un contenedor de Docker que se comporta como un entorno de Lambda, para que tengan el formato correcto cuando se implementen en AWS Cloud.

Cuando utiliza la opción --use-container, AWS SAM extrae de forma predeterminada la imagen del contenedor de Amazon ECR Public. Si quieres extraer una imagen de contenedor de otro repositorio, por ejemplo DockerHub, puedes usar la --build-image opción y proporcionar el URI de una imagen de contenedor alternativa. A continuación, se muestran dos ejemplos de comandos para crear aplicaciones utilizando imágenes de contenedores del DockerHub repositorio:

# Build a Node.js 12 application using a container image pulled from DockerHub sam build --use-container --build-image amazon/aws-sam-cli-build-image-nodejs12.x # Build a function resource using the Python 3.8 container image pulled from DockerHub sam build --use-container --build-image Function1=amazon/aws-sam-cli-build-image-python3.8

Para ver una lista de los URI que puede utilizar--build-image, consulte la sección Repositorios de imágenes que contiene DockerHub los URI correspondientes a varios tiempos de ejecución compatibles.

Para ver ejemplos adicionales de cómo crear una aplicación de archivo .zip, consulte la sección de ejemplos que aparece más adelante en este tema.

Creación de una imagen del contenedor

Para crear una aplicación sin servidor como una imagen del contenedor, declare PackageType: Image para su función sin servidor. También debe declarar el atributo de recurso Metadata con las siguientes entradas:

Dockerfile

El nombre de Dockerfile que se asocia con la función de Lambda.

DockerContext

La ubicación del Dockerfile.

DockerTag

(Opcional) Una etiqueta para aplicar a la imagen creada.

DockerBuildArgs

Crear argumentos para la compilación.

A continuación, se muestra un ejemplo de una sección de atributos de recursos de Metadata:

Metadata: Dockerfile: Dockerfile DockerContext: ./hello_world DockerTag: v1

Para descargar una aplicación de muestra configurada con el tipo de paquete Image, consulte Tutorial: Implementación de una aplicación Hello World en el tutorial: Implementación de una aplicación Hello World. Cuando aparezca el mensaje que le pregunte qué tipo de paquete desea instalar, elija Image.

nota

Si especifica una imagen base multiarquitectura en su Dockerfile, AWS SAM crea su imagen de contenedor para la arquitectura de su máquina host. Para crear una arquitectura diferente, especifique una imagen base que utilice la arquitectura de destino específica.

Archivo de variables del entorno del contenedor.

Para proporcionar un archivo JSON que contenga variables de entorno para el contenedor de compilación, use el argumento --container-env-var-file junto con el comando sam build. Puede proporcionar una única variable de entorno que se aplique a todos los recursos sin servidor o variables de entorno diferentes para cada recurso.

Formato

El formato para pasar las variables de entorno a un contenedor de compilación depende del número de variables de entorno que proporcione para sus recursos.

Para proporcionar una única variable de entorno para todos los recursos, especifique un objeto Parameters como el siguiente:

{ "Parameters": { "GITHUB_TOKEN": "TOKEN_GLOBAL" } }

Para proporcionar variables de entorno diferentes para cada recurso, especifique objetos para cada recurso de la siguiente manera:

{ "MyFunction1": { "GITHUB_TOKEN": "TOKEN1" }, "MyFunction2": { "GITHUB_TOKEN": "TOKEN2" } }

Guarde las variables de entorno como un archivo, por ejemplo, denominado env.json. El siguiente comando usa este archivo para pasar las variables de entorno al contenedor de compilación:

sam build --use-container --container-env-var-file env.json

Prioridad

  • Las variables de entorno que proporcione para recursos específicos tienen prioridad sobre la variable de entorno única para todos los recursos.

  • Las variables de entorno que se proporcionan en la línea de comandos tienen prioridad sobre las variables de entorno de un archivo.

Acelera los tiempos de compilación al compilar el proyecto en la carpeta de origen

Para consultar los tiempos de ejecución y los métodos de compilación compatibles, puede usar la opción de --build-in-source para compilar el proyecto directamente en la carpeta de origen. De forma predeterminada, AWS SAM CLI compila en un directorio temporal, lo que implica copiar el código fuente y los archivos del proyecto. Con --build-in-source, AWS SAM CLI compila directamente en la carpeta de origen, lo que acelera el proceso de compilación al eliminar la necesidad de copiar archivos en un directorio temporal.

Para consultar una lista de los tiempos de ejecución y métodos de compilación admitidos, consulte --build-in-source.

Ejemplos

Ejemplo 1: Archivo .zip

Los siguientes comandos sam build crean un archivo .zip:

# Build all functions and layers, and their dependencies sam build # Run the build process inside a Docker container that functions like a Lambda environment sam build --use-container # Build a Node.js 12 application using a container image pulled from DockerHub sam build --use-container --build-image amazon/aws-sam-cli-build-image-nodejs12.x # Build a function resource using the Python 3.8 container image pulled from DockerHub sam build --use-container --build-image Function1=amazon/aws-sam-cli-build-image-python3.8 # Build and run your functions locally sam build && sam local invoke # For more options sam build --help

Ejemplo 2: Imagen del contenedor

La siguiente plantilla de AWS SAM se crea como una imagen del contenedor:

Resources: HelloWorldFunction: Type: AWS::Serverless::Function Properties: PackageType: Image ImageConfig: Command: ["app.lambda_handler"] Metadata: Dockerfile: Dockerfile DockerContext: ./hello_world DockerTag: v1

A continuación, se muestra un ejemplo de un Dockerfile.

FROM public.ecr.aws/lambda/python:3.8 COPY app.py requirements.txt ./ RUN python3.8 -m pip install -r requirements.txt # Overwrite the command by providing a different command directly in the template. CMD ["app.lambda_handler"]

Ejemplo 3: npm ci

En el caso de las aplicaciones de Node.js, puede utilizar npm ci en lugar de npm install para instalar dependencias. Para usar npm ci, especifique UseNpmCi: True bajo BuildProperties en el atributo de recurso Metadata de la función de Lambda. Para poder utilizar npm ci, la aplicación debe tener un archivo package-lock.json o npm-shrinkwrap.json presente en CodeUri para su la función de Lambda.

El siguiente ejemplo utiliza npm ci para instalar dependencias cuando ejecuta sam build:

Resources: HelloWorldFunction: Type: AWS::Serverless::Function Properties: CodeUri: hello-world/ Handler: app.handler Runtime: nodejs14.x Architectures: - x86_64 Events: HelloWorld: Type: Api Properties: Path: /hello Method: get Metadata: BuildProperties: UseNpmCi: True

Crear funciones fuera de AWS SAM

De forma predeterminada, cuando ejecuta sam build, AWS SAM compila todos los recursos de la función. Otras opciones incluyen:

  • Crear todos los recursos de funciones fuera de AWS SAM: si crea todos los recursos de funciones manualmente o mediante otra herramienta, sam build no es obligatorio. Puede omitir sam build y pasar al siguiente paso de su proceso, como realizar pruebas locales o implementar su aplicación.

  • Crear algunos recursos de funciones fuera de AWS SAM: si desea que AWS SAM cree algunos de sus recursos de función y, al mismo tiempo, crear otros recursos de funciones fuera de AWS SAM, puede especificarlo en la plantilla de AWS SAM.

Crear algunos recursos de funciones fuera de AWS SAM

Para que AWS SAM omita una función al usar sam build, configure lo siguiente en su plantilla de AWS SAM:

  1. Añada la propiedad de metadatos SkipBuild: True a la función.

  2. Especifique la ruta a los recursos de la función creada.

A continuación, se muestra un ejemplo, con TestFunction configurado para omitirse. Sus recursos creados se encuentran en built-resources/TestFunction.zip.

TestFunction: Type: AWS::Serverless::Function Properties: CodeUri: built-resources/TestFunction.zip Handler: TimeHandler::handleRequest Runtime: java11 Metadata: SkipBuild: True

Ahora, cuando ejecute sam build, AWS SAM hará lo siguiente:

  1. AWS SAM omitirá las funciones configuradas con SkipBuild: True.

  2. AWS SAM compilará todos los demás recursos de funciones y los guardará en caché en el directorio de compilación .aws-sam.

  3. En el caso de las funciones omitidas, su plantilla en el directorio de compilación .aws-sam se actualizará automáticamente para hacer referencia a la ruta especificada a los recursos de la función creada.

    Este es un ejemplo de la plantilla almacenada en caché para TestFunction en el directorio de compilación .aws-sam:

    TestFunction: Type: AWS::Serverless::Function Properties: CodeUri: ../../built-resources/TestFunction.zip Handler: TimeHandler::handleRequest Runtime: java11 Metadata: SkipBuild: True