AWS Lambda
开发人员指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

使用较早的 Node.js 运行时 v0.10.42

截至 2017 年 5 月,AWS Lambda 支持 Node.js 6.10 和 Node.js 4.3。有关在创建 Lambda 函数时指定此运行时的信息,请参阅 CreateFunction--runtime 参数。

Node v0.10.42 目前已淘汰。您必须尽快将现有函数迁移到 AWS Lambda 上可用的较新 Node.js 运行时版本 (nodejs4.3 或 nodejs6.10)。在 2017 年 6 月 30 日之前,您可以申请一次性延期:前往 Lambda 控制台,然后按照提供的说明操作。 不迁移也不延期会导致以 Node v0.10.42 运行时编写的函数的任意调用返回无效参数值错误。注意,对于包含以 Node v0.10.42 运行时编写的函数的每个区域,您都必须遵循此过程。下面的部分重点介绍 AWS Lambda 的运行时支持策略,运行时 v0.10.42 的特有行为,以及如何将现有函数迁移到较新的版本。

运行时支持策略

AWS Lambda 将根据 Node LTS 工作组页面指定的维护时段结束时间,仅淘汰标记为 EOL (终止使用) 的运行时。标记为 EOL 的版本 (如 Node 0.10) 将首先停止支持新函数的创建。现有函数将继续有效,直到客户有足够的时间迁移到较新版本,我们将根据个别客户的需要进行配合。在其他 Node 版本被标记为 LTS (长期支持) 后的几个月内,AWS Lambda 将增加对该 LTS 版本的支持。

将 Lambda 函数代码转换为较新的运行时

Node v0.10.42 目前已淘汰。您必须尽快将现有函数迁移到 AWS Lambda 上可用的较新 Node.js 运行时版本 (nodejs4.3 或 nodejs6.10)。在 2017 年 6 月 30 日之前,您可以申请一次性延期:前往 Lambda 控制台,然后按照提供的说明操作。 不迁移也不延期会导致以 Node v0.10.42 运行时编写的函数的任意调用返回无效参数错误。注意,对于包含以 Node v0.10.42 运行时编写的函数的每个区域,您都必须遵循此过程。

以下部分说明了如何将现有的 Lambda 函数代码迁移到较新的运行时:

  1. 查看全部现有 Lambda 函数,并规划迁移。您可以通过如下方式获取函数列表,以及它们的版本和别名:

    要列出使用蓝图的 Lambda 函数的更多信息,请参阅使用运行时更新蓝图列出 Lambda 函数并更新到较新的运行时

    使用控制台列出 Lambda 函数:

    1. 登录 AWS 管理控制台并打开 Lambda 控制台。

    2. 选择 Runtime 列。该区域的所有 Lambda 函数将按其运行时值进行排序。

    3. 打开运行时值为 Node.js 的每个 Lambda 函数,然后选择 Configuration 选项卡。

    4. 选择 Qualifiers 下拉列表。

    5. 选择每个版本并查看其运行时。

    6. 选择每个别名,查看它指向的版本。

    7. 根据需要针对每个区域重复上述步骤。

  2. 对于每个函数:

    1. 首先以手动更新方式或以 UPDATE 模式运行 nodejs-upgrade-functions 蓝图来更新运行时 (有关更多信息,请参阅使用运行时更新蓝图列出 Lambda 函数并更新到较新的运行时)。我们强烈建议您更新所用的所有上下文方法,并用回调方法进行替换。有关更多信息,请参阅Node.js 运行时 v0.10.42 中的 context 方法

    2. 测试并验证 Lambda 函数是否能通过对其行为的内部验证。如果无法通过验证,您可能需要更新 Lambda 代码以在新运行时中使用:

    3. 一旦您的函数已成功调用,转换即完成。

  3. 检查现有函数的版本和别名。您可以使用使用 Lambda 控制台列出 Lambda 函数并更新到较新的运行时使用运行时更新蓝图列出 Lambda 函数并更新到较新的运行时获取每个函数的版本列表。对于每个版本,请执行以下操作:

    1. 将代码复制到 $ LATEST。

    2. 从步骤 2 开始重复上述过程。

    3. 新版本完成后,重新发布代码。

    4. 将当前指向旧版本的别名更新为指向新发布的版本。

    5. 删除旧版本。

使用 CLI 列出 Lambda 函数并更新运行时

您可以使用 ListFunctions 命令返回全部 Lambda 函数的列表,并返回使用 v0.10 运行时创建的函数。以下代码示例演示了如何执行此操作:

