【问题标题】:Node Executable in AWS LambdaAWS Lambda 中的节点可执行文件
【发布时间】:2021-06-05 00:39:00
【问题描述】:

我正在尝试构建一个利用 Sentry CLI 的 AWS Lambda(节点)函数。到目前为止,我有类似的东西:

const CLI = require("@sentry/cli");

const cli = new CLI(null, {
  org: '...',
  authToken: '...',
});

exports.handler = async (event) => {
  const response = await cli.execute(["releases", "list"]);

  // ...create a release/deploy/etc...
};

然而这失败了:

/var/task/node_modules/@sentry/cli/sentry-cli: 无法执行二进制文件

好像有过类似的issue reported,建议更改可执行文件的权限。

如何确保在将函数压缩/上传到 AWS 时不会剥夺可执行文件的权限?

【问题讨论】:

  • 难道没有sentry NPM package 可以用来代替 cli 吗?
  • Sentry CLI already 不是 NPM 包吗?
  • @jarmod 是的,但是我不相信您可以使用它创建发布/部署——AFAIK 只能通过 CLI 完成,但我可能是错的。
  • @KyleDecot 你能在 Github 上分享问题链接吗?当前链接指向回购主页,而不是问题。谢谢
  • 另外,这个 AWS page 说使用 chmod 来解决问题

标签: node.js aws-lambda sentry


【解决方案1】:

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
    • 函数执行时间
    • 函数版本

注意事项:

  1. .zip 文件必须小于 50 MB。如果大于 50 MB,Amazon 建议将其上传到 Amazon Simple Storage Service (Amazon S3) 存储桶。
  2. .zip 文件不能包含用 C 或 C++ 编写的库。如果您的 .zip 文件包含 C 扩展库,例如 Pillow (PIL) 或 numpy 库,我们建议使用 AWS 无服务器应用程序模型 (AWS SAM) 命令行界面 (CLI) 来构建部署包。
  3. .zip 文件必须包含您的函数代码以及用于在 Lambda 上运行您的函数代码(如果适用)的任何依赖项。如果您的函数仅依赖于标准库或 AWS 开发工具包库,则无需将这些库包含在您的 .zip 文件中。这些库包含在受支持的 Lambda 运行时环境中。
  4. 如果任何库使用本机代码,请使用 Amazon Linux 环境来创建部署包。此外,请确保您在与 Lambda 相同的平台上本地打包本机代码(如果有的话)!
  5. 如果您的部署包包含本机库,您可以使用 AWS 无服务器应用程序模型 (AWS SAM) 构建部署包。您可以使用 AWS SAM CLI sam build 命令和 --use-container 创建部署包。此选项在与 Lambda 执行环境兼容的 Docker 映像内构建部署包。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 2023-04-04
    • 1970-01-01
    • 2017-07-07
    相关资源
    最近更新 更多