Tengo una aplicación sin servidor que usa CDK. Quiero agregar una capa lambda para compartir algunas funciones en diferentes áreas de la aplicación.
Defino la capa en una pila de CDK usando
const encryptLayer = new lambda.LayerVersion(this, 'encrypt-layer', { compatibleRuntimes: [ lambda.Runtime.NODEJS_14_X, ], code: lambda.Code.fromAsset(path.join(__dirname,'src/Layers/EncryptDecryptFunctions')), description: 'shared functions to encrypt/decrypt data using asymmetric key' });
y agregué encryptLayer
a algunas de las funciones en la misma pila usando el atributo de layers
al llamar a new lambda.Function()...
. Implementé esto y veo que la capa se encuentra debajo de la función correcta en la consola.
La estructura de archivos para la capa es
src Layers EncryptFunctions nodejs encrypt.js package.json
y estoy tratando de importarlo usando const { encrypt } = require("/opt/nodejs/encrypt")
según la documentación de AWS. Sin embargo, obtengo una excepción de módulo no encontrado cuando ejecuto la lambda que usa el método de cifrado.
¿Hay algo más que deba hacer para poder usar el código de la capa en mis lambdas? ¿Para ambos códigos en el mismo repositorio y en un repositorio diferente?
Esto parece un problema de PATH. Como se muestra en este documento , las rutas para cada tiempo de ejecución de Lambda de Node.js son:
nodejs/node_modules
nodejs/node14/node_modules (NODE_PATH)
Por lo tanto, puede agregar node_modules/
directorio. Use nodejs/node_modules/
en lugar de nodejs
en la estructura de archivos.
Y la importación en código lambda será como:
const encrypt = require('encrypt')
El problema aquí es que estaba agrupando mis lambdas usando el paquete web y no agregué '/opt/nodejs/encrypt' a mis elementos externos en la configuración del paquete web. Hacer eso solucionó mi problema.
Puede usar un marco sin servidor donde puede definir todo en un archivo yml como el siguiente código.
layers: AnalyticsShared: path: node_modules name: analytics-shared-${opt:stage, self:provider.stage} description: "Shared node modules for analytics" functions: track: handler: analytics.queue timeout: 30 layers: - {Ref: AnalyticsSharedLambdaLayer}
URL de referencia: https://www.serverless.com/framework/docs/providers/aws/guide/layers