Python 2.7 使用Python boto3设置或修改AWS Lambda环境变量

Python 2.7 使用Python boto3设置或修改AWS Lambda环境变量,python-2.7,amazon-web-services,environment-variables,aws-lambda,boto3,Python 2.7,Amazon Web Services,Environment Variables,Aws Lambda,Boto3,我想在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() 但结果是

我想在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()
但结果是一样的。 您知道为什么不设置此环境变量吗

谢谢大家!

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

这不是环境变量的工作方式,也不是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仅使用给定的输入集执行代码段。一旦执行,它将返回输出,仅此而已。如果您想为下一次调用保留输出,那么您可能需要像Dan所说的那样将其存储在DB或队列中。我个人将SQS与SNS结合使用,向我发送有关当前状态的通知。您甚至可以将最终结果(如成功或失败)存储在SQS中,用于下一个触发器。只需在这里抛出选项,其余的都取决于您的需求。

考虑使用boto3 lambda命令,update\u function\u configuration来更新环境变量

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

但这段代码正在删除旧的环境变量。环境变量被理解为传递静态参数的有效机制。在表面上高度并发的运行时环境(如lambda)中,每次执行更新后续执行的配置参数没有任何意义,因为它不考虑并发性。这将是“最后一笔胜利”。此外,这将破坏Lambda性能,因为更新函数配置不会特别快。并且,它使任何缓存的lambda运行时无效。这不是解决此问题的正确方法。如果将值传递给脚本的下一次执行可以是“尽力而为”,则可以将数据存储在缓存函数存储器中。如果在下一次执行时使用相同的缓存函数运行时,则该值将存在。另一个并发调用将获得一个新的运行时,并且不具有该值。运行时也可能从AWS lambda的缓存中退出,在这种情况下,该值也将消失。但对于尽力而为的缓存,这是一种非常高效的机制。