Copy
#!/bin/bash for REGION in $(aws ec2 describe-regions --output text --query 'Regions[].[RegionName]' | egrep -v 'ca-central-1|sa-east-1' | sort); do echo "...checking $REGION" echo " nodejs0.10 functions: " for i in $(aws lambda list-functions --output json --query 'Functions[*].[FunctionName, Runtime]' --region $REGION | grep -v nodejs4.3 | grep -v nodejs6.10 | grep -B1 nodejs | grep , | sort); do echo " -> $i" done done echo "This script only accounts for the \$LATEST versions of functions. You may need to take a closer look if you are using versioning."

对于返回的每个使用 v0.10 运行时创建的 Lambda 函数,请使用 UpdateFunctionConfiguration 命令将 --runtime 值设置为 nodejs4.3nodejs6.10

使用 Lambda 控制台列出 Lambda 函数并更新到较新的运行时

  • 登录 AWS 管理控制台并打开 Lambda 控制台。

  • 选择 Runtime 选项卡。该区域的所有 Lambda 函数将按其运行时值进行排序。

  • 打开运行时值为 node.js 的每个 Lambda 函数,然后选择 Configuration 选项卡。

  • Runtime 值设置为 Node.js 4.3Node.js 6.10

  • 根据需要针对每个区域重复此过程。

使用运行时更新蓝图列出 Lambda 函数并更新到较新的运行时

  • 登录 AWS 管理控制台并打开 Lambda 控制台。

  • 选择 Create a Lambda Function

  • 选择 nodejs-upgrade-functions 蓝图,使用它创建一个函数。

  • 注意,该函数有以下可用的环境变量:

    • MODE = ListBackupUpgrade

    • TARGET_RUNTIME = nodejs4.3nodejs6.10

    • EXCLUDED = 要从处理中排除的函数名称的逗号分隔列表 (不要在列表中包含空格)

  • 要获取函数和版本列表,请从控制台调用函数,不要对变量值进行任何更改。

  • 要在升级之前备份函数,请将 MODE 的值更改为 Backup,然后从控制台调用该函数。强烈建议在升级函数前执行该操作。

  • 要更新函数的运行时值,请将 MODE 的值更改为 Upgrade,然后从控制台调用该函数。

  • 根据需要针对每个区域重复此过程。

  • 请注意:

    • 蓝图将您现有的 Node.js v1.0 函数保存为一个版本,并根据所选版本将 $LATEST 更新为 nodejs4.3 或 nodejs6.10。没有其他版本的函数可以升级。您可以使用该版本信息使所有现有应用程序指向该版本。

    • 蓝图不修改别名。指向该函数的任何别名都必须重新映射到新版本。有关更多信息,请参阅 AWS Lambda 函数版本控制和别名

Node.js 运行时 v0.10.42 中的 context 方法

Node.js 运行时 v0.10.42 不支持 Lambda 函数的回调参数,而运行时 v4.3 和 v6.10 支持。在使用运行时 v0.10.42 时,您使用以下 context 对象方法来正确终止 Lambda 函数。Context 对象支持 done()succeed()fail() 方法,您可用来终止 Lambda 函数。运行时 v4.3 和 v6.10 中也存在这些方法,用于提供向后兼容性。有关转换代码以使用运行时 v4.3 或 v6.10 的信息,请参阅将 Lambda 函数代码转换为较新的运行时

context.succeed()

表示 Lambda 函数执行和所有回调已成功完成。一般语法如下:

Copy
context.succeed(Object result);

其中:

result - 是可选参数,可用于提供函数执行的结果。

提供的 result 必须兼容 JSON.stringify。如果 AWS Lambda 无法转化字符串或遇到其他错误,则会引发 unhandled 异常,并将 X-Amz-Function-Error 响应头设为 Unhandled

您可以在不使用任何参数的情况下调用此方法 (succeed()),也可以传递 null 值 (succeed(null))。

此方法的行为取决于 Lambda 函数调用中指定的调用类型。有关调用类型的更多信息,请参阅 Invoke

  • 如果使用 Event 调用类型(异步调用)调用 Lambda 函数,该方法将返回 HTTP status 202, request accepted 响应。

  • 如果使用 RequestResponse 调用类型(同步调用)调用 Lambda 函数,该方法将返回 HTTP 状态 200 (OK),并将响应正文设为 result 的字符串表示。

context.fail()

表示 Lambda 函数执行和所有回调失败,生成了一个已处理的异常。一般语法显示如下:

Copy
context.fail(Error error);

其中:

error - 是可选参数,可用于提供 Lambda 函数执行的结果。

