我想在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()
但结果相同。 你知道为什么没有设置这个环境变量吗?
谢谢!
答案 0 :(得分:4)
考虑使用boto3 lambda命令update_function_configuration来更新环境变量。
response = client.update_function_configuration(
FunctionName='test-env-var',
Environment={
'Variables': {
'env_var': 'hello'
}
}
)
答案 1 :(得分:3)
我需要为下一次调用脚本保存一个值。
这不是环境变量的工作原理,也不是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,写入发电机,或写入sqs。下一次调用将从该位置读取,从而实现所需的结果。
答案 2 :(得分:1)
AWS Lambda只使用给定的输入集执行该段代码。一旦执行,它将返回输出,这就是全部。如果你想保留下次调用的输出,那么你可能需要将它存储在DB或Queue中,如Dan所说。我个人将SQS与SNS结合使用,向我发送有关当前状态的通知。您甚至可以在SQS中存储最终结果,例如成功或失败,您可以将其用于下一次触发。只是在这里抛出选项,休息都取决于你的要求。