一般性问题

问:什么是 AWS Lambda?

通过 AWS Lambda,无需配置或管理服务器即可运行代码。您只需按消耗的计算时间付费 – 代码未运行时不产生费用。借助 Lambda,您几乎可以为任何类型的应用程序或后端服务运行代码,而且全部无需管理。只需上传您的代码,Lambda 会处理运行和扩展高可用性代码所需的一切工作。您可以将您的代码设置为自动从其他 AWS 服务触发,或者直接从任何 Web 或移动应用程序调用。

问:什么是无服务器计算?

无服务器计算让您可以构建并运行应用程序和服务,而无需管理服务器。借助无服务器计算,您的应用程序仍在服务器上运行,但所有服务器管理工作均由 AWS 来完成。AWS Lambda 是无服务器计算的核心,支持您运行代码,且无需预置或管理服务器。要了解有关无服务器计算的更多信息,请访问此处

问:哪些事件可以触发 AWS Lambda 函数?

有关事件源的完整列表,请参阅我们的文档

问:什么时候应该使用 AWS Lambda 与 Amazon EC2?

Amazon Web Services 提供一组计算服务以满足各种需求。

Amazon EC2 具有范围广泛的实例类型以及自定义操作系统、网络和安全设置以及整个软件堆栈的选项,可提供灵活性,从而让您能够将现有的应用程序轻松迁移到云中。使用 Amazon EC2,您将负责预配置容量、监控服务器队的运行状况和性能,并设计容错性和可扩展性。AWS Elastic Beanstalk 提供易用的服务,供您部署和扩展 Web 应用程序,您可以在其中保留对底层 EC2 实例的所有权和完整控制权。Amazon EC2 Container Service 是一项可扩展的管理服务,支持 Docker 容器,允许您轻松地在 Amazon EC2 实例的托管群集上运行分布式应用程序。

AWS Lambda 可用于依照对事件的响应轻松执行代码,如 Amazon S3 存储桶的更改、Amazon DynamoDB 表的更新或您的应用程序或设备生成的自定义事件。利用 Lambda,您不必预配置您自己的实例;Lambda 会代您执行所有的运行和管理活动,包括容量预配置、监控服务器队运行状况、向底层计算资源应用安全补丁、部署您的代码、在前端运行 Web 服务以及监控和记录您的代码。AWS Lambda 为您的代码提供轻松的扩展和高可用性,从而无需您做额外努力。

问:什么类型的代码可在 AWS Lambda 上运行?

AWS Lambda 提供了一种简单的方式来完成云中的许多活动。例如,您可以使用 AWS Lambda 构建以下内容:可以检索并转换 Amazon DynamoDB 中数据的移动后端,当对象上传到 Amazon S3 以后对其进行压缩或转换的处理程序,用于任意 Amazon Web Service 的 API 调用的审核和报告功能,使用 Amazon Kinesis 进行的流数据免服务器处理。

问:AWS Lambda 支持哪些语言?

AWS Lambda 支持用 Node.js (JavaScript)、Python、Java (兼容 Java 8) 和 C# (.NET Core) 编写的代码。您的代码中可包含现有的库,甚至是本机库。有关使用 Node.jsPythonJavaC# 的信息,请参阅我们的文档。

问:能否访问 AWS Lambda 运行所在的基础设施?

否。AWS Lambda 会代您运行计算基础设施,从而执行运行状况检查、应用安全补丁和执行其他例行维护。

问:AWS Lambda 如何隔离我的代码?

每个 AWS Lambda 函数都运行在其自己的环境中,有其自己的资源和文件系统视图。AWS Lambda 使用与 Amazon EC2 相同的技术在基础设施和执行级别上提供安全性和隔离。

问:AWS Lambda 如何保护我的代码安全?

AWS Lambda 在 Amazon S3 中存储代码并在静态下加密代码。AWS Lambda 在使用您的代码时执行额外的完整性检查。

AWS Lambda 函数

问:什么是 AWS Lambda 函数?

您在 AWS Lambda 上运行的代码以“Lambda 函数”上传。每个函数都有相关的配置信息,如其名称、描述、入口点和资源要求。代码必须以“无状态”样式编写,即应假设与底层计算基础设施无密切关系。本地文件系统访问、子过程和类似的项目可能不会超出请求的使用寿命,且任何持续状态都应存储在 Amazon S3、Amazon DynamoDB 或另一个可用 Internet 的存储服务中。Lambda 函数可包含库,甚至是本机库。

问:AWS Lambda 是否会再使用函数实例?

