The chat bot is based on Amazon Lex, with an AWS Lambda function driving the bot conversation to ask questions and check answers.
The bot uses the AWS Serverless Application Model (SAM) to model, package, and deploy the function code to AWS Lambda. The function queries the backend API service to get questions and to check whether answer responses are correct. The function uses the Lex session attributes to keep track of which questions have been asked and the user's score.
The chat-bot uses canary deployments using AWS CodeDeploy. When the serverless application is deployed with AWS CloudFormation, a CodeDeploy deployment is automatically triggered. Both alarms and a pre-traffic validation function will be provisioned with the stack, and CodeDeploy will use those to validate that the deployment will not impact your traffic. CodeDeploy will shift 10 percent of traffic to the new function code for 5 minutes, then will shift the rest if no alarms have triggered in that time.
The Lex model is built from the questions and answers found in the trivia-backend folder. Each question is a slot, which the answer as the slot type. The data file contains "alternative answers", which are used as synonyms for the slot type. In order to associate the Lex bot with Slack, follow these instructions.
Create a service-linked IAM role for Lex:
aws iam create-service-linked-role --aws-service-name lex.amazonaws.com
Replace all references to 'reinvent-trivia.com' with your own domain name.
Ideally, use the pipelines in the "pipelines" folder to deploy the bot. Alternatively, you can use the SAM CLI to deploy. See the buildspec.yml for additional required commands, like installing dependencies.
sam package \
--template-file template.yaml \
--output-template-file packaged.yaml \
--s3-bucket REPLACE_THIS_WITH_YOUR_S3_BUCKET_NAME
sam deploy \
--template-file packaged.yaml \
--stack-name chat-bot \
--capabilities CAPABILITY_IAM
sam local invoke BotFunction --skip-pull-image -e hook/test-events/four.json
echo '{"DeploymentId":"123","LifecycleEventHookExecutionId":"456"}' | sam local invoke PreTrafficHook --skip-pull-image