-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtemplate.yaml
176 lines (160 loc) · 5.21 KB
/
template.yaml
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
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: A micro-service used to subscribe/unsubscribe and send out my newsletter.
Parameters:
PhoneNumber:
Type: String
Description: "Who to text when you get a new subscriber"
Mappings:
BatchSizeMap:
ProcessBatchSize:
Value: 1
Resources:
# Newsletter Subscribe / Unsubscribe Resources
NewsletterSubscribeFunction:
Type: AWS::Serverless::Function
Properties:
Handler: src/handlers/NewsletterSubscribeFunction.handler
Runtime: nodejs12.x
MemorySize: 128
Timeout: 60
Description: A Lambda function that subscribes users to my newsletter
Environment:
Variables:
API_ID_PARAM_NAME: !Sub '${AWS::Region}-${AWS::AccountId}-prod-newsletterapiid'
SUB_TABLE_NAME: SubscribersTable
PHONE_NUMBER: !Ref PhoneNumber
Policies:
- AWSLambdaBasicExecutionRole
- AmazonSESFullAccess
- AmazonSNSFullAccess
- AmazonSSMFullAccess
- AmazonDynamoDBFullAccess
Events:
ApiEvent:
Type: Api
Properties:
Path: /subscribe
Method: POST
RestApiId:
Ref: NewsletterApi
NewsletterUnsubscribeFunction:
Type: AWS::Serverless::Function
Properties:
Handler: src/handlers/NewsletterUnsubscribeFunction.handler
Runtime: nodejs12.x
MemorySize: 128
Timeout: 60
Description: A Lambda function that unsubscribes users from my newsletter
Environment:
Variables:
API_ID_PARAM_NAME: !Sub '${AWS::Region}-${AWS::AccountId}-prod-newsletterapiid'
SUB_TABLE_NAME: SubscribersTable
Policies:
- AWSLambdaBasicExecutionRole
- AmazonSESFullAccess
- AmazonSNSFullAccess
- AmazonDynamoDBFullAccess
Events:
ApiEvent:
Type: Api
Properties:
Path: /unsubscribe/{email}/{unsubLink}
Method: GET
RestApiId:
Ref: NewsletterApi
NewsletterApiIDParameter:
Type: AWS::SSM::Parameter
DependsOn: NewsletterApi
Properties:
Name: !Sub '${AWS::Region}-${AWS::AccountId}-prod-newsletterapiid'
Type: String
Value: !GetAtt NewsletterApi.RootResourceId
Description: Store the RestAPI ID
NewsletterApi:
Type: AWS::Serverless::Api
Properties:
StageName: prod
# Shared Resources
SubscribersTable:
Type: AWS::DynamoDB::Table
Properties:
AttributeDefinitions:
- AttributeName: "email"
AttributeType: "S"
BillingMode: PAY_PER_REQUEST
KeySchema:
- AttributeName: "email"
KeyType: "HASH"
PointInTimeRecoverySpecification:
PointInTimeRecoveryEnabled: true
TableName: SubscribersTable
# Newsletter Sender Resources
GenerateSendNewsletterRequestsFunction:
Type: AWS::Serverless::Function
Properties:
Handler: src/handlers/GenerateSendNewsletterRequestsFunction.handler
Runtime: nodejs12.x
MemorySize: 256
Timeout: 120
Description: A Lambda function that gathers all of my subscribers then creates a send reques and places it on a queue
Environment:
Variables:
API_ID_PARAM_NAME: !Sub '${AWS::Region}-${AWS::AccountId}-prod-newsletterapiid'
QUEUE_NAME: !GetAtt NewsletterSendRequestsQueue.QueueName
SUB_TABLE_NAME: SubscribersTable
BATCH_SIZE: !FindInMap [BatchSizeMap, ProcessBatchSize, Value]
SEND_TEST: '<EMAIL_TO_TEST_WITH>'
Policies:
- AmazonSESFullAccess
- AmazonDynamoDBFullAccess
- AWSStepFunctionsFullAccess
- AmazonSQSFullAccess
- AmazonSSMFullAccess
Events:
S3NewObjectEvent:
Type: S3
Properties:
Bucket: !Ref NewsLetterBucket
Events: s3:ObjectCreated:*
Filter:
S3Key:
Rules:
- Name: suffix
Value: ".html"
NewsletterSenderFunction:
Type: AWS::Serverless::Function
Properties:
Handler: src/handlers/NewsletterSenderFunction.handler
Runtime: nodejs12.x
MemorySize: 512
Timeout: 120
Description: A Lambda function that processes Newsletter Send Requests from SQS
Environment:
Variables:
BUCKET_NAME: !Sub '${AWS::Region}-${AWS::AccountId}-prod-newsletterbucket'
ACTUALLY_SEND_EMAILS: 'false'
Policies:
- S3ReadPolicy:
BucketName: !Ref NewsLetterBucket
- AmazonSQSFullAccess
- AWSLambdaBasicExecutionRole
- AmazonDynamoDBFullAccess
- AmazonSESFullAccess
Events:
SQSEvent:
Type: SQS
Properties:
Queue: !GetAtt NewsletterSendRequestsQueue.Arn
BatchSize: !FindInMap [BatchSizeMap, ProcessBatchSize, Value]
Enabled: true
NewsLetterBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub '${AWS::Region}-${AWS::AccountId}-prod-newsletterbucket'
NewsletterSendRequestsQueue:
Type: AWS::SQS::Queue
Properties:
QueueName: NewsletterSendRequestsQueue
ReceiveMessageWaitTimeSeconds: 20
VisibilityTimeout: 120