如何在 AWS lambda 函数中检查 Python 应用程序是否为 运行?

How to check if Python app is running within AWS lambda function?

我有一个连接到数据库的 Python 应用程序,我希望数据库凭据在本地环境(用于测试)或 lambda 函数中 运行 时有所不同(用于生产)。

有什么方法可以从 Python 应用程序中检测到它 运行 在 lambda 函数中?

编辑 2:随着 Lambda 函数自定义运行时的引入,检查 AWS_LAMBDA_FUNCTION_NAME 环境变量可能会更好,如下所示:

os.environ.get("AWS_LAMBDA_FUNCTION_NAME") is not None

编辑:参见其他答案,这是一个更好的解决方案:

os.environ.get("AWS_EXECUTION_ENV") is not None

原回答:

如何在处理函数中检查 context 对象是否存在? http://docs.aws.amazon.com/lambda/latest/dg/python-programming-model-handler-types.html

对于单元测试,我使用结构:

+ my_function/
+- __init__.py - empty files
+- code/
   +- __init__.py
   +- lambda_function.py
+- unittest/
   +- __init__.py
   +- tests.py - from ..code.lambda_function import *

当 运行使用 python -m my_function.unittest.tests 进行单元测试时,在 lambda_function.py 中 __name__ == 'my_function.code.lambda_function'。

当在 Lambda 运行ning 中 运行ning 时,__name__ == 'lambda_function'。请注意,如果 运行 和 python -m my_function.code.lambda_function 会得到相同的值,因此您将始终需要一个包装器。

由于 this bug 可以判断您是否 运行 在 AWS Lambda 函数中。

import multiprocessing

def on_lambda():
    try:
        multiprocessing.Pool()
        on_lambda = False
    except:
        on_lambda = True
    return on_lambda

我用它成功地实现了上下文敏感的指标报告。 希望他们不要很快修复错误!

这对我有用

os.environ.get("AWS_EXECUTION_ENV") is not None

编辑:我发现 context 对象的存在不足以进行此类检查,因为当 AWS lambda 函数中没有 运行 时,您可能会嘲笑它。再一次,你可能也在嘲笑 AWS_EXECUTION_ENV ...

这是我用的

import os

try:
  region = os.environ['AWS_REGION']
except:
  # Not in Lambda environment
  region = "us-east-1"