如何检测我是否在 AWS Lambda 环境中 运行?

How to detect if I'm running in AWS Lambda environment?

我想检测我的代码是否在 AWS Lambda 环境中执行。有没有好的、有记录的方法来做到这一点?

目前我依赖于 Exploring The AWS Lambda Runtime Environment 博客 post 中描述的环境变量 LAMBDA_TASK_ROOT 的存在,感觉不对。

处理此问题的最佳方法是自行跟踪。特别是,您可以在 lambda 入口点之后设置全局变量或环境变量。例如,在 node.js:

exports.handler = function(event, context, callback) {
    process.env['LAMBDA_ENV'] = 'true';
    ...
};

有一个 process.env 属性 你可以检查:

const isLambda = !!process.env.LAMBDA_TASK_ROOT;

if (isLambda) {
  // You're on AWS Lambda
} else {
  // Local or elsewhere
}

发现归功于 watson/is-lambda

编辑:官方 AWS 来源(具有更多环境变量)https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html

如果您使用的是 Lambda 环境 faker,比如优秀的 lambda-local 包,请检查例如LAMBDA_TASK_ROOT 不起作用。

改用这个:

const isLambda = Boolean(process.env['AWS_LAMBDA_FUNCTION_NAME']);

如果您想检测您的代码是本地 Lambda (aws-sam-cli) 还是真正的 Lambda 中的 运行,可以使用 AWS_SAM_LOCAL environment variable.

function isRunningLocalLambda() {
    return process.env.AWS_SAM_LOCAL === 'true';
}

使用Serverless Framework在本地调用函数时,可以检查IS_LOCAL环境变量:

const isRunningLocally = () => process.env.IS_LOCAL === 'true'

我真的用

const isAWSLambda = process.env.PWD?.startsWith(
  "/var/task"
);

我会建议一些可能也可以在 Docker 容器中工作的东西。有一个 Lambda 环境变量列表 (https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html),但其中许多不一定与该上下文相关。但是,AWS_LAMBDA_FUNCTION_NAME 似乎是通用的。即使在基于 Docker 的处理程序中,我也可以确认变量是 exposed/defined。