为了提高性能,AWS Lambda 可以选择保留您的函数实例,将其再用于服务后续请求,而不是创建一个新副本。要了解有关 Lambda 如何重复使用函数实例的更多信息,请访问我们的文档。您的代码不应假设此操作总是发生。

问:如果需要在磁盘上为 AWS Lambda 函数留下暂存空间,会发生什么?

每个 Lambda 函数都会在自己的 /tmp 目录中接收到 500MB 的非永久性磁盘空间。

问:AWS Lambda 函数为什么必须是无状态的?

保持函数的无状态性可使 AWS Lambda 按需要尽可能多地启动函数副本,从而扩展到传入事件的速率。由于 AWS Lambda 的编程模式是无状态的,因此您的代码可以通过调用其他 Web 服务,如 Amazon S3 或 Amazon DynamoDB,来访问有状态的数据。

问:能否在 AWS Lambda 函数代码中使用线程和进程?

能。AWS Lambda 可使您使用正常的语言和操作系统功能,如创建额外的线程和进程。分配至 Lambda 函数的资源,包括内存、执行时间、磁盘和网络使用,都必须通过其使用的所有线程/进程进行共享。可以使用任意 Amazon Linux 支持的语言启动进程。

问:哪些限制适用于 AWS Lambda 函数代码?

Lambda 尝试尽可能不对正常的语言和操作系统活动施加限制,但有些活动仍被禁用:入站网络连接被 AWS Lambda 阻止;对于出站连接,只支持 TCP/IP 套接字;ptrace (调试) 系统调用受到限制。TCP 端口 25 流量同样受到阻止,这是一项反垃圾邮件措施。

问:如何使用 Lambda 控制台创建 AWS Lambda 函数?

如果您正在使用 Node.js 或 Python,则可以使用 AWS Lambda 控制台中的代码编辑器为您的函数编写代码,您可使用该编辑器编写和测试函数,并在类似 IDE 的稳健环境中查看函数执行的结果。前往控制台以开始

您也可以将代码 (以及任何依赖库) 打包为 ZIP 并使用 AWS Lambda 控制台从您的本地环境上传或指定 ZIP 文件所在的 Amazon S3 位置。上传的内容必须不超过 50MB (压缩后)。您可以使用 AWS Eclipse 插件以 Java 制作和部署 Lambda 函数。您可以使用 Visual Studio 插件以 C# 和 Node.js 制作和部署 Lambda 函数。

问:如何使用 Lambda CLI 创建 AWS Lambda 函数?

您可以将代码 (以及任何依赖库) 打包为 ZIP 并使用 AWS CLI 从您的本地环境上传,或指定 ZIP 文件所在的 Amazon S3 位置。上传的内容不得超过 50MB (压缩后)。请访问 Lambda 入门指南以开始。

问:AWS Lambda 是否支持环境变量?

支持。使用 AWS Lambda 控制台、命令行界面或软件开发工具包,即可轻松创建和修改环境变量。要详细了解环境变量,请参阅该文档

问:能否在环境变量中存储敏感信息?

对于敏感信息 (如数据库密码),我们建议您使用 AWS Key Management Service 进行客户端加密并将生成的值作为密文存储在您的环境变量中。您需要在 AWS Lambda 函数代码中包含逻辑才能解密这些值。

问:如何管理我的 AWS Lambda 函数?

您可以使用 AWS Lambda 控制台中的仪表板轻松列出、删除、更新和监控您的 Lambda 函数。您还可以使用 AWS CLI 和 AWS 软件开发工具包来管理您的 Lambda 函数。请访问 Lambda 开发人员指南了解更多信息。

问:如何监控 AWS Lambda 函数?

AWS Lambda 会通过 Amazon CloudWatch 报告实时指标,代您自动监控 Lambda 函数,指标包括请求总数、账户级别和函数级别并发使用情况、延迟、出错率和请求调用。通过 Amazon CloudWatch 控制台或 AWS Lambda 控制台,可以查看每一个 Lambda 函数的统计信息。您还可以在您的 Lambda 函数中调用第三方监控 API。

请访问故障排除 CloudWatch 指标了解更多信息。使用 Lambda 的内建指标会依照 AWS Lambda 的标准费率计费。

问:如何对 AWS Lambda 函数的故障进行故障排除?

AWS Lambda 与 Amazon CloudWatch 日志自动集成,对每个 Lambda 函数创建一个日志组并提供基本的应用程序生命周期事件日志条目,包括记录该函数每次使用时所消耗的资源。您可以轻松将额外的日志语句插入到代码中。您还可以在您的 Lambda 函数中调用第三方记录 API。请访问故障排除 Lambda 函数了解更多信息。将按照 Amazon CloudWatch 日志费率计费。

