in lib/honeycode_to_dynamodb.js [18:89]
function exportPromptsToDynamoDB(scope) {
// Create Dynamodb table
const promptsTable = new dynamodb.Table(scope, 'Prompts', {
partitionKey: { name: 'MsgGroup', type: dynamodb.AttributeType.STRING },
stream: dynamodb.StreamViewType.NEW_IMAGE,
billingMode: dynamodb.BillingMode.PAY_PER_REQUEST,
removalPolicy: cdk.RemovalPolicy.DESTROY
});
// Honeycode to Dynamo - pushes messages from HC to Dynamo
const promptsLambda = new lambda.Function(scope, 'SavePromptsToDynamoDB', {
description: 'Invoked to move Prompts to Dynamodb',
code: lambda.Code.fromAsset('lambda/SavePromptsToDynamoDB'),
handler: 'index.handler',
runtime: lambda.Runtime.NODEJS_12_X,
environment,
timeout: cdk.Duration.minutes(1), //Give enough time for batch upserts
});
// Connect Lambda Function - pulls messages from Dynamo on behalf or Connect
const pullerLambda = new lambda.Function(scope, 'ConnectPullPromptsFromDynamoDB', {
description: 'Invoked by Connect to pull a message from dynamo db',
code: lambda.Code.fromAsset('lambda/ConnectPullPromptsFromDynamoDB'),
handler: 'index.handler',
runtime: lambda.Runtime.NODEJS_12_X,
environment,
timeout: cdk.Duration.minutes(1), //Give enough time for batch upserts
});
// Run lambda every minute
const promptsToDynamoDBRule = new events.Rule(scope, 'PromptsToDynamoDBRule', {
schedule: events.Schedule.expression('rate(1 minute)')
});
promptsToDynamoDBRule.addTarget(new targets.LambdaFunction(promptsLambda));
// grant write access to prompts lambda function
//promptsTable.grantWrite(promptsLambda);
promptsTable.grantReadWriteData(promptsLambda);
promptsTable.grantReadWriteData(pullerLambda);
// Add tableName to Lambda Environment
promptsLambda.addEnvironment('dynamodbTable', promptsTable.tableName);
pullerLambda.addEnvironment('dynamodbTable', promptsTable.tableName);
//
// Lambda setup - Allow lambda to access Honeycode workbook
//
// (give access to all workbooks)
//importCustomersLambda.role.addManagedPolicy(iam.ManagedPolicy.fromAwsManagedPolicyName('AmazonHoneycodeWorkbookFullAccess'));
// (give access to only ONE workbook) - recommended
const workbookPolicy = new iam.PolicyStatement();
workbookPolicy.addActions(['honeycode:ListTables']);
workbookPolicy.addResources([`arn:aws:honeycode:*:*:workbook:workbook/${environment.workbookId}`]);
promptsLambda.role.addToPrincipalPolicy(workbookPolicy);
// Table policy for lambda
const tablePolicy = new iam.PolicyStatement();
tablePolicy.addActions(['honeycode:ListTableColumns', 'honeycode:BatchCreateTableRows',
'honeycode:BatchUpdateTableRows', 'honeycode:BatchDeleteTableRows',
'honeycode:QueryTableRows']);
tablePolicy.addResources([`arn:aws:honeycode:*:*:table:workbook/${environment.workbookId}/table/*`]);
promptsLambda.role.addToPrincipalPolicy(tablePolicy);
//Output the Bucket URL
new cdk.CfnOutput(scope, "DynamoDB table for Prompts", {
value: `${promptsTable.tableName}`
});
}