使用 AWS Lambda 环境变量
您可以使用环境变量来调整函数的行为,而无需更新代码。环境变量是存储在函数的版本特定配置中的一对字符串。Lambda 运行时使环境变量可用于您的代码,并设置其他环境变量,这些变量包含有关函数和调用请求的信息。
为了提高数据库的安全性,建议您使用 AWS Secrets Manager 而不是环境变量来存储数据库凭证。有关更多信息,请参阅配置 Lambda 函数的数据库访问。
环境变量不会在调用函数之前计算。您定义的任何值都将被视为文字字符串,且不会被展开。在函数代码中执行变量估算。
配置环境变量
您可以在函数的未发布版本上定义环境变量。发布一个版本时,会锁定该版本的环境变量以及其他特定于版本的配置。
您可以通过定义键和值在函数上创建环境变量。您的函数使用键名来检索环境变量的值。
在 Lambda 控制台中设置环境变量
使用 API 配置环境变量
要使用 AWS CLI 或 AWS 开发工具包管理环境变量,请使用以下 API 操作。
以下示例在名为 my-function
的函数上设置两个环境变量。
aws lambda update-function-configuration --function-name my-function \ --environment "Variables={BUCKET=my-bucket,KEY=file.txt}"
使用 update-function-configuration
命令应用环境变量时,会替换 Variables
结构的整个内容。要在添加新环境变量时保留现有环境变量,请在请求中包含所有现有值。
要获取当前配置,请使用 get-function-configuration
命令。
aws lambda get-function-configuration --function-name my-function
您应看到以下输出:
{ "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", "Environment": { "Variables": { "BUCKET": "my-bucket", "KEY": "file.txt" } }, "RevisionId": "0894d3c1-2a3d-4d48-bf7f-abade99f3c15", ... }
为了确保在读取配置和更新配置之间的间隔时间内值不会更改,您可以将 get-function-configuration
输出中的修订 ID 作为参数传递给 update-function-configuration
。
要配置函数的加密密钥,请设置 KMSKeyARN
选项。
aws lambda update-function-configuration --function-name my-function \ --kms-key-arn arn:aws:kms:us-east-2:123456789012:key/055efbb4-xmpl-4336-ba9c-538c7d31f599
环境变量的示例场景
您可以使用环境变量来自定义测试环境和生产环境中的函数行为。例如,您可以创建两个具有相同代码但不同配置的函数。一个函数连接到测试数据库,另一个函数连接到生产数据库。在这种情况下,您可以使用环境变量告诉函数数据库的主机名和其他连接详细信息。
以下示例说明如何将数据库主机和数据库名称定义为环境变量。