问:如何扩展 AWS Lambda 函数?

您不必扩展您的 Lambda 函数,AWS Lambda 会代您自动扩展它们。每当接收到您的函数的事件通知时,AWS Lambda 会在其计算舰队中快速定位空闲容量并运行您的代码。由于您的代码是无状态的,AWS Lambda 可以在需要时尽可能多地启动实例副本,而不会发生冗长的部署和配置延迟。函数的扩展方面没有基本限制。AWS Lambda 将动态分配容量以匹配传入事件的速率。

问:如何将计算资源分配至 AWS Lambda 函数?

在 AWS Lambda 资源模型中,您可以选择您想为函数分配的内存量,并按 CPU 功率和其他资源的比例进行分配。例如,选择 256MB 的内存分配至您的 Lambda 函数的 CPU 功率约是请求 128MB 内存的两倍,若选择 512MB 的内存,其分配的 CPU 功率约是一半。您可以在 128MB 到 3GB 的范围间以 64MB 的增量设置您的内存。

问:AWS Lambda 函数的执行需要多长时间?

对 AWS Lambda 进行的同步调用必须在 300 秒钟内执行完毕。默认的超时为 3 秒,但您可以将超时设置在 1 到 300 秒之间的任何值。

问:使用 AWS Lambda 函数将如何付费?

AWS Lambda 按使用量收费。请参阅 AWS Lambda 定价页面了解详细信息。

问:AWS Lambda 是否支持版本控制?

支持。默认情况下,每个 AWS Lambda 函数拥有单一的当前版本的代码。Lambda 函数客户端可调用特定的版本或获取最新的实施。请阅读有关 Lambda 函数版本控制的文档。

问:上传代码后,AWS Lambda 函数需要准备多久进行调用?

部署时间根据代码大小的不同而不同,但 AWS Lambda 函数一般在上传后几秒钟内就能做好调用准备。

问:我能否使用自己的支持的库版本?

可以。您可以在其中包含自己的代码库的副本 (包括 AWS 软件开发工具包),以使用除 AWS Lambda 所提供的默认版本之外的版本。

使用 AWS Lambda 处理 AWS 事件

问:什么是事件源?

事件源是 AWS 服务或开发人员创建的应用程序,用于生成可触发 AWS Lambda 函数使其运行的事件。有些服务通过直接调用云函数 (例如 Amazon S3) 向 Lambda 发布这些事件。Lambda 也可以在未向 Lambda 发布事件的其他服务中轮询资源。例如,Lambda 可以从 Kinesis 数据流中拉取记录并为数据流中的每条消息执行 Lambda 函数。

通过登录到 Amazon S3 并使用 S3 存储桶通知,就可将 AWS CloudTrail 等其他很多服务简单地用作触发 AWS Lambda 函数的事件源。

问:哪些事件源可用于 AWS Lambda?

有关事件源的完整列表,请参阅我们的文档

问:事件在 AWS Lambda 中如何表示?

事件以事件输入参数的形式传输到 Lambda 函数中。对于事件以批量方式到达的事件来源,例如 Amazon Kinesis 和 Amazon DynamoDB 流,事件参数可以在一个调用中包含多个事件,具体取决于请求的批量处理的大小。关于 Amazon S3 事件通知的更多信息,请访问配置 Amazon S3 事件通知。关于 Amazon DynamoDB 流的更多信息,请访问 DynamoDB 流开发人员指南。关于使用 Amazon SNS 调用 Lambda 函数的更多信息,请访问 Amazon SNS 开发人员指南。关于 Amazon Cognito 事件的更多信息,请访问 Amazon Cognito。关于 AWS CloudTrail 日志和跨 AWS 服务审核 API 调用的更多信息,请参见 AWS CloudTrail

问:我如何对 Amazon S3 存储桶中的更改作出 AWS Lambda 函数响应?

您可以从 AWS Lambda 控制台中选择一个函数并将其与 Amazon S3 存储桶中的通知关联起来。或者,您可以使用 Amazon S3 控制台并配置存储桶的通知以发送到您的 AWS Lambda 函数。还可通过 AWS 软件开发工具包和 CLI 实现这一功能。

问:我如何对 Amazon DynamoDB 表中的更新作出 AWS Lambda 函数响应?

