A CDK Construct for Importing Amazon Lex Bots
To add on to the previous [article](https://subaud.io/importing-an-amazon-lex-bot-with-cdk/) that described how to import an Amazon Lex Bot with CDK, I have created a [CDK Construct](https://constructs.dev/packages/cdk-lex-zip-import/v/0.0.4?lang=typescript) that you can import and use in your own CDK projects.

To add on to the previous article that described how to import an Amazon Lex Bot with CDK, I have created a CDK Construct that you can import and use in your own CDK projects.
To add this to your CDK project, simply import the Construct:
yarn add cdk-lex-zip-import
Within your CDK:
const bot = new lexupload.ImportBot(this, "lexBot", {
sourceDirectory: "./resources/LexBot",
lexRoleArn: lexRole.roleArn,
});
The sourceDirectory
must include a file named LexBot.zip
. This file will be uploaded to an S3 Bucket and then imported using a Lambda backed Custom Resource.
Additionally, a Resource Policy can be applied to the Alias once it is imported.
bot.addResourcePolicy(resourceArn, policy);
A complete example might look like this:
import { Stack, StackProps } from "aws-cdk-lib";
import * as iam from "aws-cdk-lib/aws-iam";
import * as lexupload from "cdk-lex-zip-import";
import { Construct } from "constructs";
export class MyStack extends Stack {
constructor(scope: Construct, id: string, props: StackProps = {}) {
super(scope, id, props);
const lexRole = new iam.Role(this, "lexRole", {
assumedBy: new iam.ServicePrincipal("lex.amazonaws.com"),
inlinePolicies: {
["lexPolicy"]: new iam.PolicyDocument({
statements: [
new iam.PolicyStatement({
resources: ["*"],
actions: ["polly:SynthesizeSpeech", "comprehend:DetectSentiment"],
}),
],
}),
},
});
const bot = new lexupload.ImportBot(this, "lexBot", {
sourceDirectory: "./resources/LexBot",
lexRoleArn: lexRole.roleArn,
});
const resourceArn = `arn:aws:lex:${this.region}:${this.account}:bot-alias/${bot.botId}/${bot.botAliasId}`;
const policy = {
Version: "2012-10-17",
Statement: [
{
Sid: "AllowChimePstnAudioUseBot",
Effect: "Allow",
Principal: { Service: "voiceconnector.chime.amazonaws.com" },
Action: "lex:StartConversation",
Resource: resourceArn,
Condition: {
StringEquals: { "AWS:SourceAccount": `${this.account}` },
ArnEquals: {
"AWS:SourceArn": `arn:aws:voiceconnector:us-east-1:${this.account}:*`,
},
},
},
],
};
bot.addResourcePolicy(resourceArn, policy);
}
}
For more information or to contribute, please see the GitHub repo.