Serverless Framework useDotenv在AWS无法加载.env文件问题排查
问题
我在serverless.yml中配置了useDotenv: true,但部署到AWS环境后无法加载.env文件。
我的serverless.yml配置如下:
org: xyz app: route-learner service: route-learner-cron frameworkVersion: '3' useDotenv: true provider: name: aws runtime: python3.8 stage: ${opt:stage, 'dev'} functions: extract_route: handler: src.functions.extract_route.run events: # Invoke Lambda function at every 5th minute. - schedule: rate: cron(5,15,25,35,45,55 * * * ? *) vpc: securityGroupIds: - ... subnetIds: - ... plugins: - serverless-python-requirements custom: pythonRequirements: dockerizePip: true
根目录下存在.env.prod文件,内容:
DB_URI=my_db_url DB_VERBOSE=True
我使用命令serverless deploy --stage prod --verbose部署函数,调用时出现以下错误:
[ERROR] KeyError: 'DB_URI' Traceback (most recent call last): File "/var/task/serverless_sdk/__init__.py", line 144, in wrapped_handler return user_handler(event, context) File "/var/task/s_extract_route.py", line 25, in error_handler raise e File "/var/task/s_extract_route.py", line 20, in <module> user_handler = serverless_sdk.get_user_handler('src.functions.extract_route.run') File "/var/task/serverless_sdk/__init__.py", line 56, in get_user_handler user_module = import_module(user_module_name) File "/var/lang/lib/python3.8/importlib/__init__.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1014, in _gcd_import File "<frozen importlib._bootstrap>", line 991, in _find_and_load File "<frozen importlib._bootstrap>", line 961, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "<frozen importlib._bootstrap>", line 1014, in _gcd_import File "<frozen importlib._bootstrap>", line 991, in _find_and_load File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 671, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 843, in exec_module File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "/var/task/src/functions/__init__.py", line 8, in <module> from src.db import engine File "/var/task/src/db.py", line 4, in <module> DATABASE_URI = os.environ['DB_URI'] File "/var/lang/lib/python3.8/os.py", line 675, in __getitem__ raise KeyError(key) from None [ERROR] KeyError: 'DB_URI' Traceback (most recent call last): File "/var/task/serverless_sdk/__init__.py", line 144, in wrapped_handler return user_handler(event, context) File "/var/task/s_extract_route.py", line 25, in error_handler raise e File "/var/task/s_extract_route.py", line 20, in <module> user_handler = serverless_sdk.get_user_handler('src.functions.extract_route.run') File "/var/task/serverless_sdk/__init__.py", line 56, in get_user_handler user_module = import_module(user_module_name) File "/var/lang/lib/python3.8/importlib/__init__.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1014, in _gcd_import File "<frozen importlib._bootstrap>", line 991, in _find_and_load File "<frozen importlib._bootstrap>", line 961, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "<frozen importlib._bootstrap>", line 1014, in _gcd_import File "<frozen importlib._bootstrap>", line 991, in _find_and_load File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 671, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 843, in exec_module File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "/var/task/src/functions/__init__.py", line 8, in <module> from src.db import engine File "/var/task/src/db.py", line 4, in <module> DATABASE_URI = os.environ['DB_URI'] File "/var/lang/lib/python3.8/os.py", line 675, in __getitem__ raise KeyError(key) from None
请问我的serverless配置中缺少了什么?
解答
核心问题:
useDotenv: true仅负责在本地加载.env文件,不会自动将.env中的变量注入到AWS Lambda的运行环境变量里,必须显式配置映射关系。修复方案:
在serverless.yml的provider块下添加environment配置,将.env中的变量映射到Lambda环境变量:provider: name: aws runtime: python3.8 stage: ${opt:stage, 'dev'} environment: DB_URI: ${env:DB_URI} DB_VERBOSE: ${env:DB_VERBOSE}部署时,因为你指定了
--stage prod,Serverless Framework会自动加载.env.prod文件(已开启useDotenv),变量会被正确读取并注入到Lambda中。额外提示:
- 若.env变量较多,可使用
${env:*}批量导入,但生产环境的敏感数据(如数据库密码)不建议存放在.env中,应改用AWS Secrets Manager或Parameter Store管理。 - 部署完成后,可在AWS Lambda控制台的「函数配置」-「环境变量」中确认变量是否成功注入。
- 若.env变量较多,可使用
内容的提问来源于stack exchange,提问作者user2919910
相关产品推荐
相关产品推荐