通过将 Lambda 函数订阅到与 DynamoDB 表格相关联的 DynamoDB 流,您可以对 DynamoDB 表格更新触发 Lambda 函数。您可以使用 Amazon DynamoDB 控制台、AWS Lambda 控制台或 Lambda 的 registerEventSource API 将 DynamoDB 流与 Lambda 函数关联起来。

问:如何使用 AWS Lambda 函数处理 Amazon Kinesis 流中的记录?

您可以从 AWS Lambda 控制台中选择一个 Lambda 函数并将其与属于相同账户的 Amazon Kinesis 流进行关联。还可通过 AWS 开发工具包和 CLI 实现这一功能。

问:AWS Lambda 如何处理来自 Amazon Kinesis 流和 Amazon DynamoDB 流的数据?

发送到您的 AWS Lambda 功能的 Amazon Kinesis 和 DynamoDB 流记录将根据分片进行严格序列化。这意味着,如果您将两个记录放在同一个分片中,则 Lambda 保证将首先通过第一条记录来调用您的 Lambda 功能,然后再通过第二条记录来调用。如果第一条记录的调用超时,或者遇到任何其他错误,则 Lambda 将重试直至其成功 (或者记录达到其 24 小时过期时间),然后才会对下一条记录采取操作。无法保证不同分片之间记录的排序,并且每个分片的处理是平行进行的。

问:如何使用 AWS Lambda 函数响应 Amazon Simple Notification Service (SNS) 发出的通知?

您可以从 AWS Lambda 控制台中选择一个 Lambda 函数并将其与 Amazon SNS 主题进行关联。还可通过 AWS 软件开发工具包和 CLI 实现这一功能。

问:如何使用 AWS Lambda 函数响应 Amazon Simple Email Service (SES) 发送的电子邮件?

在 Amazon SES 控制台中,您可以设置接收规则,以使 Amazon SES 将消息交付到 AWS Lambda 函数。还可通过 AWS 软件开发工具包和 CLI 实现这一功能。

问:如何使用 AWS Lambda 函数响应 Amazon CloudWatch 警报?

首先应配置警报,使其发送 Amazon SNS 通知。然后从 AWS Lambda 控制台中选择一个 Lambda 函数并将其与 Amazon SNS 主题进行关联。请参阅 Amazon CloudWatch 开发人员指南,了解设置 Amazon CloudWatch 警报的更多信息。

问:如何使用 AWS Lambda 函数响应由 Amazon Cognito 管理的用户或设备数据的变更?

您可以从 AWS Lambda 控制台中选择一个函数,当与 Amazon Cognito 身份池关联的任何数据集进行同步时,触发这个函数。还可通过 AWS 开发工具包和 CLI 实现这一功能。请访问 Amazon Cognito,了解关于使用 Amazon Cognito 在用户设备间共享和同步数据的更多信息。

问:应用程序如何直接触发 AWS Lambda 函数?

您可以通过 AWS Lambda 的调用 API 使用自定义事件调用 Lambda 函数。只有该函数的所有者或获得该所有者收取的另一个 AWS 账户才能调用该函数。请访问 Lambda 开发人员指南了解更多信息。

问:调用 AWS Lambda 函数响应事件的延迟如何?

AWS Lambda 的设计可在若干毫秒内处理事件。当 Lambda 函数创建、更新后,或如果它最近未被使用,延迟都将立即升高。

问:我如何使用 AWS Lambda 创建移动后端?

您上传需要 AWS Lambda 执行的代码,然后使用 AWS 移动软件开发工具包中的 AWS Lambda 软件开发工具包从移动应用程序中对其进行调用。您可以进行直接 (同步) 调用来检索或实时查看数据,也可以进行异步调用。您也可以使用 Amazon API Gateway 定义自定义 API,并通过兼容 REST 的任何客户端调用您的 Lambda 函数。要详细了解 AWS 移动软件开发工具包,请访问 AWS Mobile SDK 页面。要详细了解 Amazon API Gateway,请访问 Amazon API Gateway 页面。

问:如何通过 HTTPS 调用 AWS Lambda 函数?

通过使用 Amazon API Gateway 定义自定义的 RESTful API,您可以通过 HTTPS 调用 Lambda 函数。这为您的函数提供了端点,这些函数可以响应 GET、PUT 和 POST 等 REST 调用。了解有关通过 Amazon API Gateway 使用 AWS Lambda 的更多信息

问:AWS Lambda 函数如何根据发起请求的设备和应用程序对其行为进行自定义?

当通过 AWS 移动软件开发工具包进行调用时,AWS Lambda 函数能自动通过“context”对象获得发起调用的设备和应用程序的深入洞见。

