Skip to content

Commit 955e385

Browse files
feat(parser): add support for API Gateway Lambda authorizer events (#4718)
* Adding Authorizer parser * Make pydantic v2 happy
1 parent 7b98667 commit 955e385

File tree

8 files changed

+74
-5
lines changed

8 files changed

+74
-5
lines changed

aws_lambda_powertools/utilities/parser/models/__init__.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,15 @@
44

55
from .alb import AlbModel, AlbRequestContext, AlbRequestContextData
66
from .apigw import (
7+
ApiGatewayAuthorizerRequest,
8+
ApiGatewayAuthorizerToken,
79
APIGatewayEventAuthorizer,
810
APIGatewayEventIdentity,
911
APIGatewayEventRequestContext,
1012
APIGatewayProxyEventModel,
1113
)
1214
from .apigwv2 import (
15+
ApiGatewayAuthorizerRequestV2,
1316
APIGatewayProxyEventV2Model,
1417
RequestContextV2,
1518
RequestContextV2Authorizer,
@@ -105,6 +108,7 @@
105108

106109
__all__ = [
107110
"APIGatewayProxyEventV2Model",
111+
"ApiGatewayAuthorizerRequestV2",
108112
"RequestContextV2",
109113
"RequestContextV2Http",
110114
"RequestContextV2Authorizer",
@@ -165,6 +169,8 @@
165169
"APIGatewayEventRequestContext",
166170
"APIGatewayEventAuthorizer",
167171
"APIGatewayEventIdentity",
172+
"ApiGatewayAuthorizerRequest",
173+
"ApiGatewayAuthorizerToken",
168174
"KafkaSelfManagedEventModel",
169175
"KafkaRecordModel",
170176
"KafkaMskEventModel",

aws_lambda_powertools/utilities/parser/models/apigw.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,5 +90,16 @@ class APIGatewayProxyEventModel(BaseModel):
9090
requestContext: APIGatewayEventRequestContext
9191
pathParameters: Optional[Dict[str, str]] = None
9292
stageVariables: Optional[Dict[str, str]] = None
93-
isBase64Encoded: bool
93+
isBase64Encoded: Optional[bool] = None
9494
body: Optional[Union[str, Type[BaseModel]]] = None
95+
96+
97+
class ApiGatewayAuthorizerToken(BaseModel):
98+
type: Literal["TOKEN"]
99+
methodArn: str
100+
authorizationToken: str
101+
102+
103+
class ApiGatewayAuthorizerRequest(APIGatewayProxyEventModel):
104+
type: Literal["REQUEST"]
105+
methodArn: str

aws_lambda_powertools/utilities/parser/models/apigwv2.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,4 +68,10 @@ class APIGatewayProxyEventV2Model(BaseModel):
6868
stageVariables: Optional[Dict[str, str]] = None
6969
requestContext: RequestContextV2
7070
body: Optional[Union[str, Type[BaseModel]]] = None
71-
isBase64Encoded: bool
71+
isBase64Encoded: Optional[bool] = None
72+
73+
74+
class ApiGatewayAuthorizerRequestV2(APIGatewayProxyEventV2Model):
75+
type: Literal["REQUEST"]
76+
routeArn: str
77+
identitySource: List[str]

docs/utilities/parser.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,10 @@ Parser comes with the following built-in models:
177177
| ------------------------------------------- | ------------------------------------------------------------------------------------- |
178178
| **AlbModel** | Lambda Event Source payload for Amazon Application Load Balancer |
179179
| **APIGatewayProxyEventModel** | Lambda Event Source payload for Amazon API Gateway |
180+
| **ApiGatewayAuthorizerToken** | Lambda Event Source payload for Amazon API Gateway Lambda Authorizer with Token |
181+
| **ApiGatewayAuthorizerRequest** | Lambda Event Source payload for Amazon API Gateway Lambda Authorizer with Request |
180182
| **APIGatewayProxyEventV2Model** | Lambda Event Source payload for Amazon API Gateway v2 payload |
183+
| **ApiGatewayAuthorizerRequestV2** | Lambda Event Source payload for Amazon API Gateway v2 Lambda Authorizer |
181184
| **BedrockAgentEventModel** | Lambda Event Source payload for Bedrock Agents |
182185
| **CloudFormationCustomResourceCreateModel** | Lambda Event Source payload for AWS CloudFormation `CREATE` operation |
183186
| **CloudFormationCustomResourceUpdateModel** | Lambda Event Source payload for AWS CloudFormation `UPDATE` operation |

tests/events/apiGatewayAuthorizerRequestEvent.json

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,18 @@
1717
"CloudFront-Is-Mobile-Viewer": "false",
1818
"User-Agent": "..."
1919
},
20+
"multiValueHeaders": {
21+
"Header1": [
22+
"value1"
23+
],
24+
"Origin": [
25+
"https://aws.amazon.com"
26+
],
27+
"Header2": [
28+
"value1",
29+
"value2"
30+
]
31+
},
2032
"queryStringParameters": {
2133
"QueryString1": "queryValue1"
2234
},
@@ -42,7 +54,7 @@
4254
"cognitoIdentityPoolId": null,
4355
"principalOrgId": null,
4456
"apiKey": "...",
45-
"sourceIp": "...",
57+
"sourceIp": "test-invoke-source-ip",
4658
"user": null,
4759
"userAgent": "PostmanRuntime/7.28.3",
4860
"userArn": null,

tests/events/apiGatewayAuthorizerV2Event.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
"method": "POST",
3939
"path": "/merchants",
4040
"protocol": "HTTP/1.1",
41-
"sourceIp": "IP",
41+
"sourceIp": "10.10.10.10",
4242
"userAgent": "agent"
4343
},
4444
"requestId": "id",

tests/unit/parser/_pydantic/test_apigw.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@
22
from pydantic import ValidationError
33

44
from aws_lambda_powertools.utilities.parser import envelopes, parse
5-
from aws_lambda_powertools.utilities.parser.models import APIGatewayProxyEventModel
5+
from aws_lambda_powertools.utilities.parser.models import (
6+
ApiGatewayAuthorizerRequest,
7+
ApiGatewayAuthorizerToken,
8+
APIGatewayProxyEventModel,
9+
)
610
from tests.functional.utils import load_event
711
from tests.unit.parser._pydantic.schemas import MyApiGatewayBusiness
812

@@ -148,3 +152,20 @@ def test_apigw_event_empty_body():
148152
event = load_event("apiGatewayProxyEvent.json")
149153
event["body"] = None
150154
parse(event=event, model=APIGatewayProxyEventModel)
155+
156+
157+
def test_apigw_event_authorizer_token():
158+
raw_event = load_event("apiGatewayAuthorizerTokenEvent.json")
159+
parsed_event: ApiGatewayAuthorizerToken = ApiGatewayAuthorizerToken(**raw_event)
160+
161+
assert parsed_event.type == raw_event["type"]
162+
assert parsed_event.methodArn == raw_event["methodArn"]
163+
assert parsed_event.authorizationToken == raw_event["authorizationToken"]
164+
165+
166+
def test_apigw_event_authorizer_event():
167+
raw_event = load_event("apiGatewayAuthorizerRequestEvent.json")
168+
parsed_event: ApiGatewayAuthorizerRequest = ApiGatewayAuthorizerRequest(**raw_event)
169+
170+
assert parsed_event.type == raw_event["type"]
171+
assert parsed_event.methodArn == raw_event["methodArn"]

tests/unit/parser/_pydantic/test_apigwv2.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from aws_lambda_powertools.utilities.parser import envelopes, parse
22
from aws_lambda_powertools.utilities.parser.models import (
3+
ApiGatewayAuthorizerRequestV2,
34
APIGatewayProxyEventV2Model,
45
RequestContextV2,
56
RequestContextV2Authorizer,
@@ -120,3 +121,12 @@ def test_apigw_event_empty_query_strings():
120121
raw_event["rawQueryString"] = ""
121122
raw_event.pop("queryStringParameters") # API GW v2 removes certain keys when no data is passed
122123
parse(event=raw_event, model=APIGatewayProxyEventV2Model)
124+
125+
126+
def test_apigw_v2_request_authorizer():
127+
raw_event = load_event("apiGatewayAuthorizerV2Event.json")
128+
parsed_event: ApiGatewayAuthorizerRequestV2 = ApiGatewayAuthorizerRequestV2(**raw_event)
129+
130+
assert parsed_event.type == raw_event["type"]
131+
assert parsed_event.identitySource == raw_event["identitySource"]
132+
assert parsed_event.routeArn == raw_event["routeArn"]

0 commit comments

Comments
 (0)