2
2
from typing import Dict , List , Literal , Optional , Union
3
3
from typing import Type as TypingType
4
4
5
- from pydantic import BaseModel , model_validator
5
+ from pydantic import BaseModel , Field , model_validator
6
6
from pydantic .networks import HttpUrl
7
7
8
8
9
9
class SnsMsgAttributeModel (BaseModel ):
10
- Type : str
11
- Value : str
10
+ Type : str = Field (
11
+ description = "The data type of the message attribute (String, Number, Binary, or custom data type)." ,
12
+ examples = ["String" , "Number" , "Binary" , "String.Array" , "Number.Array" ],
13
+ )
14
+ Value : str = Field (
15
+ description = "The value of the message attribute. All values are strings, even for Number types." ,
16
+ examples = ["TestString" , "123" , "TestBinary" , '["item1", "item2"]' ],
17
+ )
12
18
13
19
14
20
class SnsNotificationModel (BaseModel ):
15
- Subject : Optional [str ] = None
16
- TopicArn : str
17
- UnsubscribeUrl : HttpUrl
18
- Type : Literal ["Notification" ]
19
- MessageAttributes : Optional [Dict [str , SnsMsgAttributeModel ]] = None
20
- Message : Union [str , TypingType [BaseModel ]]
21
- MessageId : str
22
- SigningCertUrl : Optional [HttpUrl ] = None # NOTE: FIFO opt-in removes attribute
23
- Signature : Optional [str ] = None # NOTE: FIFO opt-in removes attribute
24
- Timestamp : datetime
25
- SignatureVersion : Optional [str ] = None # NOTE: FIFO opt-in removes attribute
21
+ Subject : Optional [str ] = Field (
22
+ default = None ,
23
+ description = "The subject parameter provided when the notification was published to the topic." ,
24
+ examples = ["TestInvoke" , "Alert: System maintenance" , "Order Confirmation" , None ],
25
+ )
26
+ TopicArn : str = Field (
27
+ description = "The Amazon Resource Name (ARN) for the topic that this message was published to." ,
28
+ examples = [
29
+ "arn:aws:sns:us-east-2:123456789012:sns-lambda" ,
30
+ "arn:aws:sns:eu-west-1:123456789012:notification-topic" ,
31
+ "arn:aws:sns:us-west-2:123456789012:alerts.fifo" ,
32
+ ],
33
+ )
34
+ UnsubscribeUrl : HttpUrl = Field (
35
+ description = "A URL that you can use to unsubscribe the endpoint from this topic." ,
36
+ examples = [
37
+ (
38
+ "https://sns.us-east-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn= \
39
+ arn:aws:sns:us-east-2:123456789012:test-lambda:21be56ed-a058-49f5-8c98-aedd2564c486"
40
+ ),
41
+ (
42
+ "https://sns.eu-west-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn= \
43
+ arn:aws:sns:eu-west-1:123456789012:notification-topic:abcd1234-5678-90ef-ghij-klmnopqrstuv"
44
+ ),
45
+ ],
46
+ )
47
+ Type : Literal ["Notification" ] = Field (
48
+ description = "The type of message. For Lambda triggers, this is always 'Notification'." ,
49
+ examples = ["Notification" ],
50
+ )
51
+ MessageAttributes : Optional [Dict [str , SnsMsgAttributeModel ]] = Field (
52
+ default = None ,
53
+ description = "User-defined message attributes as key-value pairs with type information." ,
54
+ examples = [
55
+ {"Test" : {"Type" : "String" , "Value" : "TestString" }},
56
+ {"priority" : {"Type" : "Number" , "Value" : "1" }, "env" : {"Type" : "String" , "Value" : "prod" }},
57
+ None ,
58
+ ],
59
+ )
60
+ Message : Union [str , TypingType [BaseModel ]] = Field (
61
+ description = "The message value specified when the notification was published to the topic." ,
62
+ examples = [
63
+ "Hello from SNS!" ,
64
+ '{"alert": "CPU usage above 80%", "instance": "i-1234567890abcdef0"}' ,
65
+ '{"order_id": 12345, "status": "confirmed", "total": 99.99}' ,
66
+ ],
67
+ )
68
+ MessageId : str = Field (
69
+ description = "A Universally Unique Identifier, unique for each message published." ,
70
+ examples = [
71
+ "95df01b4-ee98-5cb9-9903-4c221d41eb5e" ,
72
+ "da41e39f-ea4d-435a-b922-c6aae3915ebe" ,
73
+ "f3c8d4e2-1a2b-4c5d-9e8f-7g6h5i4j3k2l" ,
74
+ ],
75
+ )
76
+ SigningCertUrl : Optional [HttpUrl ] = Field (
77
+ default = None ,
78
+ description = (
79
+ "The URL to the certificate that was used to sign the message. "
80
+ "Not present for FIFO topics with content-based deduplication."
81
+ ),
82
+ examples = [
83
+ "https://sns.us-east-2.amazonaws.com/SimpleNotificationService-1234567890.pem" ,
84
+ "https://sns.eu-west-1.amazonaws.com/SimpleNotificationService-0987654321.pem" ,
85
+ None ,
86
+ ],
87
+ ) # NOTE: FIFO opt-in removes attribute
88
+ Signature : Optional [str ] = Field (
89
+ default = None ,
90
+ description = (
91
+ "Base64-encoded SHA1withRSA signature of the message. "
92
+ "Not present for FIFO topics with content-based deduplication."
93
+ ),
94
+ examples = [
95
+ "tcc6faL2yUC6dgZdmrwh1Y4cGa/ebXEkAi6RibDsvpi+tE/1+82j...65r==" ,
96
+ "EXAMPLEw6JRNwm1LFQL4ICB0bnXrdB8ClRMTQFPGBfHs...EXAMPLEw==" ,
97
+ None ,
98
+ ],
99
+ ) # NOTE: FIFO opt-in removes attribute
100
+ Timestamp : datetime = Field (
101
+ description = "The time (GMT) when the notification was published." ,
102
+ examples = [
103
+ "2019-01-02T12:45:07.000Z" ,
104
+ "2023-06-15T10:30:00.000Z" ,
105
+ "2023-12-25T18:45:30.123Z" ,
106
+ ],
107
+ )
108
+ SignatureVersion : Optional [str ] = Field (
109
+ default = None ,
110
+ description = (
111
+ "Version of the Amazon SNS signature used. Not present for FIFO topics with content-based deduplication."
112
+ ),
113
+ examples = ["1" , "2" , None ],
114
+ ) # NOTE: FIFO opt-in removes attribute
26
115
27
116
@model_validator (mode = "before" )
28
117
def check_sqs_protocol (cls , values ):
@@ -37,11 +126,28 @@ def check_sqs_protocol(cls, values):
37
126
38
127
39
128
class SnsRecordModel (BaseModel ):
40
- EventSource : Literal ["aws:sns" ]
41
- EventVersion : str
42
- EventSubscriptionArn : str
43
- Sns : SnsNotificationModel
129
+ EventSource : Literal ["aws:sns" ] = Field (
130
+ description = "The AWS service that invoked the function." ,
131
+ examples = ["aws:sns" ],
132
+ )
133
+ EventVersion : str = Field (
134
+ description = "The version of the event schema." ,
135
+ examples = ["1.0" , "2.0" ],
136
+ )
137
+ EventSubscriptionArn : str = Field (
138
+ description = "The Amazon Resource Name (ARN) of the subscription." ,
139
+ examples = [
140
+ "arn:aws:sns:us-east-2:123456789012:sns-lambda:21be56ed-a058-49f5-8c98-aedd2564c486" ,
141
+ "arn:aws:sns:eu-west-1:123456789012:notification-topic:abcd1234-5678-90ef-ghij-klmnopqrstuv" ,
142
+ ],
143
+ )
144
+ Sns : SnsNotificationModel = Field (
145
+ description = "The SNS message that triggered the Lambda function." ,
146
+ )
44
147
45
148
46
149
class SnsModel (BaseModel ):
47
- Records : List [SnsRecordModel ]
150
+ Records : List [SnsRecordModel ] = Field (
151
+ description = "A list of SNS message records included in the event." ,
152
+ examples = [[{"EventSource" : "aws:sns" , "Sns" : {"MessageId" : "95df01b4-ee98-5cb9-9903-4c221d41eb5e" }}]],
153
+ )
0 commit comments