问:AWS Lambda 函数如何根据应用程序终端用户的身份对其行为进行个性化?

当应用程序使用 Amazon Cognito 身份时,终端用户可以使用各种公共登录供应商 (包括 Amazon、Facebook、Google) 及其他 OpenID Connect 兼容服务来对其进行验证。之后用户身份会自动加密并以 Amazon Cognito id 的形式呈送给 Lambda 函数,同时允许其访问 Amazon Cognito 中的用户数据,或作为密钥储存和检索 Amazon DynamoDB 或其他 web 服务中的数据。

问:如何使用 AWS Lambda 创建 Alexa 技能?

AWS Lambda 与 Alexa 技能套件集成,后者是一个自助 API、工具、文档和代码示例集合,让您能够为 Alexa 轻松创建以语音为主的能力 (或“技能”)。您只需为新的 Alexa 技能上传 Lambda 函数代码,AWS Lambda 将完成剩余工作,包括执行代码以响应 Alexa 语音交互,并代表您自动管理计算资源。有关更多详细信息,请阅读 Alexa Skills Kit 文档。

问:如果我的函数在处理事件时发生故障会发生什么?

对于 Amazon S3 存储桶通知和自定义事件,AWS Lambda 将在您的代码发生错误条件或您超出服务或资源限制时尝试执行您的函数三次。对于 AWS Lambda 代您轮询的有序事件源,如 Amazon DynamoDB Streams 和 Amazon Kinesis 数据流,Lambda 将在发生开发人员代码错误时继续尝试执行,直到该数据过期为止。您可以通过 Amazon Kinesis 和 Amazon DynamoDB 控制台以及 AWS Lambda 为您的函数生成的 Amazon CloudWatch 指标监控进展情况。您还可以根据出错率或执行节流的频率来设置 Amazon CloudWatch 警报。

使用 AWS Lambda 构建应用程序

问:什么是无服务器应用程序?

基于 Lambda 的应用程序 (也被称作无服务器应用程序) 由通过事件触发的函数组成。典型的无服务器应用程序包含一个或多个通过事件 (如向 Amazon S3 上传对象、Amazon SNS 通知或 API 操作) 触发的函数。这些函数既可独立运行,也能利用其他资源 (如 DynamoDB 表或 Amazon S3 存储桶)。最基本的无服务器应用程序仅包含一个函数。

问:如何部署和管理无服务器应用程序?

您可以使用 AWS 无服务器应用程序模型 (AWS SAM) 部署和管理无服务器应用程序。AWS SAM 是一项规范,其中规定了在 AWS 上表达无服务器应用程序的规则。该规范当前与 AWS CloudFormation 使用的语法相同,因此本身在 AWS CloudFormation 中作为一组资源类型 (被称作“无服务器资源”) 就受支持。得力于这些资源,AWS 客户能够更轻松地使用 CloudFormation 通过现有 CloudFormation API 配置和部署无服务器应用程序。

问:如何发现 AWS 社区开发的现有无服务器应用程序?

您可以使用 AWS Serverless Application Repository 从 AWS 社区的开发人员、公司和合作伙伴发布的无服务器应用程序集合中进行选择。找到应用程序后,您可以直接从 Lambda 控制台配置和部署该应用程序。

问:如何自动部署无服务器应用程序?

您可以使用 AWS CodePipeline 和 AWS CodeDeploy 自动执行无服务器应用程序的发布过程。CodePipeline 是一项持续交付服务,借助该服务,您能够为发布无服务器应用程序所需的步骤构建模型、使之可视化并自动执行这些步骤。CodeDeploy 为基于 Lambda 的应用程序提供了部署自动化引擎。您可以使用 CodeDeploy 根据既定最佳实践方法 (如 Canary 和线性部署) 编排部署,帮助您建立必要的防护以验证新部署的代码是否安全、稳定并已经准备好完全发布到生产环境。

要了解有关无服务器 CI/CD 的更多信息,请参阅我们的文档

问:如何开始构建无服务器应用程序?

首先,请访问 AWS Lambda 控制台,并下载我们的蓝图之一。您下载的文件将包含一份 AWS SAM 文件 (定义了您应用程序中的 AWS 资源) 和一份 .ZIP 文件 (包含您函数的代码)。然后,您可以使用 AWS CloudFormation 命令打包和部署您刚下载的无服务器应用程序。有关更多详细信息,请访问我们的文档

问:如何协调多个 AWS Lambda 函数之间的调用?

