Skip to content

feat(event_handler): add support to VPC Lattice payload v2 #3153

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 32 commits into from
Oct 5, 2023
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
1cf5073
updated vpc lattice v2 event
stephenbawks Oct 1, 2023
7530760
updating base
stephenbawks Oct 1, 2023
93cd96e
remove line break
stephenbawks Oct 1, 2023
b1f9e96
more details return type for request context
stephenbawks Oct 1, 2023
c1dbf1b
couple doc string updates
stephenbawks Oct 1, 2023
680c9be
copy pasta
stephenbawks Oct 1, 2023
7f25990
Merge branch 'develop' into vpcLatticeV2
leandrodamascena Oct 2, 2023
3d996ac
ruff work
stephenbawks Oct 2, 2023
d278441
Merge branch 'develop' into vpcLatticeV2
leandrodamascena Oct 2, 2023
0c48df9
small tweak
stephenbawks Oct 2, 2023
27e3761
adding model 2 tests
stephenbawks Oct 3, 2023
86a7ff5
starting docs
stephenbawks Oct 3, 2023
687f45e
couple more tests
stephenbawks Oct 3, 2023
5e47060
words matter
stephenbawks Oct 3, 2023
32463a1
missing line break
stephenbawks Oct 3, 2023
77ee153
ruff do work
stephenbawks Oct 3, 2023
2dc9b0d
Adding more fields in parser
leandrodamascena Oct 3, 2023
fb07a96
pull and add examples
stephenbawks Oct 3, 2023
47c12d4
where did you go
stephenbawks Oct 3, 2023
54f9363
Adding more fields in parser and event source
leandrodamascena Oct 3, 2023
d9c702b
Convert microsecond to milisecond - need to review
leandrodamascena Oct 3, 2023
54d6a2f
additional tests
stephenbawks Oct 4, 2023
0c5cf99
fix path
stephenbawks Oct 4, 2023
2b50d13
Wording
leandrodamascena Oct 4, 2023
46c0009
Adding VPC Lattice v2 resolver
leandrodamascena Oct 4, 2023
157556f
Fixing resolver
leandrodamascena Oct 4, 2023
5c56a43
Fixing mypy
leandrodamascena Oct 4, 2023
072987e
Merge branch 'develop' into vpcLatticeV2
leandrodamascena Oct 4, 2023
144df4b
Event Handler documentation
leandrodamascena Oct 4, 2023
ce1f307
Preserving timeEpoch field + adding a new one
leandrodamascena Oct 4, 2023
8bd48c1
Merge branch 'develop' into vpcLatticeV2
leandrodamascena Oct 5, 2023
f9a3ed0
Merge branch 'develop' into vpcLatticeV2
leandrodamascena Oct 5, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions aws_lambda_powertools/event_handler/api_gateway.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
APIGatewayProxyEventV2,
LambdaFunctionUrlEvent,
VPCLatticeEvent,
VPCLatticeEventV2
)
from aws_lambda_powertools.utilities.data_classes.common import BaseProxyEvent
from aws_lambda_powertools.utilities.typing import LambdaContext
Expand All @@ -43,6 +44,7 @@ class ProxyEventType(Enum):
APIGatewayProxyEventV2 = "APIGatewayProxyEventV2"
ALBEvent = "ALBEvent"
VPCLatticeEvent = "VPCLatticeEvent"
VPCLatticeEventV2 = "VPCLatticeEventV2"
LambdaFunctionUrlEvent = "LambdaFunctionUrlEvent"


Expand Down Expand Up @@ -999,6 +1001,9 @@ def _to_proxy_event(self, event: Dict) -> BaseProxyEvent:
if self._proxy_type == ProxyEventType.VPCLatticeEvent:
logger.debug("Converting event to VPC Lattice contract")
return VPCLatticeEvent(event)
if self._proxy_type == ProxyEventType.VPCLatticeEventV2:
logger.debug("Converting event to VPC Lattice contract")
return VPCLatticeEventV2(event)
logger.debug("Converting event to ALB contract")
return ALBEvent(event)

