-
Notifications
You must be signed in to change notification settings - Fork 0
/
serverless.yml
423 lines (408 loc) · 10.6 KB
/
serverless.yml
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
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
service: agents-api-v2
frameworkVersion: ">=1.11.0 <2.0.0"
custom:
env_vars: ${file(./config.${self:provider.stage}.yml)}
secret_env_vars: ${file(./config.${self:provider.stage}.secret.yml)}
# Node.js
provider:
name: aws
runtime: nodejs6.10
stage: ${opt:stage}
# Branch: develop -> stage 'dev'
# Branch: master -> stage 'prod'
region: ap-southeast-2
versionFunctions: false
timeout: 15
# Set up DynamoDB Permissions (example: https://github.com/serverless/examples/blob/master/aws-node-rest-api-with-dynamodb/serverless.yml)
# Unable to get these variables to load into ${env:VAR_NAME} using a file reference
# Therefore using custom variable in between.
environment:
DEBUG: '*'
APP_HOST: ${self:custom.env_vars.APP_HOST}
REDIS_HOST: ${self:custom.env_vars.REDIS_HOST}
REDIS_PORT: ${self:custom.env_vars.REDIS_PORT}
REDIS_TTL: ${self:custom.env_vars.REDIS_TTL}
REDIS_DISABLED: ${self:custom.env_vars.REDIS_DISABLED}
API_DOMAIN_CLIENT_ID: ${self:custom.secret_env_vars.API_DOMAIN_CLIENT_ID}
API_DOMAIN_CLIENT_SECRET: ${self:custom.secret_env_vars.API_DOMAIN_CLIENT_SECRET}
PASSWORD_SECRET_SALT: "SAMPLE"
DYNAMODB_USERS_TABLE: agentsUsers
DYNAMODB_PROPERTIES_TABLE: agentsProperties
DYNAMODB_PROPERTY_FEATURES_TABLE: agentsPropertyFeatures
DYNAMODB_PHOTOS_TABLE: agentsPhotos
DYNAMODB_storyS_TABLE: agentsstorys
DYNAMODB_AREAMAP_TABLE: agentsAreaMapping
DYNAMODB_PROPOSALS_TABLE: agentsProposals
DYNAMODB_MESSAGES_TABLE: agentsMessages
DYNAMODB_SALES_HISTORY_TABLE: ha_listing
DYNAMODB_NEARBY_POI_TABLE: agentsNearbyPOI
DYNAMODB_REVIEWS_TABLE: agentsReviews
SENDGRID_API_KEY: "hidden"
SLACK_WEBHOOK_URL: "https://hooks.slack.com/services/T31C80W69/B7013017U/hidden"
AWS_S3_UPLOAD_KEY: "hidden"
AWS_S3_UPLOAD_SECRET: "hidden"
AWS_S3_BUCKET: "unprocessed-images.agents.com.au"
AWS_S3_BUCKET_PROCESSED: "images.agents.com.au"
IMAGES_ORIGIN_URL: "http://images.agents.com.au"
TWILIO_API_KEY: "hidden"
PHONE_COUNTRY_CODE: "61"
SENDBIRD_APP_ID: "hidden"
GOOGLE_API_KEY: ${self:custom.secret_env_vars.GOOGLE_API_KEY}
# When deploying the service for the first time, comment out the vpc key, then
# deploy again with it included again.
vpc:
securityGroupIds:
- Fn::GetAtt: ServerlessSecurityGroup.GroupId #ServerlessElasticacheSecurityGroup.GroupId
subnetIds:
- ${self:custom.env_vars.SUBNET_ID_A}
- ${self:custom.env_vars.SUBNET_ID_B}
- ${self:custom.env_vars.SUBNET_ID_C}
iamRoleStatements:
# Allow the lambda function permission to create EINs, which is part of the
# AWSLambdaVPCAccessExecutionRole
- Effect: "Allow"
Action:
- "ec2:CreateNetworkInterface"
- "ec2:DescribeNetworkInterfaces"
- "ec2:DeleteNetworkInterface"
Resource: "*"
- Effect: Allow
Action:
- dynamodb:Query
- dynamodb:Scan
- dynamodb:GetItem
- dynamodb:PutItem
- dynamodb:UpdateItem
- dynamodb:DeleteItem
- dynamodb:BatchGetItem
Resource: "arn:aws:dynamodb:${self:provider.region}:*:table/*"
- Effect: Allow
Action:
- dynamodb:DescribeStream
- dynamodb:GetRecords
- dynamodb:GetShardIterator
- dynamodb:ListStreams
Resource: "arn:aws:dynamodb:${self:provider.region}:*:table/*/stream/*"
functions:
# Endpoints where HTTP get is not supported
getNotSupported:
handler: handler.getNotSupported
events:
- http:
path: /register
method: get
cors: true
- http:
path: /
method: get
cors: true
currentListings:
handler: lib/current-listings.get
description: Retrieve current listings by agent id
events:
- http:
path: /current-listings
method: get
cors: true
phoneVerification:
handler: lib/phone-verification.get
description: Phone verification from Twilio
events:
- http:
path: /phone-verification
method: get
cors: true
sendbirdWebhook:
handler: lib/sendbird-webhook.post
description: Sendbird webhook handler
events:
- http:
path: /sendbird-webhook
method: post
cors: true
interview:
handler: handler.interview
description: Interview GET count , set interview (POST)
events:
- http:
path: /interview
method: get
cors: true
- http:
path: /interview
method: post
cors: true
# Register Endpoint
register:
handler: handler.register2
timeout: 20
events:
- http:
path: /register
method: post
cors: true
passwordForgot:
handler: lib/password.generateToken
events:
- http:
path: /forgot-password
method: post
cors: true
passwordReset:
handler: lib/password.reset
events:
- http:
path: /reset-password
method: post
cors: true
passwordEmail:
handler: lib/password.mail
events:
- stream:
type: dynamodb
arn: arn:aws:dynamodb:ap-southeast-2:969899432009:table/agentsPasswordResetTokens/stream/2017-11-21T09:02:41.026
batchSize: 1
story:
handler: lib/story.list
events:
- http:
path: /story
method: get
cors: true
storyGet:
handler: lib/story.get
events:
- http:
path: /story/{id}
method: get
cors: true
request:
parameters:
paths:
id: true
storyStore:
handler: lib/story.store
events:
- http:
path: /story
method: post
cors: true
storyUpdate:
handler: lib/story.update
events:
- http:
path: /story/{id}
method: put
cors: true
request:
parameters:
paths:
id: true
storyChange:
handler: lib/story.update
events:
- http:
path: /story
method: patch
cors: true
storySendToAgents:
handler: lib/story-admin.sendstorysToAgents
events:
- http:
path: /story/send
method: post
cors: true
storyphoto:
handler: handler.storyphoto
events:
- http:
path: /story/addphoto
method: post
cors: true
proposal:
handler: lib/proposals.get
timeout: 30
events:
- http:
path: /proposals
method: get
cors: true
proposalStore:
handler: handler.proposal
timeout: 30
events:
- http:
path: /proposals
method: post
cors: true
shortlist:
handler: lib/shortlist.get
events:
- http:
path: /shortlist
method: get
cors: true
shortlistChange:
handler: handler.shortlist
events:
- http:
path: /shortlist
method: post
cors: true
- http:
path: /shortlist
method: delete
cors: true
sales:
handler: handler.sales
events:
- http:
path: /sales
method: get
cors: true
verifyemail:
handler: handler.verifyemail
events:
- http:
path: /verifyemail
method: get
cors: true
users:
handler: lib/users.list
events:
- http:
path: /users
method: get
cors: true
usersGet:
handler: lib/users.get
events:
- http:
path: /users/{id}
method: get
cors: true
request:
parameters:
paths:
id: true
usersCreate:
handler: handler.users
events:
- http:
path: /users
method: post
cors: true
testHttp:
handler: lib/test-http.testHttp
testHttpAuthentication:
handler: lib/test-http.testHttpAuthentication
userSlug:
handler: lib/slug.create
events:
- stream:
type: dynamodb
arn: arn:aws:dynamodb:ap-southeast-2:969899432009:table/agentsUsers/stream/2017-12-01T17:43:59.546
batchSize: 1
property:
handler: handler.property
events:
- http:
path: /property
method: get
cors: true
- http:
path: /property
method: post
cors: true
setphotostatus:
handler: handler.setphotostatus
events:
- http:
path: /setphotostatus
method: get
cors: true
verifytoken:
handler: handler.verifytoken
events:
- http:
path: /isloggedin
method: get
cors: true
profile:
handler: lib/profile.get
events:
- http:
path: /profile
method: get
cors: true
- http:
path: /profile/{id}
method: get
cors: true
request:
parameters:
paths:
id: true
review:
handler: handler.review
events:
- http:
path: /reviews
method: get
cors: true
- http:
path: /reviews
method: post
cors: true
agents:
handler: lib/agents.list
events:
- http:
path: /agents
method: get
cors: true
agentSearch:
handler: lib/agents.search
events:
- http:
path: /agents/search
method: get
cors: true
testRedis:
handler: lib/test-redis.test
timeout: 10
resources:
Resources:
ServerlessSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: SecurityGroup for Serverless Functions
VpcId: ${self:custom.env_vars.VPC_ID}
ServerlessElasticacheSubnetGroup:
Type: AWS::ElastiCache::SubnetGroup
Properties:
Description: "Cache Subnet Group ${self:provider.stage}"
SubnetIds:
- ${self:custom.env_vars.SUBNET_ID_A}
- ${self:custom.env_vars.SUBNET_ID_B}
- ${self:custom.env_vars.SUBNET_ID_C}
ServerlessElasticacheCluster:
Type: AWS::ElastiCache::CacheCluster
Properties:
AutoMinorVersionUpgrade: true
AZMode: single-az
Engine: redis
EngineVersion: 3.2.10
Port: 6379
CacheNodeType: cache.t2.micro
NumCacheNodes: 1
PreferredMaintenanceWindow: Sun:02:00-Sun:05:00
VpcSecurityGroupIds: [{"Fn::GetAtt": [ "ServerlessSecurityGroup", "GroupId"]}]
CacheSubnetGroupName:
Ref: ServerlessElasticacheSubnetGroup
package:
# individually: true
exclude:
- README.md
- .git/**
- docs/**