您可以使用 AWS Step Functions 以特定顺序来协调一系列 AWS Lambda 函数。您可以按顺序调用多个 Lambda 函数,然后将一个函数的输出传递到另一个函数,也可以进行并行调用,Step Functions 将在执行期间为您保持状态。

问:怎样排除无服务器应用程序的故障?

您可以启用 Lambda 函数利用 AWS X-Ray 进行跟踪的功能,方式为将 X-Ray 的权限添加到 Lambda 函数的执行角色,然后将函数的“跟踪模式”更改为“激活”。针对 Lambda 函数启用 X-Ray 之后,AWS Lambda 会将调用函数产生的 Lambda 服务开销方面的跟踪信息发送到 X-Ray。这样,您就能了解 Lambda 服务开销、函数启动时间和函数执行时间等信息。此外,您还可以将 X-Ray SDK 纳入 Lambda 部署程序包中,以便创建自己的跟踪段、为跟踪添加注释或者查看从 Lambda 函数进行的下游调用的跟踪段。X-Ray SDK 目前支持 Node.js 和 Java。请查看排除基于 Lambda 的应用程序的故障以便了解更多。我们会按 AWS X-Ray 的费率收取费用。

问:AWS SAM 如何获得许可证?

该规范在 Apache 2.0 下是开源性质的,允许您及他人采用构建、部署、监控和管理工具以及通过商业版许可证将 AWS SAM 融合到这些工具中。您可以在此处访问 GitHub 上的 AWS SAM 存储库。

Lambda@Edge

问:什么是 Lambda@Edge?

Lambda@Edge 允许您在全球的 AWS 站点运行代码,无需预置或管理服务器,以最低的网络延迟响应最终用户。您只需将您的 Node.js 代码上传到 AWS Lambda,然后配置要触发的函数,用于响应 Amazon CloudFront 请求 (即,当查看器请求到达时,当向来源转发请求或来源接收到请求时以及在响应最终用户之前)。当收到内容请求后,代码即可开始在全球的 AWS 站点执行,并按照全球的 CloudFront 请求量进行扩展。有关更多信息,请参阅我们的文档

问:如何使用 Lambda@Edge?

要使用 Lambda@Edge,您仅需将代码上传到 AWS Lambda,然后关联要触发的函数,用于响应 Amazon CloudFront 请求。您的代码必须符合 Lambda@Edge 服务限制。目前,Lambda@Edge 仅支持 Node.js 进行 CloudFront 事件的全局调用。有关更多信息,请参阅我们的文档

问:应该在何时使用 Lambda@Edge?

Lambda@Edge 针对最终查看器在全球范围内分布的延迟敏感型使用案例进行了优化。理想情况下,您可以在 CloudFront 边缘站点、函数和请求中查看决策所需的全部信息。这意味着,对于您需要决定如何基于用户特征 (例如,站点、客户端设备等) 提供内容的使用案例,它们现在可以直接从 Node.js-6.10 边缘节点执行和获取,无需重新路由到集中式服务器。

问:我可以部署现有的 Lambda 函数进行全局调用吗?

如果函数满足 Lambda@Edge 服务限制,则可以将现有的 Node.js-6.10 Lambda 函数与 CloudFront 事件关联,进行全局调用。有关如何更新函数属性的更多信息,请参阅此处

问:哪些 Amazon CloudFront 事件可用于触发我的函数?

在响应以下 Amazon CloudFront 事件时,会自动触发您的函数:

  • 查看者请求 – 当 Internet 上的最终用户或设备向 CloudFront 发出 HTTP(S) 请求,且请求到达离该用户最近的边缘站点时,将触发此事件。
  • 查看者响应 – 当边缘站点处的 CloudFront 服务器已准备好响应发出请求的最终用户或设备时,将触发此事件。
  • 来源请求 – 当 CloudFront 边缘服务器尚未将所请求的对象置入其缓存,且查看者请求已准备好发送给后端来源 Web 服务器 (如 Amazon EC2、Application Load Balancer 或 Amazon S3) 时,将触发此事件。
  • 来源响应 – 当边缘站点处的 CloudFront 服务器收到后端来源 Web 服务器的响应时,将触发此事件。

问:使用 AWS Lambda@Edge 与在 Amazon API Gateway 之后使用 AWS Lambda 有何区别?

区别在于 API Gateway 和 Lambda 是地区性服务。使用 Lambda@EdgeAmazon CloudFront,您可以根据最终查看者所在的位置跨多个 AWS 位置执行逻辑。

可扩展性和可用性

问:AWS Lambda 函数的可用性如何?

