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

时间:2016-12-23 15:16:51

标签: 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()

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

谢谢!

3 个答案:

答案 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中存储最终结果,例如成功或失败,您可以将其用于下一次触发。只是在这里抛出选项,休息都取决于你的要求。