TL;DR
chmod 644 $(find . -type f)
chmod 755 $(find . -type d)
chmod +x ./node_modules/@sentry/cli/sentry-cli // Same command for other binaries as well
// Reupload function code using update-function code using steps below.
深潜
此答案是文档中概述的步骤的总结,附加解释说明为什么需要这些步骤和先决条件/debugging 工作流 如果出现任何问题。 docs 建议使用以下步骤上传具有附加依赖项的 NodeJS 项目,如下所示。我已经设计了已经运行的现有 AWS Lambda 实例的步骤,以帮助限制调试时的错误范围(针对 AWS 或 Sentry)。
(推荐)现有项目的步骤
1.1 在本地安装带有 NPM 的节点(我假设你已经这样做了)。记下您的本地节点版本并检查它是否与 AWS Lambda 实例匹配。
$ node -v
1.2 安装 AWS CLI(必须是 version 2!)。
1.3 使用以下命令配置 AWS CLI:
$ aws configure
注意:如果您需要为每个平台使用different guides,您也可以手动配置。我将省略这些细节,因为它们很简单。
1.4 尝试首先部署hello-world Lambda,看看是否没有 sentry-cli 包。如果它确实有效,您知道哨兵可能是问题所在,而不是 AWS。
1.5 安装 Sentry CLI:
$ npm install @sentry/cli
1.6自动sentry-cli配置:
$ sentry-cli login
1.7 验证您的 sentry-cli 配置对 $ sentry-cli info 有效。如果没有,您需要按照控制台输出中推荐的步骤操作。
$ sentry-cli info
1.8 使用aws-xray-sdk安装依赖:
$ npm install aws-xray-sdk
1.8.1(可选)导航到您的项目根文件夹。这只是为了说明;当前版本的 AWS 开发工具包已预安装在 Lambda 中,但您可以使用此技术加载其他预构建的 JavaScript 包,或者如果出于兼容性原因您确实需要早期版本的 AWS 开发工具包(不适用)。
$ npm install --prefix=. aws-sdk
1.8.2 (健全性检查) 检查根目录下子文件夹中所有文件的权限是否为可执行权限。尝试在本地运行项目,看看是否存在可执行权限:
$ ls -l && node function.js
1.9 压缩项目:
$ zip -r function.zip . // The .zip file must be **less than 50 MB**!
1.10 使用 aws 命令行工具 update-function-code 上传函数代码(这很重要因为这将解决权限问题。
$ aws lambda update-function-code --function-name my-function --zip-file fileb://function.zip
1.11 如果操作成功,你会得到如下输出:
{
"FunctionName": "my-function",
"FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function",
"Runtime": "nodejs12.x",
"Role": "arn:aws:iam::123456789012:role/lambda-role",
"Handler": "index.handler",
"CodeSha256": "Qf0hMc1I2di6YFMi9aXm3JtGTmcDbjniEuiYonYptAk=",
"Version": "$LATEST",
"TracingConfig": {
"Mode": "Active"
},
"RevisionId": "983ed1e3-ca8e-434b-8dc1-7d72ebadd83d",
...
}
1.12 例如,如果您在上传时遇到错误,您可以关注文档here。如果需要,请检查 AWS 日志AWS CloudWatch。
1.13 在您确定update-function-code 成功后,测试正在运行的 lambda。
$ aws lambda invoke --function-name my-function --payload '{"key1": "value1", "key2": "value2", "key3": "value3"}' output.txt
另一种可能的解决方案(不理想)
在使用child_process 运行CLI config 命令之前使哨兵cli 可执行。
var exec = require('child_process').exec, child;
child = exec('chmod +x /var/task/node_modules/@sentry/cli/sentry-cli',
function (error, stdout, stderr) {
console.log('stdout: ' + stdout);
console.log('stderr: ' + stderr);
if (error !== null) {
console.log('exec error: ' + error);
}
});
child();
替代方案:你也可以试试这个package。
使用 Sentry Node NPM 包重构
如果在上述步骤中,您注意到 Sentry CLI 是问题所在,您可以尝试在没有此包的情况下重构您的代码。请改用Sentry Node NPM package,因为这个 NPM 包是为 NodeJS 构建的,并且可能会重构您的代码。 Sentry 节点可能更容易运行,但没有部署/发布功能。来自他们的Usagepage:
Sentry 的 SDK 连接到您的运行时环境并自动报告错误、异常和拒绝。
(注)Sentry 与 AWS Lambda 文档
Sentry docs 建议使用 @sentry/serverless 作为与 AWS Lambda 集成的包。如果您不想重构代码,请使用this guide。
启用 AWS Lambda 集成后,Node SDK 将:
- 自动报告来自您的 Lambda 函数的所有事件。
- 允许您使用 tracesSampleRate 修改事务采样率。
- 问题报告自动包括:
- cloudwatch 日志的链接
- 功能详情
- 函数的sys.argv
- AWS 请求 ID
- 函数执行时间
- 函数版本
注意事项:
- .zip 文件必须小于 50 MB。如果大于 50 MB,Amazon 建议将其上传到 Amazon Simple Storage Service (Amazon S3) 存储桶。
- .zip 文件不能包含用 C 或 C++ 编写的库。如果您的 .zip 文件包含 C 扩展库,例如 Pillow (PIL) 或 numpy 库,我们建议使用 AWS 无服务器应用程序模型 (AWS SAM) 命令行界面 (CLI) 来构建部署包。
- .zip 文件必须包含您的函数代码以及用于在 Lambda 上运行您的函数代码(如果适用)的任何依赖项。如果您的函数仅依赖于标准库或 AWS 开发工具包库,则无需将这些库包含在您的 .zip 文件中。这些库包含在受支持的 Lambda 运行时环境中。
- 如果任何库使用本机代码,请使用 Amazon Linux 环境来创建部署包。此外,请确保您在与 Lambda 相同的平台上本地打包本机代码(如果有的话)!
- 如果您的部署包包含本机库,您可以使用 AWS 无服务器应用程序模型 (
AWS SAM) 构建部署包。您可以使用 AWS SAM CLI sam build 命令和 --use-container 创建部署包。此选项在与 Lambda 执行环境兼容的 Docker 映像内构建部署包。