如果希望测试环境生成比生产环境更多的调试信息,可以设置环境变量来配置测试环境使用更详细的日志记录或跟踪。
检索环境变量
要检索函数代码中的环境变量,请使用编程语言的标准方法。
Lambda 通过静态加密来安全地存储环境变量。您可以配置 Lambda 以使用不同的加密密钥、在客户端加密环境变量值或使用 AWS Secrets Manager 在 AWS CloudFormation 模板中设置环境变量。
已定义的运行时环境变量
Lambda 运行时会在初始化过程中设置多个环境变量。大多数环境变量提供有关函数或运行时的信息。这些环境变量的键是预留 的,无法在函数配置中设置。
预留环境变量
-
_HANDLER
– 函数上配置的处理程序位置。 -
_X_AMZN_TRACE_ID
– X-Ray 跟踪标头。 -
AWS_REGION
– 执行 Lambda 函数的 AWS 区域。 -
AWS_EXECUTION_ENV
– 运行时标识符,前缀为AWS_Lambda_
— 例如AWS_Lambda_java8
。 -
AWS_LAMBDA_FUNCTION_NAME
– 函数的名称。 -
AWS_LAMBDA_FUNCTION_MEMORY_SIZE
– 对函数可用的内存量(以 MB 为单位)。 -
AWS_LAMBDA_FUNCTION_VERSION
– 要执行的函数的版本。AWS_LAMBDA_INITIALIZATION_TYPE
– 函数的初始化类型,即on-demand
或provisioned-concurrency
。有关信息,请参阅配置预配置并发。 -
AWS_LAMBDA_LOG_GROUP_NAME
,AWS_LAMBDA_LOG_STREAM_NAME
– 函数的 Amazon CloudWatch Logs 组和流的名称。 -
AWS_ACCESS_KEY_ID
、AWS_SECRET_ACCESS_KEY
、AWS_SESSION_TOKEN
– 从函数的执行角色中获取的访问密钥。 -
LAMBDA_TASK_ROOT
– 您的 Lambda 函数代码的路径。 -
LAMBDA_RUNTIME_DIR
– 运行时库的路径。 -
TZ
– 环境的时区 (UTC
)。执行环境使用 NTP 同步系统时钟。
以下附加环境变量并非预留,可以在函数配置中扩展。
非预留环境变量
-
LANG
– 运行时的区域设置 (en_US.UTF-8
)。 -
PATH
– 执行路径 (/usr/local/bin:/usr/bin/:/bin:/opt/bin
)。 -
LD_LIBRARY_PATH
– 系统库路径 (/lib64:/usr/lib64:$LAMBDA_RUNTIME_DIR:$LAMBDA_RUNTIME_DIR/lib:$LAMBDA_TASK_ROOT:$LAMBDA_TASK_ROOT/lib:/opt/lib
)。 -
NODE_PATH
– (Node.js) Node.js 库路径 (/opt/nodejs/node12/node_modules/:/opt/nodejs/node_modules:$LAMBDA_RUNTIME_DIR/node_modules
)。 -
PYTHONPATH
–(Python 2.7、3.6、3.8)Python 库路径 ($LAMBDA_RUNTIME_DIR
)。 -
GEM_PATH
– (Ruby) Ruby 库路径 ($LAMBDA_TASK_ROOT/vendor/bundle/ruby/2.5.0:/opt/ruby/gems/2.5.0
)。 -
AWS_XRAY_CONTEXT_MISSING
– 对于 X-Ray 跟踪,Lambda 会将其设置为LOG_ERROR
,以避免从 X-Ray 开发工具包引发运行时错误。 -
AWS_XRAY_DAEMON_ADDRESS
– 对于 X-Ray 跟踪,为 X-Ray 守护程序的 IP 地址和端口。 -
AWS_LAMBDA_DOTNET_PREJIT
– 对于 .NET 3.1 运行时,请将此变量设置为启用或禁用 .NET 3.1 特定的运行时优化。值包括always
、never
和provisioned-concurrency
。有关信息,请参阅配置预配置并发。
显示的示例值反映了最新的运行时。特定变量或其值是否存在会因早先的运行时而异。
保护环境变量
Lambda 使用在您的账户中创建的密钥(AWS 托管客户主密钥 (CMK))对环境变量进行加密。此密钥的使用是免费的。您也可以选择提供您自己的密钥,以供 Lambda 使用,而不是使用默认密钥。
当您提供密钥时,只有您账户中有权访问密钥的用户才能查看或管理函数上的环境变量。您的组织还可能有内部或外部要求,以管理用于加密的密钥并控制其轮换时间。
使用客户托管 CMK
-
打开 Lambda 控制台的“函数”页面
。 -
选择函数。
-
选择 Configuration (配置),然后选择 Environment variables (环境变量)。
-
在 Environment variables (环境变量) 下,选择 Edit (编辑)。
-
展开 Encryption configuration (加密配置)。
-
选择 Use a customer master key (使用客户主密钥)。
-
选择您的客户托管 CMK。
-
选择保存。
客户托管的 CMK 产生标准 AWS KMS 费用
您的用户或函数的执行角色不需要 AWS KMS 权限,即可使用默认加密密钥。要使用客户托管 CMK,您需要具有使用密钥的权限。Lambda 使用您的权限创建密钥授予。这允许 Lambda 使用它进行加密。
-
kms:ListAliases
– 在 Lambda 控制台中查看密钥。 -
kms:CreateGrant
kms:Encrypt
– 在函数上配置客户托管 CMK。 -
kms:Decrypt
– 查看和管理使用客户托管的 CMK 加密的环境变量。
您可以从您的用户账户或从密钥的基于资源的权限策略获取这些权限。ListAliases
由 Lambda 的托管策略提供。密钥策略将剩余权限授予密钥用户组中的用户。
没有 Decrypt
权限的用户仍然可以管理函数,但无法在 Lambda 控制台中查看环境变量或管理它们。要防止用户查看环境变量,请向用户的权限添加一条语句,该语句拒绝访问默认密钥、客户托管密钥或所有密钥。
例 IAM 策略 – 按密钥 ARN 拒绝访问
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Deny", "Action": [ "kms:Decrypt" ], "Resource": "arn:aws:kms:us-east-2:123456789012:key/3be10e2d-xmpl-4be4-bc9d-0405a71945cc" } ] }

有关管理密钥权限的详细信息,请参阅在 AWS KMS 中使用密钥策略。
您还可以在将环境变量值发送到 Lambda 之前在客户端对其进行加密,并在函数代码中对其解密。这会掩盖 Lambda 控制台和 API 输出中的密钥值,即使对于有权使用密钥的用户也是如此。在您的代码中,您可以从环境中检索加密的值并使用 AWS KMS API 对其进行解密。
在客户端加密环境变量
-
打开 Lambda 控制台的“函数”页面
。 -
选择函数。
-
选择 Configuration (配置),然后选择 Environment variables (环境变量)。
-
在 Environment variables (环境变量) 下,选择 Edit (编辑)。
-
展开 Encryption configuration (加密配置)。
-
选择 Enable helpers for encryption in transit (为传输过程中的加密启用帮助程序)。
-
选择变量旁边的 Encrypt (加密) 以加密其值。
-
选择保存。
当您使用控制台加密帮助程序时,您的函数需要通过执行角色调用 kms:Decrypt
API 操作的权限。
要查看函数语言的示例代码,请选择环境变量旁边的 Code (代码)。示例代码显示如何检索函数中的环境变量并解密其值。
另一种选择是将密码存储在 AWS Secrets Manager 密钥中。您可以在 AWS CloudFormation 模板中引用密钥来设置数据库上的密码。您还可以在 Lambda 函数上设置环境变量的值。有关示例,请参阅下一节。
示例代码和模板
本指南 GitHub 存储库中的示例应用程序演示了在函数代码和 AWS CloudFormation 模板中使用环境变量的情况。
示例应用程序