Expand Down
3 changes: 2 additions & 1 deletion aws_lambda_powertools/utilities/data_classes/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
from .ses_event import SESEvent
from .sns_event import SNSEvent
from .sqs_event import SQSEvent
from .vpc_lattice import VPCLatticeEvent
from .vpc_lattice import VPCLatticeEvent, VPCLatticeEventV2

__all__ = [
"APIGatewayProxyEvent",
Expand Down Expand Up @@ -56,4 +56,5 @@
"event_source",
"AWSConfigRuleEvent",
"VPCLatticeEvent",
"VPCLatticeEventV2",
]
127 changes: 127 additions & 0 deletions aws_lambda_powertools/utilities/data_classes/vpc_lattice.py
Original file line number Diff line number Diff line change
Expand Up @@ -140,3 +140,130 @@ def get_header_value(
def header_serializer(self) -> BaseHeadersSerializer:
# When using the VPC Lattice integration, we have multiple HTTP Headers.
return HttpApiHeadersSerializer()


class VPCLatticeEventV2(BaseProxyEvent):
@property
def version(self) -> str:
"""The VPC Lattice v2 Event version"""
return self["version"]

@property
def path(self) -> str:
"""The VPC Lattice v2 Event path"""
return self["path"]

@property
def method(self) -> str:
"""The VPC Lattice v2 Event method used. Valid values include: DELETE, GET, HEAD, OPTIONS, PATCH, POST, and PUT."""
return self["method"]

@property
def headers(self) -> Dict[str, str]:
"""The VPC Lattice v2 Event headers."""
return self["headers"]

@property
def query_string_parameters(self) -> Dict[str, str]:
"""The request query string parameters."""
return self["query_string_parameters"]

@property
def body(self) -> str:
"""The VPC Lattice v2 Event body."""
return self["body"]

@property
def is_base64_encoded(self) -> bool:
"""A boolean flag to indicate if the applicable request payload is Base64-encode"""
return self["is_base64_encoded"]

@property
def request_context(self) -> Dict[str, str]:
"""he VPC Lattice v2 Event request context."""
return self["requestContext"]

@property
def json_body(self) -> Any:
"""Parses the submitted body as json"""
if self._json_data is None:
self._json_data = self._json_deserializer(self.decoded_body)
return self._json_data

@property
def decoded_body(self) -> str:
"""Dynamically base64 decode body as a str"""
body: str = self["body"]
if self.is_base64_encoded:
return base64_decode(body)
return body

def get_query_string_value(self, name: str, default_value: Optional[str] = None) -> Optional[str]:
"""Get query string value by name

Parameters
----------
name: str
Query string parameter name
default_value: str, optional
Default value if no value was found by name
Returns
-------
str, optional
Query string parameter value
"""
return get_query_string_value(
query_string_parameters=self.query_string_parameters,
name=name,
default_value=default_value,
)

@overload
def get_header_value(
self,
name: str,
default_value: str,
case_sensitive: Optional[bool] = False,
) -> str:
...

@overload
def get_header_value(
self,
name: str,
default_value: Optional[str] = None,
case_sensitive: Optional[bool] = False,
) -> Optional[str]:
...

def get_header_value(
self,
name: str,
default_value: Optional[str] = None,
case_sensitive: Optional[bool] = False,
) -> Optional[str]:
"""Get header value by name

Parameters
----------
name: str
Header name
default_value: str, optional
Default value if no value was found by name
case_sensitive: bool
Whether to use a case-sensitive look up
Returns
-------
str, optional
Header value
"""
return get_header_value(
headers=self.headers,
name=name,
default_value=default_value,
case_sensitive=case_sensitive,
)

def header_serializer(self) -> BaseHeadersSerializer:
# When using the VPC Lattice integration, we have multiple HTTP Headers.
return HttpApiHeadersSerializer()