use*_*910 2 python environment-variables python-venv serverless-framework
我在 serverless.yml 上使用 useDotenv 属性,但它未在 AWS 中加载:
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
Run Code Online (Sandbox Code Playgroud)
我在根目录中有一个 .env.prod 文件,其中包含以下内容:
DB_URI=my_db_url
DB_VERBOSE=True
Run Code Online (Sandbox Code Playgroud)
我正在使用以下命令部署该功能:
serverless deploy --stage prod --verbose
Run Code Online (Sandbox Code Playgroud)
调用该函数后,我看到以下错误:
[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
Run Code Online (Sandbox Code Playgroud)
我的无服务器配置中缺少什么?
use*_*910 16
我发现了这个问题,该useDotenv属性只是将文件内容包含.env到 serverless.yml 文件中。所以,我仍然需要在模板内声明环境变量:
environment:
DB_URI: ${env:DB_URI}
DB_VERBOSE: ${env:DB_VERBOSE}
Run Code Online (Sandbox Code Playgroud)
该.env文件不包含在部署到 AWS 的最终包中。