如果 error 值非 null,该方法会将响应正文设为 error 的字符串表示形式,并将对应日志写入 CloudWatch。如果 AWS Lambda 无法转化字符串或遇到其他错误,则会出现一个未处理的错误,并会将 X-Amz-Function-Error 头设为 Unhandled

注意

对于来自 context.fail(error)context.done(error, null) 的错误,Lambda 记录错误对象的前 256 KB 内容。对于较大的错误对象,AWS Lambda 截断错误并在错误对象旁边显示文本: Truncated by Lambda

您可以在不使用任何参数的情况下调用此方法 (fail()),也可以传递 null 值 (fail(null))。

context.done()

导致 Lambda 函数执行终止。

注意

该方法是对 succeed()fail() 方法的补充,它允许使用“错误优先”的回调设计模式。它不提供多余的功能。

一般语法为:

Copy
context.done(Error error, Object result);

其中:

  • error - 是可选参数,可用于提供失败的 Lambda 函数执行的结果。

  • result - 是可选参数,可用于提供成功的函数执行的结果。提供的 result 必须兼容 JSON.stringify。如果提供了错误,则忽略此参数。

您可以在不使用任何参数的情况下调用此方法 (done()),也可以传递 null (done(null))。

AWS Lambda 将任何非 null 的 error 参数值视为已处理的异常。

函数行为取决于在 Lambda 调用时指定的调用类型。有关调用类型的更多信息,请参阅 Invoke

  • 无论调用类型如何,该方法都会自动将 error 的非 null 值的字符串表示记录到与 Lambda 函数关联的 Amazon CloudWatch Logs 流。

  • 如果使用了 RequestResponse(同步)调用类型调用 Lambda 函数,该方法将返回如下响应正文:

    • 如果 error 为 null,则将响应正文设为 result 的 JSON 表示形式。这类似于 context.succeed()

    • 如果 error 不为 null 或该函数是使用 error 类型的单一参数调用的,则 error 值将填充在响应正文中。

注意

对于来自 done(error, null)fail(error) 的错误,Lambda 记录错误对象的前 256 KB 内容,对于较大的错误对象,AWS Lambda 将截断日志,并在错误对象旁边显示文本 Truncated by Lambda

比较上下文和回调方法

如果您以前使用 Node.js 运行时 v0.10.42 创建了 Lambda 函数,您可以使用其中 context 对象方法(done()succeed()fail())来终止 Lambda 函数。在 Node.js 运行时 v4.3 和 v6.10 中,支持这些方法的目的主要是向后兼容。我们建议您使用 callback(请参阅 使用回调参数)。以下 callback 示例与 context 对象方法等效:

  • 以下示例显示了 context.done() 方法以及较新运行时中支持的对应等效 callback

    Copy
    // Old way (Node.js runtime v0.10.42). context.done(null, 'Success message'); // New way (Node.js runtime v4.3 or v6.10). context.callbackWaitsForEmptyEventLoop = false; callback(null, 'Success message');

    重要

    出于性能原因,AWS Lambda 可能会为 Lambda 函数的多次执行重用相同的 Node.js 进程。如果出现这种情况,AWS Lambda 在执行之间冻结 Node 进程,保留继续执行所需的状态信息。

    调用 context 方法时,AWS Lambda 立即冻结 Node 进程,而不等待与进程关联的事件循环清空。进程状态以及事件循环中的任何事件将冻结。再次调用函数时,如果 AWS Lambda 重用冻结进程,则函数使用其相同的全局状态继续执行(例如,开始处理保留在事件循环中的事件)。但是,在使用回调时,AWS Lambda 继续执行 Lambda 函数,直至事件循环清空。处理事件循环中的所有事件之后,AWS Lambda 冻结 Node 进程,包括 Lambda 函数中的任何状态变量。因此,如果您希望 context 方法具有相同行为,您必须将 context 对象属性 callbackWaitsForEmptyEventLoop 设置为 false。

  • 以下示例显示了 context.succeed() 方法以及较新运行时中支持的对应等效 callback

    Copy
    // Old way (Node.js runtime v0.10.42). context.succeed('Success message'); // New way (Node.js runtime v4.3 or v6.10). context.callbackWaitsForEmptyEventLoop = false; callback(null, 'Success message');
  • 以下示例显示了 context.fail() 方法以及较新运行时中支持的对应等效 callback

    Copy
    // Old way (Node.js runtime v0.10.42). context.fail('Fail object'); // New way (Node.js runtime v4.3 or v6.10). context.callbackWaitsForEmptyEventLoop = false; callback('Fail object', 'Failed result');