【发布时间】:2021-03-24 00:11:48
【问题描述】:
我正在用 pytest 测试我的 lambda。我的 lambda GetDevicesFunction 使用位于 utils_layer/python 目录中的共享模块 aurora 中的方法连接到数据库。数据库连接的参数来自 template.yaml。当我运行sam build && sam local invoke 时一切正常,但是当我运行我的 pytest 时,环境变量似乎没有从我的模板中提取出来。这是预期的还是我错过了什么?
这是我的项目...
# project structure
├── __init__.py
├── get_devices
│ ├── __init__.py
│ ├── app.py
│ ├── requirements.txt
├── template.yaml
├── tests
│ ├── __init__.py
│ └── unit
│ ├── __init__.py
│ └── test_handler.py
└── utils_layer
├── __init__.py
├── python
│ ├── __init__.py
│ ├── aurora.py
│ ├── pg8000
# template.yaml
Globals:
Function:
Runtime: python3.8
MemorySize: 256
Timeout: 60
Layers:
- !Ref UtilsLayer
Environment:
Variables:
DATABASE_NAME: !FindInMap [ResourcesName, !Ref MyEnvironment, databaseName]
DATABASE_HOST: !FindInMap [ResourcesName, !Ref MyEnvironment, databaseHost]
DATABASE_PORT: !Ref DatabasePort
DATABASE_USER: !FindInMap [ResourcesName, !Ref MyEnvironment, databaseUser]
DATABASE_PASSWORD: !FindInMap [ResourcesName, !Ref MyEnvironment, databasePassword]
ENVIRONMENT: !Ref MyEnvironment
Mappings:
ResourcesName:
dev:
databaseHost: <db_host>
databaseName: <db_name>
databaseUser: <db_user>
databasePassword: <db_password>
Parameters:
MyEnvironment:
Type: String
Default: dev
AllowedValues:
- dev
- staging
- prod
Resources:
GetDevicesFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: get_devices/
Handler: app.lambda_handler
Events:
GetDevicesApiEvent:
Type: Api
Properties:
Path: /devices
Method: GET
UtilsLayer:
Type: AWS::Serverless::LayerVersion
Properties:
Description: Utils layer
ContentUri: utils_layer/
CompatibleRuntimes:
- python3.8
RetentionPolicy: Delete
# aurora.py
import pg8000
db_host = os.environ.get('DATABASE_HOST')
db_port = os.environ.get('DATABASE_PORT')
db_name = os.environ.get('DATABASE_NAME')
db_user = os.environ.get('DATABASE_USER')
db_password = os.environ.get('DATABASE_PASSWORD')
def make_conn():
conn = None
try:
conn = pg8000.connect(
database=db_name,
user=db_user,
password=db_password,
host=db_host
)
except Exception as e:
print(f'Connection error: {e}')
return conn
# test_handler.py
import pytest
from get_devices import app
def test_lambda_handler(apigw_event, mocker):
ret = app.lambda_handler(apigw_event, "")
data = ret['body']['data']
assert ret["statusCode"] == 200
assert len(data) > 0
任何关于如何从我的模板中提取环境变量的建议将不胜感激。
【问题讨论】:
-
目前无法从您的模板文件中获取它们(您可以提交功能请求/错误)。相反,将您的环境变量放在一个 json 文件中,然后使用
--env-vars PATH选项。
标签: python aws-lambda pytest aws-sam