使用 AWS Lambda 环境变量 - AWS Lambda

使用 AWS Lambda 环境变量

您可以使用环境变量来调整函数的行为,而无需更新代码。环境变量是存储在函数的版本特定配置中的一对字符串。Lambda 运行时使环境变量可用于您的代码,并设置其他环境变量,这些变量包含有关函数和调用请求的信息。

注意

为了提高数据库的安全性,建议您使用 AWS Secrets Manager 而不是环境变量来存储数据库凭证。有关更多信息,请参阅配置 Lambda 函数的数据库访问

通过指定键和值,您可以在函数的未发布版本上设置环境变量。发布一个版本时,会锁定该版本的环境变量以及其他特定于版本的配置

在 Lambda 控制台中设置环境变量

  1. 打开 Lambda 控制台 函数页面

  2. 选择函数。

  3. Environment variables (环境变量) 下,选择 Edit (编辑)

  4. 选择 Add environment variable (添加环境变量)

  5. 输入密钥和值。

    要求

    • 密钥以字母开头,并且至少为两个字符。

    • 键仅包含字母、数字和下划线字符 (_)。

    • 键不是 Lambda 预留的值。

    • 所有环境变量的总大小不超过 4 KB。

  6. 选择保存

使用环境变量将环境特定的设置传递给您的代码。例如,您可以有两个具有相同代码但不同配置的函数。一个函数连接到测试数据库,另一个函数连接到生产数据库。在这种情况下,您可以使用环境变量告诉函数数据库的主机名和其他连接详细信息。

以下示例说明如何将数据库主机和数据库名称定义为环境变量。


      Lambda 控制台中的环境变量。

如果希望测试环境生成比生产环境更多的调试信息,可以设置环境变量来配置测试环境使用更详细的日志记录或跟踪。

注意

环境变量不会在调用函数之前计算。您定义的任何值都将被视为文字字符串,且不会被展开。在函数代码中执行变量计算。

要检索函数代码中的环境变量,请使用编程语言的标准方法。

Node.js
let region = process.env.AWS_REGION
Python
import os region = os.environ['AWS_REGION']
Ruby
region = ENV["AWS_REGION"]
Java
String region = System.getenv("AWS_REGION");
Go
var region = os.Getenv("AWS_REGION")
C#
string region = Environment.GetEnvironmentVariable("AWS_REGION");
PowerShell
$region = $env:AWS_REGION

Lambda 通过静态加密来安全地存储环境变量。您可以配置 Lambda 以使用不同的加密密钥、在客户端加密环境变量值或使用 AWS Secrets Manager 在 AWS CloudFormation 模板中设置环境变量。

运行时环境变量

Lambda 运行时会在初始化过程中设置多个环境变量。大多数环境变量提供有关函数或运行时的信息。这些环境变量的键是预留 的,无法在函数配置中设置。

预留环境变量

  • _HANDLER – 函数上配置的处理程序位置。

  • _X_AMZN_TRACE_IDX-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_LOG_GROUP_NAMEAWS_LAMBDA_LOG_STREAM_NAME – 函数的 Amazon CloudWatch Logs 组和流的名称。

  • AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN – 从函数的执行角色中获取的访问密钥。

  • AWS_LAMBDA_RUNTIME_API – (自定义运行时运行时 API 的主机和端口。

  • 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 地址和端口。

显示的示例值反映了最新的运行时。特定变量或其值是否存在会因早先的运行时而异。

保护环境变量

Lambda 使用在您的账户中创建的密钥(AWS 托管客户主密钥 (CMK))对环境变量进行加密。此密钥的使用是免费的。您也可以选择提供您自己的密钥,以供 Lambda 使用,而不是使用默认密钥。

当您提供密钥时,只有您账户中有权访问密钥的用户才能查看或管理函数上的环境变量。您的组织还可能有内部或外部要求,以管理用于加密的密钥并控制其轮换时间。

使用客户托管 CMK

  1. 打开 Lambda 控制台 函数页面

  2. 选择函数。

  3. Environment variables (环境变量) 下,选择 Edit (编辑)

  4. 展开 Encryption configuration (加密配置)

  5. 选择 Use a customer master key (使用客户主密钥)

  6. 选择您的客户托管 CMK。

  7. 选择保存

客户托管的 CMK 产生标准 AWS KMS 费用

您的用户或函数的执行角色不需要 AWS KMS 权限,即可使用默认加密密钥。要使用客户托管 CMK,您需要具有使用密钥的权限。Lambda 使用您的权限创建密钥授予。这允许 Lambda 使用它进行加密。

  • kms:ListAliases – 在 Lambda 控制台中查看密钥。

  • kms:CreateGrant kms:Encrypt – 在函数上配置客户托管 CMK。

  • kms:Decrypt – 查看和管理使用客户托管的 CMK 加密的环境变量。

您可以从您的用户账户或从密钥的基于资源的权限策略获取这些权限。ListAliasesLambda 的托管策略提供。密钥策略将剩余权限授予密钥用户组中的用户。

没有 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" } ] }

        在 Lambda 控制台中没有解密权限的用户的错误消息。

有关管理密钥权限的详细信息,请参阅在 AWS KMS 中使用密钥策略

您还可以在将环境变量值发送到 Lambda 之前在客户端对其进行加密,并在函数代码中对其解密。这会掩盖 Lambda 控制台和 API 输出中的密钥值,即使对于有权使用密钥的用户也是如此。在您的代码中,您可以从环境中检索加密的值并使用 AWS KMS API 对其进行解密。

在客户端加密环境变量

  1. 打开 Lambda 控制台 函数页面

  2. 选择函数。

  3. Environment variables (环境变量) 下,选择 Edit (编辑)

  4. 展开 Encryption configuration (加密配置)

  5. 选择 Enable helpers for encryption in transit (为传输过程中的加密启用帮助程序)

  6. 选择变量旁边的 Encrypt (加密) 以加密其值。

  7. 选择保存

注意

当您使用控制台加密帮助程序时,您的函数需要通过执行角色调用 kms:Decrypt API 操作的权限。

要查看函数语言的示例代码,请选择环境变量旁边的 Code (代码)。示例代码显示如何检索函数中的环境变量并解密其值。

另一种选择是将密码存储在 AWS Secrets Manager 密钥中。您可以在 AWS CloudFormation 模板中引用密钥来设置数据库上的密码。您还可以在 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

示例代码和模板

本指南 GitHub 存储库中的示例应用程序演示了在函数代码和 AWS CloudFormation 模板中使用环境变量的情况。

示例应用程序

  • Blank 函数 – 在同一模板中创建函数和 Amazon SNS 主题。将主题名称传递给环境变量中的函数。读取代码中的环境变量(多种语言)。

  • RDS MySQL – 在一个模板中使用存储在 Secrets Manager 中的密码创建 VPC 和 Amazon RDS 数据库实例。在应用程序模板中,从 VPC 堆栈导入数据库详细信息,从 Secrets Manager 读取密码,然后将所有连接配置传递给环境变量中的函数。