AWS Lambda 旨在通过复制和冗余来向服务本身和其操作的 Lambda 函数提供高可用性。二者皆无维护窗口期或计划停机时间。

问:当我改动代码或配置时,AWS Lambda 函数还可以使用吗?

可以。当您更新 Lambda 函数时,会有短暂的窗口期,通常不到 1 分钟,在这期间请求将由旧版本函数或新版本函数实现。

问:对于一次可以执行的 AWS Lambda 函数的数量有没有限制?

没有。AWS Lambda 采用的设计可以支持大量函数实例并列运行。但是,AWS Lambda 对每个区域的每个账户的并发执行次数具有默认安全限制(请访问此处了解默认安全限制数量的信息)。您还可以控制各个 AWS Lambda 函数的最大并发执行次数,并且您可以使用这项功能为关键函数保留一部分账户并发限制或下游资源流量速率上限。

如果您想申请提高限制,可访问我们支持中心,单击“Open a new case”,然后发出服务限制提升请求。

问:如果账户超出并发执行默认限制数量会怎么样?

如果超出限制,同步调用的 AWS Lambda 函数会返回一条节流错误信息 (429 错误代码)。异步调用的 Lambda 函数可以承受一定范围内的流量突增大约 15 到 30 分钟,之后再进来的事件将会以节流为理由遭到拒绝。如果调用的 Lambda 函数是用于响应 Amazon S3 事件,则被 AWS Lambda 拒绝的事件可能被 S3 保留 24 小时并在此期间反复重试。Amazon Kinesis 流和 Amazon DynamoDB 流中的事件会反复重试,直到 Lambda 函数成功或数据过期。Amazon Kinesis 和 Amazon DynamoDB 流会将数据保留 24 小时。

问:默认的数量限制是否在个别函数级别应用?

不是,默认的数量限制只在账户级别应用。

问:如果 Lambda 函数在处理事件时发生故障会怎样?

如遇故障,进行同步调用的 Lambda 函数会返回异常信息。异步调用的 Lambda 函数将至少重试 3 次。Amazon Kinesis Streams 和 Amazon DynamoDB Streams 中的事件会反复重试,直到 Lambda 函数成功或数据过期。Kinesis Streams 和 DynamoDB Streams 会至少保留数据 24 个小时。

问:如果 Lambda 函数调用用尽了策略规定的次数,会怎样?

当超过策略针对异步调用规定的重试次数时,您可以配置一个放置此事件的“死信队列”(DLQ);如果尚未配置 DLQ,此事件可能会被拒绝。当超过策略针对基于流的调用规定的重试次数时,数据可能已失效,因此已被拒绝。

问:我可以将哪些资源配置为 Lambda 函数的死信队列?

您可以将 Amazon SQS 队列或 Amazon SNS 主题配置为您的死信队列。

安全性与访问控制

问:如何允许我的 AWS Lambda 函数访问其他 AWS 资源?

您可以使用 IAM 角色授予 Lambda 函数相应的权限,以访问其他资源。AWS Lambda 在执行您的 Lambda 函数的同时承担该角色,因此您可以对该服务可使用的 AWS 资源保持完整、安全的控制。请访问设置 AWS Lambda 以了解有关角色的更多信息。

问:如何控制哪些 Amazon S3 存储桶可以调用哪些 AWS Lambda 函数?

当您配置 Amazon S3 存储桶向 AWS Lambda 函数发送消息时,将创建一条资源政策规则用于权限授予。请访问 Lambda 开发人员指南,了解 Lambda 函数的资源政策和访问控制的详细情况。

问:如何控制 AWS Lambda 函数可以轮询的 Amazon DynamoDB 表或 Amazon Kinesis 数据流?

对访问控制的管理通过 Lambda 函数的角色实现。分配给 Lambda 函数的角色同时决定了 AWS Lambda 可以代表其进行轮询的资源。请访问 Lambda 开发人员指南了解更多信息。

问:我是否可以使用 AWS Lambda 函数访问 Amazon VPC 后端的资源?

可以。您可以访问 Amazon VPC 后端的资源。

问:如何启用和禁用针对 Lambda 函数的 VPC 支持?

要启用 VPC 支持,您需要在单个 VPC 中指定一个或多个子网,并在配置函数时指定安全组。要禁用 VPC 支持,您需要更新函数配置并为子网和安全组指定空列表。您可以使用 AWS API、CLI 或 AWS Lambda 管理控制台更改这些设置。

问:一个 Lambda 函数是否可以访问多个 VPC?

