[vc_row el_class=”blog-info”][vc_column][vc_single_image source=”featured_image” img_size=”full” style=”vc_box_rounded”][vc_empty_space height=”40px”][vc_row_inner][vc_column_inner width=”1/6″][/vc_column_inner][vc_column_inner width=”2/3″][vc_column_text el_class=”font-weight-bold”]
Cree una capa personalizada con AWS SAM
AWS SAM – AWS tiene una buena característica en el servicio Lambda llamada “Capa”
¿Qué es la capa Lambda?
Las capas de Lambda brindan una manera conveniente de empaquetar bibliotecas y otras dependencias que puede usar con sus funciones de Lambda. El uso de capas reduce el tamaño de los archivos de implementación cargados y acelera la implementación de su código.
Entonces, si tiene un proyecto con más de una lambda que usa los mismos paquetes, funciones o clases creadas por ingenieros de software, la capa es la solución y reducirá el tamaño de la lambda.
[/vc_column_text][vc_empty_space height=”40px”][/vc_column_inner][vc_column_inner width=”1/6″][/vc_column_inner][/vc_row_inner][vc_row_inner][vc_column_inner width=”1/6″][/vc_column_inner][vc_column_inner width=”2/3″][vc_column_text]
¿Cómo implementar la capa usando AWS SAM?
En este artículo quiero crear una capa y usarla usando AWS SAM, la agregaré a un nuevo proyecto “hola mundo” y el lenguaje de programación será NodeJS usando SAM CLI.

La plantilla .yaml por defecto es
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: AWS SAM Layer Demo
Globals:
Function:
Timeout: 3
Tracing: Active
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: hello-world/
Handler: app.lambdaHandler
Runtime: nodejs14.x
Architectures:
- x86_64
Events:
HelloWorld:
Type: Api
Properties:
Path: /hello
Method: get
Outputs:
HelloWorldApi:
Description: "API Gateway endpoint URL for Prod stage for Hello World function"
Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/"
Primero, creemos un directorio de capas usando la terminal, lo llamaré AppLayer
> mkdir -p layers/app-layer
Cambiemos el puntero de directorio en la terminal a AppLayer
> capas de cd/capa de aplicación
La capa requería paquete.json si desea usar uno de los módulos de nodo, usaré npm para crear paquete.json
> npm initpackage name: (app-layer) version: (1.0.0) description: A layer for the application entry point: (index.js) test command: git repository: keywords: layer, aws, packages author: Emad Rashdan license: (ISC)
Así que la estructura del proyecto debería ser así.

Supongamos que desea usar el paquete UUID y devolverlo en la respuesta.
Lo instalaré usando NPM cli (asegúrese de estar en el directorio de la capa de aplicación)
> npm i uuid
El paquete se instala en AppLayer que podemos usar en cualquier Lambda
El siguiente paso es agregar la capa en template.yaml y agregar la capa en HelloWorldFunction.
AppLayer: Type: AWS::Serverless::LayerVersion Metadata: BuildMethod: nodejs14.x Properties: LayerName: app-layer Description: A layer for the application ContentUri: layers/app-layer CompatibleRuntimes: - nodejs14.x
Después de crear la capa en la plantilla, podemos asignarla a HelloWorldFunction
Layers: - !Ref AppLayer
Así que la plantilla debería ser como:
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: AWS SAM Layer Demo
Globals:
Function:
Timeout: 3
Tracing: Active
Resources:
HelloWorldFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: hello-world/
Handler: app.lambdaHandler
Runtime: nodejs14.x
Layers:
- !Ref AppLayer
Architectures:
- x86_64
Events:
HelloWorld:
Type: Api
Properties:
Path: /hello
Method: get
AppLayer:
Type: AWS::Serverless::LayerVersion
Metadata:
BuildMethod: nodejs14.x
Properties:
LayerName: app-layer
Description: A layer for the application
ContentUri: layers/app-layer
CompatibleRuntimes:
- nodejs14.x
Outputs:
HelloWorldApi:
Description: "API Gateway endpoint URL for Prod stage for Hello World function"
Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/hello/"
Como dijimos, supongamos que queremos devolver el UUID en la respuesta, modificaremos app.js el archivo relacionado con HelloWorldFunction .
Importemos el paquete UUID. Lambda extrae el contenido de la capa en el directorio /opt al configurar el entorno de ejecución de la función.

