You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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控制台的「函数配置」-「环境变量」中确认变量是否成功注入。

内容的提问来源于stack exchange,提问作者user2919910

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 19:18:20