AWS Lambda环境变量在.NET代码中读取为空的排查求助
从你贴的代码和截图来看,你已经在Lambda控制台配置了环境变量,但用System.Environment.GetEnvironmentVariable获取时返回空,CloudWatch日志也证实了这一点。我之前也碰到过一模一样的情况,给你几个实用的排查方向:
先确认是否同步了配置:你修改完环境变量后,有没有重新部署函数或者触发一次新的执行?Lambda的执行环境是容器化的,旧容器会缓存之前的配置,新的环境变量要等新容器启动才会加载。最简单的验证方法是手动触发一次函数,或者重新上传你的.NET代码包,确保新配置生效。
核对变量名称的大小写:Lambda默认运行在Linux环境下,环境变量是严格区分大小写的!你代码里写的是
"AuthenticationHeaderKey",一定要和Lambda控制台里的变量名完全一致——包括每个字母的大小写,比如不能写成authenticationheaderkey或者AuthenticationHeaderkey,差一个大小写都拿不到值。检查代码拼写是否正确:仔细对比代码里的变量名和控制台配置,有没有少写、多写字母,或者符号错误?比如把
AuthenticationHeaderKey写成AuthenticationHeaderKeys这种小失误很容易被忽略,却会导致拿不到值。确认是否启用了KMS加密:如果你的环境变量开启了AWS KMS加密,那你的Lambda执行角色必须拥有对应的
kms:Decrypt权限。如果权限不足,环境变量就会返回空。你可以去IAM控制台查看Lambda角色的权限策略,看看有没有包含KMS密钥的解密权限。试试用Lambda上下文获取变量:虽然
System.Environment.GetEnvironmentVariable的写法本身没问题,但你可以换个方式验证,通过ILambdaContext的EnvironmentVariables属性获取:var authenticationHeaderKey = context.EnvironmentVariables["AuthenticationHeaderKey"];如果这样能拿到值,那可能是
System.Environment的加载时机问题;如果还是空,那基本可以确定是配置或者权限的问题。
另外,你可以在日志里打印一个AWS自带的环境变量(比如AWS_REGION),看看能不能拿到值:
LambdaLogger.Log("AWS_REGION: " + System.Environment.GetEnvironmentVariable("AWS_REGION"));
如果自带变量也为空,那可能是Lambda执行环境的异常;如果自带变量能拿到,那就是自定义变量的配置有问题。
内容的提问来源于stack exchange,提问作者Ajit Goel