不可以,Lambda 函数只能访问一个 VPC。如果指定多个子网,则所有子网都必须位于同一个 VPC 中。您可以通过在 VPC 之间建立对等连接来连接到其他 VPC。

问:一个 VPC 中的 Lambda 函数是否还能够访问 Internet 和 AWS 产品端点?

在默认配置下,配置为可访问特定 VPC 中资源的 Lambda 函数将无法访问 Internet。如果您需要访问外部端点,则需要在 VPC 中创建 NAT,以转发相应流量并将安全组配置为允许这些出站流量。

以 Java 编写的 AWS Lambda 函数

问:如何使用 Java 代码编译 AWS Lambda 函数?

您可以使用 Maven 或 Gradle 等标准工具编译 Lambda 函数。您的构建过程应模拟编译任何 Java 代码的同一构建过程,这取决于 AWS SDK。在源文件上运行您的 Java 编译器工具并在类路径上包含 AWS SDK 1.9 或更高版本,以延续依赖性。有关详细信息,请参阅我们的文档

问:Lambda 用于执行函数的 JVM 环境是什么?

Lambda 提供 openjdk 1.8 的 Amazon Linux 版本。

以 Node.js 编写的 AWS Lambda 函数

问:能否将资源包与 AWS Lambda 配合使用?

可以,您可以使用 NPM 资源包和自定义的资源包。单击此处了解更多信息。

问:我能否使用以 Node.js 编写的 AWS Lambda 函数执行其他程序?

可以。Lambda 的内建沙盒可以让您运行批处理 (“shell”) 脚本、其他语言运行时、实用程序例程和可执行文件。单击此处了解更多信息。

问:是否可以使用带有以 Node.js 编写的 AWS Lambda 函数的本地模块?

可以。您上传的 ZIP 文件可以包含任何静态连接的本机模块,动态连接的模块同样如此,动态模块用指向您的 Lambda 函数根目录的根路径编译。单击此处了解更多信息。

问:能否使用以 Node.js 编写的 AWS Lambda 执行二进制?

可以。您可以使用 Node.js 的 child_process 命令来执行您在函数中包含的二进制文件或任何向函数开放的 Amazon Linux 中的可执行文件。另外,还有多个打包命令行二进制代码的 NPM 资源包,如 node-ffmpeg。单击此处了解更多信息。

问:如何部署以 Node.js 编写的 AWS Lambda 函数代码?

要部署以 Node.js 编写的 Lambda 函数,仅需将您的 Javascript 代码和依赖库封装为 ZIP 包。您可以从您的本地环境上传 ZIP 包,或指定 ZIP 文件所在的 Amazon S3 位置。有关详细信息,请参阅我们的文档

以 Python 编写的 AWS Lambda 函数

问:能否将 Python 程序包与 AWS Lambda 配合使用?

能。您可以使用 pip 安装所需的任意 Python 程序包。

以 C# 编写的 AWS Lambda 函数

问:如何打包和部署以 C# 编写的 AWS Lambda 函数?

您可以使用 Visual Studio IDE 通过在“Solution Explorer”中选择“Publish to AWS Lambda”来创建 C# Lambda 函数。或者,您还可以在安装 [# Lambda CLI 工具补丁] 的 dotnet CLI 上直接运行“dotnet lambda publish”命令,这将会创建 C# 源代码的 ZIP、所有的 NuGet 依赖项以及您自己发布的 DLL 程序集,并使用运行时参数“dotnetcore1.0”自动将其上传到 AWS Lambda。

其他主题

问:AWS Lambda 支持哪些版本的 Amazon Linux、Node.js、Python、JDK、.NET Core、SDK 及其他库?

您可以单击此处查看受支持的版本列表。

问:能否更改 Amazon Linux 版本或任何语言运行时?

不能。AWS Lambda 向该服务的所有用户提供单一版本的操作系统和语言运行时。

问:如何记录和审核对 AWS Lambda API 进行的调用?

AWS Lambda 与 AWS CloudTrail 集成。AWS CloudTrail 可以记录日志文件并将其提供给 Amazon S3 存储桶,用于说明账户的 API 使用情况。

问:如何协调多个 Lambda 函数之间的调用?

您可以使用 Amazon Step Functions 来协调多个 Lambda 函数之间的调用。您可以按顺序调用多个 Lambda 函数,然后将一个函数的输出传递到另一个函数,也可以进行并行调用。请参阅我们的文档了解更多详情。

详细了解 AWS Lambda 定价

访问定价页面
准备好开始使用?
注册
还有更多问题?
联系我们