【问题标题】:Set or modify an AWS Lambda environment variable with Python boto3使用 Python boto3 设置或修改 AWS Lambda 环境变量
【发布时间】:2017-05-09 07:16:36
【问题描述】:

我想在我的 lambda 脚本中设置或修改环境变量。 我需要为脚本的下一次调用保存一个值。 例如,我使用 aws lambda 控制台创建了一个环境变量,并且不设置值。之后我试试这个:

import boto3
import os

if os.environ['ENV_VAR']:
   print(os.environ['ENV_VAR'])
os.environ['ENV_VAR'] = "new value"

在这种情况下,我的值​​将永远不会打印。 我试过了:

os.putenv()

但结果相同。 你知道为什么没有设置这个环境变量吗?

谢谢!

【问题讨论】:

    标签: python-2.7 amazon-web-services environment-variables aws-lambda boto3


    【解决方案1】:

    考虑使用 boto3 lambda 命令 update_function_configuration 来更新环境变量。

    response = client.update_function_configuration(
                FunctionName='test-env-var',
                Environment={
                    'Variables': {
                        'env_var': 'hello'
                    }
                }
            )
    

    【讨论】:

    • 但是这段代码正在删除旧的环境变量。有什么解决办法吗?
    • 环境变量被认为是传递静态参数的有效机制。在表面上高度并发的运行时环境(例如 lambda)中,每次执行都为每个后续执行更新配置参数没有任何意义,因为它不考虑并发性。这将是“最后一次写入获胜”。此外,这会破坏您的 Lambda 性能,因为更新函数配置不会特别快。而且,它会使您缓存的任何 lambda 运行时无效。这不是解决这个问题的正确方法
    【解决方案2】:

    我需要为我的脚本的下一次调用保存一个值。

    这不是环境变量的工作方式,也不是 lambda 的工作方式。不能在父进程的子进程中设置环境变量——进程只能在自己的和子进程环境中设置环境变量。

    如果您在 shell 中设置环境变量,这可能会让您感到困惑,但在这种情况下,shell 是长时间运行的进程设置并获取您的环境变量,而不是它调用的程序。

    考虑这个例子:

    from os import environ
    print environ['A']
    environ['A'] = "Set from python"
    print environ['A']
    

    这只会为自己设置 env A。如果多次运行,A 的初始值始终是 shell 的值,而不是 python 设置的值。

    $ export A="set from bash"
    $ python t.py
    set from bash
    Set from python
    $ python t.py
    set from bash
    Set from python
    

    此外,即使不是这种情况,它也不能与 aws lambda 一起可靠地工作。 Lambda 在当时可用的任何计算资源上运行您的代码;它通常会为频繁执行的函数缓存运行时,因此在这些情况下,可以将数据写入文件系统以保存它。但如果下一次调用没有在该运行时运行,您的数据将会丢失。

    根据您的需要,您希望将数据保存在 lambda 之外。一些明显的选项是:写入 s3、写入 dynamo 或写入 sqs。下一次调用将从该位置读取,从而实现所需的结果。

    【讨论】:

    • 如果将值传递给脚本的下一次执行可以“尽力而为”,则可以将数据存储在缓存的函数存储中。如果在下次执行时使用相同的缓存函数运行时,则该值将在那里。另一个并发调用将获得一个新的运行时并且不会具有该值。运行时也可能从 AWS lambda 的缓存中逐出,在这种情况下,该值也将消失。但对于尽力而为的缓存,这是一种非常高效且有效的机制。
    【解决方案3】:

    AWS Lambda 只执行具有给定输入集的代码。一旦执行,它会返回输出,仅此而已。如果您想为下一次调用保留输出,那么您可能需要将其存储在 DB 或 Queue 中,如 Dan 所说。我个人将 SQS 与向我发送有关当前状态的通知的 SNS 结合使用。您甚至可以将最终结果(如成功或失败)存储在 SQS 中,您可以将其用于下一个触发器。只是把选项扔在这里,其余的一切都取决于你的要求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-31
      • 2022-10-05
      • 2017-12-17
      • 1970-01-01
      • 2020-02-13
      • 2017-08-01
      • 2016-01-26
      • 1970-01-01
      相关资源
      最近更新 更多