node.js - AWS Lambda:NodeJs 自定义层
问题描述
我是 nodejs 和 aws lambda 的新手。我正在尝试为我的一堆 lambda 函数创建具有常用函数的层。在 lambda 处理程序中,自定义模块的导入具有以下定义:
let commonService = require('@common/service');
带有模块文件的 zip 具有以下结构:
nodejs
--node_modules
--@custom
--service
--index.js
--package.json
但我得到了错误:
"errorMessage": "Error: Cannot find module '@common/service'\nRequire stack:\n- /var/task/index.js\n- /var/runtime/UserFunction.js\n- /var/runtime/index.js",
@custom/service模块 package.json 包含以下内容:
{
"name": "@common/service",
"version": "1.0.0",
"main": "index.js",
"license": "ISC",
"dependencies": {
/***
}
}
提前致谢!
解决方案
尝试使用AWS Lambda 层。
使用图层有两个主要好处。
- 它允许您将基本依赖项部署在一个地方并集中管理它们。
- 它缩小了您的 Lambda 应用程序部署的大小。无需
node_modules
每次上传大量文件夹层次结构。
如何使用它们?这是一个相当深入的话题,但它的要点是您可以:
- 在 AWS 中构建和部署一个层。一个 Layer 只不过是一个“裸”的 npm 项目,真的。您在其中安装常用的 NodeJS 模块,仅此而已。
- 假设您使用无服务器应用程序模型来部署 AWS Lambda 函数,您可以将 Lambda 函数配置为使用该层。这是 SAM yaml 文件的精简版本,它说明了这一点:
AWSTemplateFormatVersion: '2010-09-09'
Transform: 'AWS::Serverless-2016-10-31'
Description: My Serverless App
Parameters:
# ...
Globals:
Function:
Runtime: nodejs10.x
# Environment:
# Variables:
# NODE_ENV: test
Resources:
CommonDependenciesLayer:
Type: AWS::Serverless::LayerVersion
Properties:
LayerName: my-common-deps
Description: Common dependencies for my NodeJS apps
ContentUri: ../common-deps/
RetentionPolicy: Retain
Metadata:
BuildMethod: nodejs10.x
performSomeFunction:
Type: 'AWS::Serverless::Function'
Properties:
FunctionName: performSomeFunction
Handler: lambda.someFunction
Layers:
# You can either Ref a layer defined in this SAM file like this.
# - !Ref CommonDependenciesLayer
# ... or you can hard-code an external ARN
# - arn:aws:lambda:us-east-1:nnnnnnnnnnnnn:layer:myapp-common-deps:5
CodeUri: ./
# ...
- 在您的 Lambda 代码中,您所做的就是使用普通的 CJS 要求语法。例如,假设我将
mysql
库放在我的CommonDependenciesLayer
, 上面。只要我的 Lambda 函数指向 SAM 文件中的层,我所要做的就是require('mysql')
在我的代码中。它会在那里。
当你开始工作时,有一些关于 Layer 部署的微妙之处需要考虑。
- 我想每次都构建图层吗?(可能不会,但我建议您在学习 Layers 和 Lambdas 如何协同工作时这样做)。
- 我的图层组件多久更改一次?
- 我想公开我的图层吗?
- 我想从另一个帐户使用公开可用的图层吗?
推荐阅读
- shell - 使用 TZ=GMT+168 未正确计算较旧的日期
- typescript - 如何限制lodash中`mapValues`创建的对象类型?
- android - 带有 MaterialComponents 主题的 ActionBar 背景
- vue.js - Vue Eventbus:handler.apply 不是一个函数
- file - 没有创建永久文件
- php - 即使使用相同的编码,PHP 也会将两个相同的字符视为不同的字符
- sql - Postgres 打破串行列上的空约束
- project-reactor - 无法触发信号停止项目反应堆中的块
- java - 如何以编程方式将 imageView 设置为 recyclerview 视图?
- oauth-2.0 - 访问令牌中缺少范围 - 代码流