forked from aws-samples/aws-lex-web-ui
-
Notifications
You must be signed in to change notification settings - Fork 0
/
master.yaml
425 lines (388 loc) · 16.9 KB
/
master.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
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
424
AWSTemplateFormatVersion: 2010-09-09
Description: |
Master Lex Web UI CloudFormation template (v0.14.8)
It deploys:
- S3 buckets to host the web application
- CodeBuild project to build the configuration and deploy to S3
- Optional Lex Bot (based on OrderFlowers example)
- Optional Cognito Identity Pool for unauthenticated identities
- Optional Lambda function to delete S3 buckets
- CloudWatch Logs groups related to Lambda functions
- Associated IAM roles
Parameters:
BotName:
Description: >
Name of an existing Lex Bot to be used by the web ui.
This is an optional parameter. If left empty, a Bot based
on the OrderFlowers sample will be automatically created.
Type: String
Default: ''
MaxLength: 50
AllowedPattern: '(^$|^[a-zA-Z]+((_[a-zA-Z]+)*|([a-zA-Z]+_)*|_))'
ConstraintDescription: >
Must conform with the permitted Lex Bot name pattern.
BotAlias:
Description: >
Alias to use of an existing Lex Bot. By default this is '$LATEST'.
Use this default if the lex-web-ui should always use the most
recent version of the bot.
Type: String
Default: '$LATEST'
MinLength: 2
MaxLength: 50
AllowedPattern: '(^$|^[$a-zA-Z]+((_[$a-zA-Z]+)*|([$a-zA-Z]+_)*|_))'
ConstraintDescription: >
Must conform with the permitted Lex Alias name pattern.
BotNamePrefix:
Type: String
Description: >
Prefix to add to Lex resource names when using the sample bot.
Ignored if you provide your own bot. Must conform to the
permitted Lex Bot name syntax (alpha characters).
Default: WebUi
MinLength: 3
MaxLength: 32
AllowedPattern: '^[a-zA-Z\._]+$'
ConstraintDescription: >
Must conform with the permitted Lex Bot name pattern.
ShouldDeleteBot:
Type: String
Default: true
AllowedValues:
- true
- false
Description: >
If set to True, the Lex bot and associated resources will
be deleted when the stack is deleted. Otherwise, the bot
will be preserved. Only applies if the bot is created by
this stack.
EnableCognitoLogin:
Type: String
Default: false
AllowedValues:
- true
- false
Description: >
If set to True, a menu with a login action will be displayed
in the Lex Web Ui. This feature uses Cognito User Pools with
hosted login pages. After login, the menu will switch to logout.
CodeBuildName:
Type: String
Description: >
Name of the CodeBuild project to be created. Used to
configure and directly deploy the web app to S3. Must be
unique per region
Default: lex-web-ui
MinLength: 2
MaxLength: 255
AllowedPattern: '^[A-Za-z0-9][A-Za-z0-9\-_]{1,254}$'
ConstraintDescription: >
Should start with Alphanumeric. May contain alphanumeric, undescore
and dash.
WebAppParentOrigin:
Type: String
Description: >
Browser origin (e.g. http://mysite.example.com:8080)
of an existing site that is allowed to send/receive data
and events from the web ui in an iframe setup. This is an
optional parameter. If left empty, the sample parent page
will be hosted in the same S3 bucket as the iframe
Default: ''
AllowedPattern: '(^$|^https?://[\w\.-]+(:\d+)?$)'
ConstraintDescription: Empty or valid browser origin
WebAppPath:
Type: String
Default: '/parent.html'
Description: >
Path to the page hosting the sample WebApp. This parameter defaults
to parent.html which is used by the sample app created when hosting the
bot in a separate iframe. This path should be updated to reflect the
path to the default (home) page used by the WebAppParentOrigin.
This may be /index.html rather than the default.
CognitoIdentityPoolId:
Type: String
Description: >
Id of an existing Cognito Identity Pool. This is an optional
parameter. If left empty, a Cognito Identity Pool will be
automatically created. The pool ID is used by the web ui
to get AWS credentials for making calls to Lex and Polly.
Default: ''
AllowedPattern: '(^$|^[\w-]+:[0-9a-f-]+$)'
ConstraintDescription: Empty or a valid Cognito Identity Pool ID
CognitoIdentityPoolName:
Type: String
Description: >
Name of Cognito identity pool to be created to provide
AWS credentials to the web ui. Only used if the
CognitoIdentityPoolId parameter is left empty (default).
Default: Lex Web UI
MinLength: 1
MaxLength: 128
AllowedPattern: '^[\w ]+$'
ConstraintDescription: Alphanumeric and spaces.
CleanupBuckets:
Type: String
Default: true
AllowedValues:
- true
- false
Description: >
If set to True, buckets created for the Pipeline and to store the
web application will be deleted on CloudFormation stack delete.
If set to False, S3 buckets will be retained.
EnableMarkdownSupport:
Type: String
Default: true
AllowedValues:
- true
- false
Description: >
If set to True, enable optional Markdown formatting.
Warning: Improper use of the Markdown/html feature can open you up to a cross-site
scripting (XSS) attack from insecure Bots. Make sure you trust the Bot being used
by the LexWebUi.
ReInitSessionAttributesOnRestart:
Type: String
Default: false
AllowedValues:
- true
- false
Description: >
If set to True, session attributes sent on each request to Lex are reset. Use a value
of false, if session attributes need to be supported on subsequent Lex requests. The
default is false.
ShouldLoadIframeMinimized:
Type: String
Default: false
AllowedValues:
- true
- false
Description: >
If set to True and running embedded as an Iframe on a web page, minimize the
LexWebUi when first launched. If set to False, the Iframe will be maximized
on the hosting page.
ShowResponseCardTitle:
Type: String
Default: true
AllowedValues:
- true
- false
Description: >
If set to True, the ResponseCard title is displayed in the UI. When set to false,
a ResponseCard title is not displayed in the UI. Default is true. Note at the
present time this is a global setting. Should the UI need to display some form
of a title, use the optional sub-title property of a ResponseCard.
# Sub-templates and source artifacts are hosted in this bucket.
# The content of this bucket is maintained outside of this template
# by using the Makefile under the build directory of this project.
# See the README.md file for instructions on how to use your own bucket.
BootstrapBucket:
Type: String
Default: aws-bigdata-blog
Description: >
S3 bucket containing pre-staged nested templates and source artifacts
BootstrapPrefix:
Type: String
Default: artifacts/aws-lex-web-ui/artifacts
Description: >
S3 prefix where the templates and source are stored under
WebAppConfBotInitialText:
Type: String
Default: >
You can ask me for help ordering flowers. Just type "Buy
flowers" or click on the mic and say it.
Description: First bot message displayed in the chatbot UI
WebAppConfBotInitialSpeech:
Type: String
Default: Say 'Buy Flowers' to get started.
Description: >
Message spoken by bot when the microphone is first pressed in
a conversation
WebAppConfNegativeFeedback:
Type: String
Default: Thumbs down
Description: >
This optional parameter defines the message to be sent by the user upon pressing
a feedback button signaling a negative feedback.
If left empty feedback buttons will be disabled on the UI.
WebAppConfPositiveFeedback:
Type: String
Default: Thumbs up
Description: >
This optional parameter defines the message to be sent by the user upon pressing
a feedback button signaling a positive feedback.
If left empty feedback buttons will be disabled on the UI.
WebAppConfHelp:
Type: String
Default: Help
Description: >
This is an optional parameter, when defined with a value, a help button will display on the chat bot toolbar.
When pressed the button will send the entered string to the bot as a help message. If left empty
the help button will be disabled.
WebAppConfToolbarTitle:
Type: String
Default: Order Flowers
Description: Title displayed in the chatbot UI toolbar
Metadata:
AWS::CloudFormation::Interface:
ParameterGroups:
- Label:
default: Deployment Parameters
Parameters:
- CodeBuildName
- CleanupBuckets
- BootstrapBucket
- BootstrapPrefix
- Label:
default: Lex Bot Configuration Parameters
Parameters:
- BotName
- BotAlias
- BotNamePrefix
- ShouldDeleteBot
- EnableCognitoLogin
- EnableMarkdownSupport
- ReInitSessionAttributesOnRestart
- ShowResponseCardTitle
- Label:
default: Cognito Parameters
Parameters:
- CognitoIdentityPoolId
- CognitoIdentityPoolName
- Label:
default: Web Application Parameters
Parameters:
- WebAppParentOrigin
- WebAppPath
- WebAppConfBotInitialText
- WebAppConfBotInitialSpeech
- WebAppConfNegativeFeedback
- WebAppConfPositiveFeedback
- WebAppConfHelp
- WebAppConfToolbarTitle
- ShouldLoadIframeMinimized
Conditions:
NeedsBot: !Equals [!Ref BotName, '']
NeedsCognito: !Equals [!Ref CognitoIdentityPoolId, '']
NeedsParentOrigin: !Equals [!Ref WebAppParentOrigin, '']
Resources:
Bot:
Type: AWS::CloudFormation::Stack
Condition: NeedsBot
Properties:
TimeoutInMinutes: 15
TemplateURL: !Sub "https://s3.amazonaws.com/${BootstrapBucket}/${BootstrapPrefix}/templates/lexbot.yaml"
Parameters:
NamePrefix: !Ref BotNamePrefix
ShouldDeleteBot: !Ref ShouldDeleteBot
CustomResourceCodeBucket: !Ref BootstrapBucket
CustomResourceCodeObject: !Sub "${BootstrapPrefix}/custom-resources.zip"
CognitoIdentityPool:
Type: AWS::CloudFormation::Stack
Condition: NeedsCognito
Properties:
TemplateURL: !Sub "https://s3.amazonaws.com/${BootstrapBucket}/${BootstrapPrefix}/templates/cognito.yaml"
Parameters:
CognitoIdentityPoolName: !Ref CognitoIdentityPoolName
LexBotName:
!If
- NeedsBot
- !GetAtt Bot.Outputs.BotName
- !Ref BotName
##########################################################################
# Simplified deployment using CodeBuild to build config and push to S3
##########################################################################
CodeBuildDeploy:
Type: AWS::CloudFormation::Stack
Properties:
TemplateURL: !Sub "https://s3.amazonaws.com/${BootstrapBucket}/${BootstrapPrefix}/templates/codebuild-deploy.yaml"
Parameters:
CodeBuildName: !Ref CodeBuildName
SourceBucket: !Ref BootstrapBucket
SourceObject: !Sub "${BootstrapPrefix}/src.zip"
CustomResourceCodeObject: !Sub "${BootstrapPrefix}/custom-resources.zip"
CleanupBuckets: !Ref CleanupBuckets
BotName:
!If
- NeedsBot
- !GetAtt Bot.Outputs.BotName
- !Ref BotName
BotAlias: !Ref BotAlias
CognitoIdentityPoolId:
!If
- NeedsCognito
- !GetAtt CognitoIdentityPool.Outputs.CognitoIdentityPoolId
- !Ref CognitoIdentityPoolId
ParentOrigin: !Ref WebAppParentOrigin
WebAppConfBotInitialText: !Ref WebAppConfBotInitialText
WebAppConfBotInitialSpeech: !Ref WebAppConfBotInitialSpeech
WebAppConfNegativeFeedback: !Ref WebAppConfNegativeFeedback
WebAppConfPositiveFeedback: !Ref WebAppConfPositiveFeedback
WebAppConfHelp: !Ref WebAppConfHelp
WebAppConfToolbarTitle: !Ref WebAppConfToolbarTitle
ShouldEnableCognitoLogin: !Ref EnableCognitoLogin
ReInitSessionAttributesOnRestart: !Ref ReInitSessionAttributesOnRestart
EnableMarkdownSupport: !Ref EnableMarkdownSupport
ShouldLoadIframeMinimized: !Ref ShouldLoadIframeMinimized
ShowResponseCardTitle: !Ref ShowResponseCardTitle
CognitoAppUserPoolClientId:
!If
- NeedsCognito
- !GetAtt CognitoIdentityPool.Outputs.CognitoUserPoolClientId
- "UserMustSupply"
CognitoUserPoolId:
!If
- NeedsCognito
- !GetAtt CognitoIdentityPool.Outputs.CognitoUserPoolId
- "UserMustSupply"
CognitoIdentityPoolConfig:
Type: AWS::CloudFormation::Stack
Condition: NeedsCognito
Properties:
TemplateURL: !Sub "https://s3.amazonaws.com/${BootstrapBucket}/${BootstrapPrefix}/templates/cognitouserpoolconfig.yaml"
Parameters:
WebAppUrl: !If [NeedsParentOrigin, !GetAtt CodeBuildDeploy.Outputs.WebAppBase, !Ref WebAppParentOrigin]
WebAppPath: !Ref WebAppPath
CodeBuildProjectName: !GetAtt CodeBuildDeploy.Outputs.CodeBuildProject
CognitoUserPool: !GetAtt CognitoIdentityPool.Outputs.CognitoUserPoolId
CognitoUserPoolClient: !GetAtt CognitoIdentityPool.Outputs.CognitoUserPoolClientId
Outputs:
BotName:
Condition: NeedsBot
Description: >
Name of the Lex bot created by the stack
Value: !GetAtt Bot.Outputs.BotName
CodeBuildUrl:
Description: >
Monitor the pipeline URL to see when the application has been fully
built and deployed.
Value: !Sub "https://console.aws.amazon.com/codebuild/home?region=${AWS::Region}#/projects/${CodeBuildDeploy.Outputs.CodeBuildProject}/view"
WebAppUrl:
Description: >
URL of the stand-alone sample web application.
This page will be available after the pipeline/deployment completes.
Value: !GetAtt CodeBuildDeploy.Outputs.WebAppUrl
ParentPageUrl:
Condition: NeedsParentOrigin
Description: >
URL of the iframe based sample web application
This page will be available after the pipeline/deployment completes.
Value: !GetAtt CodeBuildDeploy.Outputs.ParentPageUrl
LoaderScriptUrl:
Description: >
URL of the loader script
This script will be available after the pipeline/deployment completes.
Value: !GetAtt CodeBuildDeploy.Outputs.LoaderScriptUrl
SnippetUrl:
Description: >
URL of a page showing the snippet to load the chatbot UI as
an iframe
Value: !GetAtt CodeBuildDeploy.Outputs.SnippetUrl
CognitoIdentityPoolId:
Condition: NeedsCognito
Description: Cognito Identity Pool Id
Value: !GetAtt CognitoIdentityPool.Outputs.CognitoIdentityPoolId
CognitoUserPoolPubKey:
Condition: NeedsCognito
Description: Include Cognito User Pool Public Key URL in stack outputs (needed for QnABot token auth)
Value: !Sub https://cognito-idp.${AWS::Region}.amazonaws.com/${CognitoIdentityPool.Outputs.CognitoUserPoolId}/.well-known/jwks.json