Closed
Description
What were you initially searching for in the docs?
Current layout to in the docs for routes across multiple files is not working.
- Tests out of the box on Pycharm does not work when you select a test to run
- Running the lambda products an error too
Is this related to an existing part of the documentation? Please share a link
- Sample Layout is not working.
If you have a proposed update, please share it here
- ✔️ Here is the working version tests and deployed - https://github.com/michaelbrewer/demo-multi-file-router/tree/working
- ✔️ Another example which works for http api - https://github.com/michaelbrewer/demo-multi-file-router/tree/working-http-api
- 🐛 Here is the one based on the docs, which does not work - https://github.com/michaelbrewer/demo-multi-file-router/tree/not-working
Screenshot of the tests working on VSCode (without the .env
)
Screenshot of the tests working in Pycharm (without any settings modifications)
The working layout
.
├── Makefile
├── Pipfile
├── Pipfile.lock
├── README.md
├── mypy.ini
├── src
│ ├── __init__.py
│ └── users
│ ├── __init__.py
│ ├── lambda_function.py
│ ├── requirements.txt
│ └── routers
│ ├── __init__.py
│ ├── health.py
│ └── users.py
├── template.yml
└── tests
├── __init__.py
└── functional
├── __init__.py
├── conftest.py
└── test_lambda_function.py
tamplate.yml
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Example service with multiple routes
Globals:
Function:
Timeout: 10
MemorySize: 512
Runtime: python3.9
Tracing: Active
Environment:
Variables:
LOG_LEVEL: INFO
POWERTOOLS_LOGGER_LOG_EVENT: true
POWERTOOLS_METRICS_NAMESPACE: MyServerlessApplication
POWERTOOLS_SERVICE_NAME: users
Resources:
UsersService:
Type: AWS::Serverless::Function
Properties:
Handler: users.lambda_function.lambda_handler
CodeUri: src
Layers:
# Latest version: https://awslabs.github.io/aws-lambda-powertools-python/latest/#lambda-layer
- !Sub arn:aws:lambda:${AWS::Region}:017000801446:layer:AWSLambdaPowertoolsPython:4
Events:
ByUser:
Type: Api
Properties:
Path: /users/{name}
Method: GET
AllUsers:
Type: Api
Properties:
Path: /users
Method: GET
HealthCheck:
Type: Api
Properties:
Path: /status
Method: GET
Outputs:
UsersApiEndpoint:
Description: "API Gateway endpoint URL for Prod environment for Users Function"
Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod"
AllUsersURL:
Description: "URL to fetch all registered users"
Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/users"
ByUserURL:
Description: "URL to retrieve details by user"
Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/users/test"
UsersServiceFunctionArn:
Description: "Users Lambda Function ARN"
Value: !GetAtt UsersService.Arn
lambda_function.py
from typing import Dict
from aws_lambda_powertools import Logger, Tracer
from aws_lambda_powertools.event_handler import ApiGatewayResolver
from aws_lambda_powertools.event_handler.api_gateway import ProxyEventType
from aws_lambda_powertools.logging.correlation_paths import APPLICATION_LOAD_BALANCER
from aws_lambda_powertools.utilities.typing import LambdaContext
from .routers import health, users
tracer = Tracer()
logger = Logger()
app = ApiGatewayResolver(proxy_type=ProxyEventType.APIGatewayProxyEvent)
app.include_router(health.router)
app.include_router(users.router)
@logger.inject_lambda_context(correlation_id_path=APPLICATION_LOAD_BALANCER)
@tracer.capture_lambda_handler
def lambda_handler(event: Dict, context: LambdaContext):
return app.resolve(event, context)
test_lambda_function.py
import json
from src.users import lambda_function
def test_lambda_handler(apigw_event, lambda_context):
ret = lambda_function.lambda_handler(apigw_event, lambda_context)
expected = json.dumps({"message": "hello universe"}, separators=(",", ":"))
assert ret["statusCode"] == 200
assert ret["body"] == expected