forked from aws-powertools/powertools-lambda-python
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvpc_lattice.py
194 lines (152 loc) · 6.21 KB
/
vpc_lattice.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
from __future__ import annotations
from functools import cached_property
from typing import Any
from aws_lambda_powertools.shared.headers_serializer import (
BaseHeadersSerializer,
HttpApiHeadersSerializer,
)
from aws_lambda_powertools.utilities.data_classes.common import (
BaseProxyEvent,
CaseInsensitiveDict,
DictWrapper,
)
from aws_lambda_powertools.utilities.data_classes.shared_functions import base64_decode
class VPCLatticeEventBase(BaseProxyEvent):
# is_base64_encoded and path are inherited from BaseProxyEvent class.
@property
def body(self) -> str:
"""The VPC Lattice body."""
return self["body"]
@cached_property
def json_body(self) -> Any:
"""Parses the submitted body as json"""
return self._json_deserializer(self.decoded_body)
@property
def headers(self) -> dict[str, str]:
"""The VPC Lattice event headers."""
return CaseInsensitiveDict(self["headers"])
@property
def decoded_body(self) -> str:
"""Dynamically base64 decode body as a str"""
body: str = self["body"]
return base64_decode(body) if self.is_base64_encoded else body
@property
def method(self) -> str:
"""The VPC Lattice method used. Valid values include: DELETE, GET, HEAD, OPTIONS, PATCH, POST, and PUT."""
return self["method"]
@property
def http_method(self) -> str:
"""The HTTP method used. Valid values include: DELETE, GET, HEAD, OPTIONS, PATCH, POST, and PUT."""
return self["method"]
def header_serializer(self) -> BaseHeadersSerializer:
# When using the VPC Lattice integration, we have multiple HTTP Headers.
return HttpApiHeadersSerializer()
class VPCLatticeEvent(VPCLatticeEventBase):
@property
def raw_path(self) -> str:
"""The raw VPC Lattice request path."""
return self["raw_path"]
@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"]
# VPCLattice event has no path field
# Added here for consistency with the BaseProxyEvent class
@property
def path(self) -> str:
return self["raw_path"]
@property
def query_string_parameters(self) -> dict[str, str]:
"""The request query string parameters."""
return self["query_string_parameters"]
@cached_property
def resolved_headers_field(self) -> dict[str, Any]:
return CaseInsensitiveDict((k, v.split(",") if "," in v else v) for k, v in self.headers.items())
class vpcLatticeEventV2Identity(DictWrapper):
@property
def source_vpc_arn(self) -> str | None:
"""The VPC Lattice v2 Event requestContext Identity sourceVpcArn"""
return self.get("sourceVpcArn")
@property
def get_type(self) -> str | None:
"""The VPC Lattice v2 Event requestContext Identity type"""
return self.get("type")
@property
def principal(self) -> str | None:
"""The VPC Lattice v2 Event requestContext principal"""
return self.get("principal")
@property
def principal_org_id(self) -> str | None:
"""The VPC Lattice v2 Event requestContext principalOrgID"""
return self.get("principalOrgID")
@property
def session_name(self) -> str | None:
"""The VPC Lattice v2 Event requestContext sessionName"""
return self.get("sessionName")
@property
def x509_subject_cn(self) -> str | None:
"""The VPC Lattice v2 Event requestContext X509SubjectCn"""
return self.get("X509SubjectCn")
@property
def x509_issuer_ou(self) -> str | None:
"""The VPC Lattice v2 Event requestContext X509IssuerOu"""
return self.get("X509IssuerOu")
@property
def x509_san_dns(self) -> str | None:
"""The VPC Lattice v2 Event requestContext X509SanDns"""
return self.get("x509SanDns")
@property
def x509_san_uri(self) -> str | None:
"""The VPC Lattice v2 Event requestContext X509SanUri"""
return self.get("X509SanUri")
@property
def x509_san_name_cn(self) -> str | None:
"""The VPC Lattice v2 Event requestContext X509SanNameCn"""
return self.get("X509SanNameCn")
class vpcLatticeEventV2RequestContext(DictWrapper):
@property
def service_network_arn(self) -> str:
"""The VPC Lattice v2 Event requestContext serviceNetworkArn"""
return self["serviceNetworkArn"]
@property
def service_arn(self) -> str:
"""The VPC Lattice v2 Event requestContext serviceArn"""
return self["serviceArn"]
@property
def target_group_arn(self) -> str:
"""The VPC Lattice v2 Event requestContext targetGroupArn"""
return self["targetGroupArn"]
@property
def identity(self) -> vpcLatticeEventV2Identity:
"""The VPC Lattice v2 Event requestContext identity"""
return vpcLatticeEventV2Identity(self["identity"])
@property
def region(self) -> str:
"""The VPC Lattice v2 Event requestContext serviceNetworkArn"""
return self["region"]
@property
def time_epoch(self) -> float:
"""The VPC Lattice v2 Event requestContext timeEpoch"""
return self["timeEpoch"]
class VPCLatticeEventV2(VPCLatticeEventBase):
@property
def version(self) -> str:
"""The VPC Lattice v2 Event version"""
return self["version"]
@property
def request_context(self) -> vpcLatticeEventV2RequestContext:
"""The VPC Lattice v2 Event request context."""
return vpcLatticeEventV2RequestContext(self["requestContext"])
@cached_property
def query_string_parameters(self) -> dict[str, str]:
"""The request query string parameters.
For VPC Lattice V2, the queryStringParameters will contain a dict[str, list[str]]
so to keep compatibility with existing utilities, we merge all the values with a comma.
"""
params = self.get("queryStringParameters") or {}
return {k: ",".join(v) for k, v in params.items()}
@property
def resolved_headers_field(self) -> dict[str, str]:
if self.headers is not None:
return {key.lower(): value for key, value in self.headers.items()}
return {}