AWS Lambda
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

AWS Lambda 环境变量

利用 Lambda 函数的环境变量,您可以将设置动态传递到函数代码和库,而无需对代码进行任何更改。环境变量是您使用 AWS Lambda 控制台、AWS Lambda CLI 或 AWS Lambda 开发工具包作为函数配置的一部分创建并修改的密钥值对。AWS Lambda 随后会使用相应语言所支持的标准 API(如适用于 Node.js 函数的 process.env 将这些密钥值对提供给您的 Lambda 函数代码。

您可以使用环境变量帮助库了解以下信息:安装文件的目录、存储输出的位置、存储连接和日志记录设置等。通过仅这些设置与应用程序逻辑分隔开,您在需要基于不同设置更改相应函数行为时将无需更新您的函数代码。

注意

此功能目前在总部在中国(北京或宁夏)的 AWS 区域中不可用。部署包含环境变量的 Lambda 函数将导致 InvalidParameterException

设置

假设您希望某个 Lambda 函数在经历从开发到部署的不同生命周期阶段时做出不同的行为。例如,开发、测试和生产阶段可能包含函数需要连接的数据库,而这些数据库需要不同的连接信息并且使用不同的表名称。您可以创建环境变量来引用相关数据库名称、连接信息或表名称,并根据相应函数正在执行的阶段(例如,开发、测试和生产)设置函数的值,同时您的函数代码将保持不变。

以下屏幕截图介绍如何使用 AWS 控制台修改函数的配置。第一个屏幕截图显示如何配置与测试阶段对应的函数的设置。第二个屏幕截图显示如何配置与生产阶段对应的函数的设置。

请注意 Encryption configuration 部分。要了解有关如何使用此控制台的更多信息,请参阅使用环境变量创建 Lambda 函数以存储敏感信息教程。

此外,您还可以使用 AWS CLI 创建包含环境变量的 Lambda 函数。有关更多信息,请参阅 CreateFunctionUpdateFunctionConfiguration API。使用 AWS CloudFormation 创建和更新函数时,也支持环境变量。此外,环境变量还可用于配置特定于您的函数中包含的语言运行时或库的设置。例如,您可以修改 PATH 以指定存储可执行文件的目录。您还可以设置特定于运行时的环境变量,如 PYTHONPATH(适用于 Python)或 NODE_PATH(适用于 Node.js)。

以下示例创建了一个新的 Lambda 函数,它设置了 LD_LIBRARY_PATH 环境变量,用于指定共享库在运行时动态加载的目录。在此示例中,Lambda 函数代码使用的是 /usr/bin/test/lib64 目录中的共享库。请注意,Runtime 参数使用 nodejs6.10,但您还可以指定 nodejs8.10

$ aws lambda create-function --function-name myTestFunction \ --zip-file fileb://package.zip \ --role role-arn \ --environment Variables="{LD_LIBRARY_PATH=/usr/bin/test/lib64}" \ --handler index.handler --runtime nodejs6.10

环境变量的命名规则

只要相应集合的总大小不超过 4KB,您可以创建的环境变量的数量就没有限制。

其他要求包括:

  • 必须以字母 [a-zA-Z] 开头。

  • 只能包含字母数字字符和下划线 ([a-zA-Z0-9_]

此外,还有 AWS Lambda 预留的一组特定的密钥。如果您尝试为其中任意预留密钥设置值,将会收到提示禁止执行该操作的错误消息。有关这些密钥的更多信息,请参阅 适用于 Lambda 函数的环境变量

环境变量和函数版本控制

借助函数版本控制,您可以在 Lambda 函数从开发阶段到测试阶段再到生产阶段的过程中发布它的一个或多个版本,从而对您的 Lambda 函数代码进行管理。对于您发布的每个版本的 Lambda 函数,环境变量(以及 MemorySizeTimeout 限制等其他特定于函数的配置)会另存为相应版本的快照,且这些设置是不可变的(无法更改)。

随着应用程序和配置的要求不断变化,您可以创建新版本的 Lambda 函数并更新环境变量,以便在最新版本发布之前满足这些要求。您的函数的当前版本为 $LATEST。

此外,您还可以创建别名,即指向特定函数版本的指针。别名的优势在于,如果您需要回滚到之前的函数版本,则可以将相应别名指向该版本,其中包含该版本需要的环境变量。有关更多信息,请参阅AWS Lambda 函数版本控制和别名

环境变量加密

当您创建或更新使用环境变量的 Lambda 函数时,AWS Lambda 将使用 AWS Key Management Service 对其进行加密。当系统调用您的 Lambda 函数时,这些值已被加密且可供 Lambda 代码使用。

当您第一次在某个区域中创建或更新使用环境变量的 Lambda 函数时,系统会在 AWS KMS 中自动为您创建一个默认服务密钥。此密钥用于加密环境变量。但是,如果您希望使用加密帮助程序,并在创建 Lambda 函数后使用 KMS 加密环境变量,则您必须创建自己的 AWS KMS 键并选择它而不是默认键。默认键在选择时将给出错误。创建您自己的密钥可以实现更高的灵活性,让您可以创建、轮换、禁用和定义访问控制,并审核用于保护数据的加密密钥。有关更多信息,请参阅 AWS Key Management Service 开发人员指南

如果您使用自己的密钥,则需要依据 AWS Key Management Service 定价指南的规定付费。如果您使用 AWS Lambda 提供的默认的服务密钥,则无需付费。

如果您将默认 KMS 服务密钥用于 Lambda,则无需向您的函数执行角色中添加额外的 IAM 权限 – 您的角色无需更改便会自动生效。如果您提供自己的(自定义)KMS 密钥,则需要向您的执行角色中添加 kms:Decrypt。此外,要创建和更新 Lambda 函数的用户必须拥有使用 KMS 密钥的权限。有关 KMS 密钥的更多信息,请参阅 AWS KMS 中的使用密钥策略

注意

AWS Lambda 授权您的函数通过用户授权使用默认 KMS 密钥,即在您将该角色分配给函数时添加的密钥。如果您删除角色,并创建一个具有相同名称的新角色,您需要刷新该角色的授权。通过向函数重新分配角色来刷新授权。

存储敏感信息

如上一节所述,当您部署 Lambda 函数时,您指定的所有环境变量都会在部署过程中 (而不是之后) 默认加密。然后当调用相应函数时,AWS Lambda 会自动解密这些环境变量。如果您需要在环境变量中存储敏感信息,我们强烈建议您先加密此类信息,然后再部署您的 Lambda 函数。

幸运的是,Lambda 控制台提供了加密帮助程序,这些程序可利用 AWS Key Management Service 将敏感信息存储为 Ciphertext,从而让您更轻松地完成这一操作。此外,Lambda 控制台还提供解密帮助程序代码,用于解密上述信息,以便您在 Lambda 函数代码中使用。有关更多信息,请参阅使用环境变量创建 Lambda 函数以存储敏感信息

错误情形

如果您的函数配置超过 4KB,或您使用 AWS Lambda 预留的环境变量密钥,您的更新或创建操作将因配置错误而无法执行。在执行期间,环境变量的加密/解密可能会失败。如果 AWS Lambda 因 AWS KMS 服务异常而无法解密环境变量,AWS KMS 将返回一条异常消息,说明错误状况以及可以采取哪些补救措施来解决此问题。这些都会记录到您在 Amazon CloudWatch Logs 的函数日志流中。例如,如果系统禁用了您用于访问环境变量的 KMS 密钥,您将看到以下错误:

Lambda was unable to configure access to your environment variables because the KMS key used is disabled. Please check your KMS key settings.