De esta forma, importamos el UUID en la primera línea y en el objeto de respuesta llamamos a uuidv4() que generará el UUID a través del paquete.
Probémoslo, usando SAM CLI, hagamos la compilación y ejecútelo localmente:
> sam build --use-container && sam local start-api
Si lo prueba usando Postman o cURL request:
> curl --location --request GET 'http://127.0.0.1:3000/hello'
La respuesta debe ser:
{"uuid":"e070fffe-4170-4dc1-ab67-3689d5bf0613","message":"hello world"}
Eso significa que todo funciona como excepción.
Crear una función personalizada en la capa
Vamos a crear una nueva función, simplemente devuelva la marca de tiempo actual, en el directorio de la capa de la aplicación crearemos un nuevo archivo llamado timestamp.js
> touch timestamp.js

La función timestamp.js será así
module.exports = function currentTimestamp() {
return new Date().getTime()
}
El siguiente paso impórtelo en app.js y use la función:

En la línea 2 importamos la función de marca de tiempo de la app-layer, en la línea 12 llamamos a la función.
Reconstruyamos y comencemos localmente:
> sam build --use-container && sam local start-api
Y después de terminar la compilación, intentemos invocar la lambda usando cURL
> curl — location — request GET ‘http://127.0.0.1:3000/hello'
La respuesta debería ser algo como esto:
{"uuid":"868cc9d3-2068-4da3-948d-d8077f3dd31e","message":"hello world","timestamp":1652708560131}
Esa fue la forma de crear una capa personalizada para su aplicación usando AWS SAM, no dude en hacer cualquier pregunta en los comentarios.
[/vc_column_text][/vc_column_inner][vc_column_inner width=”1/6″][/vc_column_inner][/vc_row_inner][/vc_column][/vc_row][vc_row el_class=”social-info”][vc_column width=”1/6″][/vc_column][vc_column width=”2/3″][vc_row_inner][vc_column_inner width=”1/2″][vc_column_text][social_share_button themes=’theme1′][/vc_column_text][/vc_column_inner][vc_column_inner el_class=”youtube-inner-col” width=”1/2″][vc_column_text][likebtn theme=”youtube” lang=”auto” show_like_label=”0″ white_label=”1″ alignment=”right”][/vc_column_text][/vc_column_inner][/vc_row_inner][vc_row_inner el_class=”social-info-inner”][vc_column_inner width=”1/4″][vc_single_image image=”921″][/vc_column_inner][vc_column_inner width=”3/4″][vc_column_text]
Diego Pacheco
Ingeniero en Sitemas, MBA (Babson College). Desarrollador PHP/Java/JavaScript. Fundador & CEO de EpicStudio. Entusiasta de las tecnologías web (JavaScript, Vue, Laravel, AWS, Docker) Viajes, Negocios, Surf y Growth.[/vc_column_text][asvc_list_item icon_fontawesome=”fa fa-calendar-o” icon_size=”14px”]Programar una reunión[/asvc_list_item][/vc_column_inner][/vc_row_inner][/vc_column][vc_column width=”1/6″][/vc_column][/vc_row][vc_row][vc_column][vc_column_text]
Recent Post
[/vc_column_text][lvca_posts_carousel posts_query=”size:3|order_by:rand|post_type:post” image_linkable=”true” image_size=”full” taxonomy_chosen=”post_tag” display_title=”true” display_post_date=”true” display_summary=”true” autoplay_speed=”3000″ animation_speed=”300″ display_columns=”3″ scroll_columns=”3″ gutter=”3″ tablet_display_columns=”2″ tablet_scroll_columns=”2″ tablet_gutter=”3″ tablet_width=”800″ mobile_display_columns=”1″ mobile_scroll_columns=”1″ mobile_gutter=”3″ mobile_width=”480″][vc_empty_space height=”20px”][/vc_column][/vc_row]
