AWSTemplateFormatVersion: 2010-09-09 Description: | Master Pipeline Lex Web UI CloudFormation template (v0.19.9) The Lex Web Ui can be deployed to operate against either a Lex V2 Bot OR a Lex V1 Bot BUT NOT BOTH. Please configure either the Lex V2 bot information OR the Lex V1 bot information and leave the other version input parameters as defaulted. A deployment of Lex Web Ui can not be switched between V2 and V1 by updating the stack with different parameters. 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 - CodeCommit Repository containg the source code in this project and a CodeBuild project, Lambda functions to initialize the repo - Optional deployment pipeline using CodePipeline and CodeBuild - CloudWatch Logs groups related to Lambda functions - Associated IAM roles Parameters: LexV2BotId: Description: > Bot ID (not bot name) of an existing Lex V2 Bot to be used by the web ui. NOTE: You must also enter your Bot alias ID in the LexV2BotAliasId field below. DO NOT MODIFY this value if configuring a V1 Bot. Type: String Default: '' MaxLength: 50 AllowedPattern: '(^$|^[a-zA-Z0-9]+((_[a-zA-Z0-9]+)*|([a-zA-Z0-9]+_)*|_))' ConstraintDescription: > Must conform with the permitted Lex V2 Bot name pattern. LexV2BotAliasId: Description: > Use your Lex V2 Bot's alias id (not alias name) here. DO NOT MODIFY this value if configuring a V1 Bot. Type: String Default: '' MinLength: 0 MaxLength: 50 AllowedPattern: '(^$|^[$a-zA-Z0-9]+((_[$a-zA-Z0-9]+)*|([$a-zA-Z0-9]+_)*|_))' ConstraintDescription: > Must conform with the permitted Lex V2 Alias name pattern. LexV2BotLocaleId: Description: > Specify your bot's supported locale ids. By default this list contains only en_US. Other Lex V2 supported values are de_DE, en_AU, en_GB, es_419, es_ES, es_US, fr_CA, fr_FR, it_IT, ja_JP. A comma separated list of values can be supplied with the first value in the list being the default value. The remaining items can be selected in the Lex Web Ui menu. See "https://docs.aws.amazon.com/lexv2/latest/dg/lex2.0.pdf" for details on supported languages and locales. DO NOT MODIFY this value if configuring a V1 Bot. Type: String Default: 'en_US' MinLength: 2 MaxLength: 50 BotName: Description: > Name of an existing Lex Bot to be used by the web ui. NOTE: You must also enter your published bot alias in the BotAlias field below. DO NOT MODIFY this value if configuring a V2 Bot. Type: String Default: '' MinLength: 0 MaxLength: 50 AllowedPattern: '(^$|^[a-zA-Z]+((_[a-zA-Z]+)*|([a-zA-Z]+_)*|_))' ConstraintDescription: > Must conform with the permitted Lex Bot name pattern. BotAlias: Description: > WARNING: For production deployments, use your bot's published alias here. The $LATEST alias should only be used for manual testing. Amazon Lex limits the number of runtime requests that you can make to the $LATEST version of the bot. DO NOT MODIFY this value if configuring a V2 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: > If Lex Version 2 BotId is left empty AND the Lex Version 1 BotName is left empty, a Lex V1 Bot based on the OrderFlowers sample will be automatically created. Specify a 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 Optional Sample 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. HideButtonMessageBubble: Type: String Default: false AllowedValues: - true - false Description: > If set to true, hide the message bubble on a response card button press ShouldEnableLiveChat: Type: String Default: false AllowedValues: - true - false Description: > This is an optional parameter, if set to True, the AWS Connect live Chat functionality will be available. A item to start a live chat will appear at the menu. ConnectContactFlowId: Type: String Description: > Connect Contract Flow Id ConnectInstanceId: Type: String Description: > Connect Instance Id Default: "" ConnectPromptForNameMessage: Type: String Description: > Message to display prompting the user for a name Default: Before starting a live chat, please tell me your name? ConnectWaitForAgentMessage: Type: String Description: > Message to display every message interval while waiting for an agent to connect Default: Thanks for waiting. An agent will be with you when available. ConnectWaitForAgentMessageIntervalInSeconds: Type: Number Description: > Interval in seconds between successive ConnectWaitForAgentMessage. 0 to disable interval. Default: 60 ConnectAgentJoinedMessage: Type: String Description: > Message to play when an agent joins the chat. {Agent} will be replaced with the Agent's name. Default: "{Agent} has joined." ConnectAgentLeftMessage: Type: String Description: > Message to play when an agent leaves the chat. {Agent} will be replaced with the Agent's name. Default: "{Agent} has left." ConnectChatEndedMessage: Type: String Description: > Message to play when a chat session has ended. Default: "Chat ended." ConnectAttachChatTranscript: Type: String Default: false AllowedValues: - true - false Description: > Attach chat transcript as file. This only works if you enable attachments in Amazon Connect. ConnectLiveChatTerms: Type: String Description: > Command separated list of terms that can be used to start Live Chat mode Default: "live chat" CodeCommitRepoName: Type: String Description: > Name of CodeCommit repository to be created. Used as the source for the pipeline and to automate deployments of the web app. It is initialized with source artifacts from the bootstrap S3 bucket. Must be unique per region. Default: lex-web-ui MinLength: 1 MaxLength: 100 AllowedPattern: '^[\w\.-]+$' ConstraintDescription: Alphanumeric, dot and dash. CodePipelineName: Type: String Description: > Name of CodePipeline pipeline to be created. Used to manage the build and deployment of the web application. Must be unique per region. to true. Default: lex-web-ui MinLength: 1 MaxLength: 100 AllowedPattern: '[A-Za-z0-9.@\-_]+' ConstraintDescription: Alphanumeric, dot, dash, underscore and @. CodeBuildName: Type: String Description: > Name of the CodeBuild project to be created. Used for building the web app with the pipeline. 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 where you want to place the chat bot UI. 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 (or pages) under WebAppParentOrigin used to host the chatbot UI. Multiple paths can be specified as a comma separated list. 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. # 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 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. WebAppConfCname: Type: String Default: "" Description: This optional parameter allows a single CNAME to be defined and used as an alias to the cloudfront distribution that is created by this template. If a CNAME is provided, a WebAppAcmCertificateArn must also be provided. WebAppAcmCertificateArn: Type: String Default: "" Description: This optional parameter allows a AcmCertificateArn to be provided for use in the Cloudfront distribution created by this template. if a AcmCertificateArn is provided, a WebAppConfCname must also be provided. WebAppWafAclArn: Type: String Default: "" Description: This optional parameter allows a AWS WAF web ACL to be specified in ARN formation. This supports AWS WAF V2. ConnectStartLiveChatLabel: Type: String Description: > Label used in Menu to start connect live chat Default: "Start Live Chat" ConnectStartLiveChatIcon: Type: String Description: > Icon to use in menu to start connect live chat Default: "people_alt" ConnectEndLiveChatLabel: Type: String Description: > Label to use in menu and toolbar to end connect live chat Default: "End Live Chat" ConnectEndLiveChatIcon: Type: String Description: > Icon to use in menu and toolbar to end connect live chat Default: "call_end" ConnectTranscriptMessageDelayInMsec: Type: Number Description: > Delay to insert between each transcript message send to Connect in msec. Default: 150 Rules: ValidateEitherV1orV2: RuleCondition: !Not - !Equals - !Ref BotName - '' Assertions: - Assert: !Equals - !Ref LexV2BotId - '' AssertDescription: 'Template cannot contain both Lex V1 and Lex V2 information' Metadata: AWS::CloudFormation::Interface: ParameterGroups: - Label: default: Deployment Parameters Parameters: - CodeBuildName - CodePipelineName - CodeCommitRepoName - CleanupBuckets - BootstrapBucket - BootstrapPrefix - Label: default: Lex V1 Bot Configuration Parameters Parameters: - BotName - BotAlias - Label: default: Lex V2 Bot Configuration Parameters Parameters: - LexV2BotId - LexV2BotAliasId - LexV2BotLocaleId - Label: default: Optional Sample Bot Parameters: - BotNamePrefix - ShouldDeleteBot - Label: default: Cognito Parameters Parameters: - CognitoIdentityPoolId - CognitoIdentityPoolName - Label: default: Web Application Parameters Parameters: - WebAppParentOrigin - WebAppPath - WebAppConfNegativeFeedback - WebAppConfPositiveFeedback - WebAppConfHelp - WebAppConfCname - WebAppAcmCertificateArn - WebAppWafAclArn - Label: default: Connect Live Chat Parameters Parameters: - ShouldEnableLiveChat - ConnectLiveChatTerms - ConnectInstanceId - ConnectContactFlowId - ConnectPromptForNameMessage - ConnectWaitForAgentMessage - ConnectWaitForAgentMessageIntervalInSeconds - ConnectAgentJoinedMessage - ConnectAgentLeftMessage - ConnectChatEndedMessage - ConnectAttachChatTranscript - ConnectStartLiveChatLabel - ConnectStartLiveChatIcon - ConnectEndLiveChatLabel - ConnectEndLiveChatIcon Conditions: IsLexV2: !Not [ !Equals [!Ref LexV2BotId, ''] ] NeedsBot: !And [ !Equals [!Ref BotName, ''], !Equals [!Ref LexV2BotId, ''] ] NeedsCognito: !Equals [!Ref CognitoIdentityPoolId, ''] NeedsParentOrigin: !Equals [!Ref WebAppParentOrigin, ''] Resources: Bot: Type: AWS::CloudFormation::Stack Condition: NeedsBot Properties: TimeoutInMinutes: 15 TemplateURL: !Sub "https://${BootstrapBucket}.s3.${AWS::Region}.amazonaws.com/${BootstrapPrefix}/templates/lexbot.yaml" Parameters: NamePrefix: !Ref BotNamePrefix ShouldDeleteBot: !Ref ShouldDeleteBot CustomResourceCodeBucket: !Ref BootstrapBucket CustomResourceCodeObject: !Sub "${BootstrapPrefix}/custom-resources-v0.19.9.zip" CognitoIdentityPool: Type: AWS::CloudFormation::Stack Condition: NeedsCognito Properties: TemplateURL: !Sub "https://${BootstrapBucket}.s3.${AWS::Region}.amazonaws.com/${BootstrapPrefix}/templates/cognito.yaml" Parameters: CognitoIdentityPoolName: !Ref CognitoIdentityPoolName LexBotName: !If - NeedsBot - !GetAtt Bot.Outputs.BotName - !Ref BotName LexV2BotId: !Ref LexV2BotId LexV2BotAliasId: !Ref LexV2BotAliasId ShouldEnableLiveChat: !Ref ShouldEnableLiveChat ########################################################################## # deployment using a pipeline ########################################################################## CodeCommitRepo: Type: AWS::CloudFormation::Stack Properties: TimeoutInMinutes: 15 TemplateURL: !Sub "https://${BootstrapBucket}.s3.${AWS::Region}.amazonaws.com/${BootstrapPrefix}/templates/coderepo.yaml" Parameters: BotName: !If - NeedsBot - !GetAtt Bot.Outputs.BotName - !Ref BotName BotAlias: !Ref BotAlias LexV2BotId: !Ref LexV2BotId LexV2BotAliasId: !Ref LexV2BotAliasId LexV2BotLocaleId: !Ref LexV2BotLocaleId CodeBuildName: !Sub "${CodeCommitRepoName}-init" CodeCommitRepoName: !Ref CodeCommitRepoName CognitoIdentityPoolId: !If - NeedsCognito - !GetAtt CognitoIdentityPool.Outputs.CognitoIdentityPoolId - !Ref CognitoIdentityPoolId SourceBucket: !Ref BootstrapBucket SourceObject: !Sub "${BootstrapPrefix}/src-v0.19.9.zip" CustomResourceCodeObject: !Sub "${BootstrapPrefix}/custom-resources-v0.19.9.zip" Pipeline: Type: AWS::CloudFormation::Stack Properties: TemplateURL: !Sub "https://${BootstrapBucket}.s3.${AWS::Region}.amazonaws.com/${BootstrapPrefix}/templates/pipeline.yaml" Parameters: ResourcePrefix: !Ref "AWS::StackName" BotName: #!If # - IsLexV2 # - !Ref LexV2BotId !If - NeedsBot - !GetAtt Bot.Outputs.BotName - !Ref BotName BotAlias: !Ref BotAlias LexV2BotId: !Ref LexV2BotId LexV2BotAliasId: !Ref LexV2BotAliasId LexV2BotLocaleId: !Ref LexV2BotLocaleId CodePipelineName: !Ref CodePipelineName CodeCommitRepoName: !GetAtt CodeCommitRepo.Outputs.CodeCommitRepoName CodeBuildName: !Ref CodeBuildName CognitoIdentityPoolId: !If - NeedsCognito - !GetAtt CognitoIdentityPool.Outputs.CognitoIdentityPoolId - !Ref CognitoIdentityPoolId ParentOrigin: !Ref WebAppParentOrigin CustomResourceCodeBucket: !Ref BootstrapBucket CustomResourceCodePrefix: !Ref BootstrapPrefix CustomResourceCodeObject: !Sub "${BootstrapPrefix}/custom-resources-v0.19.9.zip" InitiateChatLambdaCodeObject: !Sub "${BootstrapPrefix}/initiate-chat-lambda-v0.19.9.zip" CleanupBuckets: !Ref CleanupBuckets CognitoAppUserPoolClientId: !If - NeedsCognito - !GetAtt CognitoIdentityPool.Outputs.CognitoUserPoolClientId - '' CognitoUserPoolId: !If - NeedsCognito - !GetAtt CognitoIdentityPool.Outputs.CognitoUserPoolId - '' WebAppConfNegativeFeedback: !Ref WebAppConfNegativeFeedback WebAppConfPositiveFeedback: !Ref WebAppConfPositiveFeedback WebAppConfHelp: !Ref WebAppConfHelp WebAppConfCname: !Ref WebAppConfCname WebAppAcmCertificateArn: !Ref WebAppAcmCertificateArn WebAppWafAclArn: !Ref WebAppWafAclArn HideButtonMessageBubble: !Ref HideButtonMessageBubble ShouldEnableLiveChat: !Ref ShouldEnableLiveChat ConnectContactFlowId: !Ref ConnectContactFlowId ConnectInstanceId: !Ref ConnectInstanceId ConnectPromptForNameMessage: !Ref ConnectPromptForNameMessage ConnectWaitForAgentMessage: !Ref ConnectWaitForAgentMessage ConnectWaitForAgentMessageIntervalInSeconds: !Ref ConnectWaitForAgentMessageIntervalInSeconds ConnectAgentJoinedMessage: !Ref ConnectAgentJoinedMessage ConnectAgentLeftMessage: !Ref ConnectAgentLeftMessage ConnectChatEndedMessage: !Ref ConnectChatEndedMessage ConnectAttachChatTranscript: !Ref ConnectAttachChatTranscript ConnectLiveChatTerms: !Ref ConnectLiveChatTerms ConnectStartLiveChatLabel: !Ref ConnectStartLiveChatLabel ConnectStartLiveChatIcon: !Ref ConnectStartLiveChatIcon ConnectEndLiveChatLabel: !Ref ConnectEndLiveChatLabel ConnectEndLiveChatIcon: !Ref ConnectEndLiveChatIcon ConnectTranscriptMessageDelayInMsec: !Ref ConnectTranscriptMessageDelayInMsec CognitoIdentityPoolConfig: Type: AWS::CloudFormation::Stack Condition: NeedsCognito Properties: TemplateURL: !Sub "https://${BootstrapBucket}.s3.${AWS::Region}.amazonaws.com/${BootstrapPrefix}/templates/cognitouserpoolconfig.yaml" Parameters: CloudFrontUrl: !GetAtt Pipeline.Outputs.WebAppBase WebAppUrl: !Ref WebAppParentOrigin WebAppPath: !Ref WebAppPath CodeBuildProjectName: !Ref CodeBuildName CognitoUserPool: !GetAtt CognitoIdentityPool.Outputs.CognitoUserPoolId CognitoUserPoolClient: !GetAtt CognitoIdentityPool.Outputs.CognitoUserPoolClientId Timestamp: 1684778631 Outputs: BotName: Condition: NeedsBot Description: > Name of the Lex bot created by the stack Value: !GetAtt Bot.Outputs.BotName CodeCommitRepoUrl: Description: CodeCommit repository clone URL Value: !GetAtt CodeCommitRepo.Outputs.CodeCommitRepoUrl PipelineUrl: Description: > Monitor the pipeline URL to see when the application has been fully built and deployed. Value: !Sub "https://console.aws.amazon.com/codepipeline/home?region=${AWS::Region}#/view/${Pipeline.Outputs.PipelineName}" WebAppUrl: Description: > URL of the stand-alone sample web application. This page will be available after the pipeline/deployment completes. Value: !GetAtt Pipeline.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 Pipeline.Outputs.ParentPageUrl LoaderScriptUrl: Description: > URL of the loader script This script will be available after the pipeline/deployment completes. Value: !GetAtt Pipeline.Outputs.LoaderScriptUrl SnippetUrl: Description: > URL of a page showing the snippet to load the chatbot UI as an iframe Value: !GetAtt Pipeline.Outputs.SnippetUrl CognitoIdentityPoolId: Condition: NeedsCognito Description: Cognito Identity Pool Id Value: !GetAtt CognitoIdentityPool.Outputs.CognitoIdentityPoolId