in packages/amplify-dotnet-function-template-provider/src/utils/eventSourceWalkthrough.ts [6:199]
export async function askEventSourceQuestions(context: any) {
const selectEventSourceQuestion = {
type: 'list',
name: 'eventSourceType',
message: 'What event source do you want to associate with Lambda trigger?',
choices: [
{
name: 'Amazon DynamoDB Stream',
value: 'dynamoDB',
},
{
name: 'Amazon Kinesis Stream',
value: 'kinesis',
},
],
};
const eventSourceTypeAnswer = await inquirer.prompt([selectEventSourceQuestion]);
let arnQuestion;
let arnAnswer;
let eventSourceArn;
let streamKindQuestion;
let streamKindAnswer;
let streamKind;
let dynamoDBCategoryStorageRes;
let dynamoDBCategoryStorageStreamArnRef;
switch (eventSourceTypeAnswer.eventSourceType) {
case 'kinesis':
streamKindQuestion = {
type: 'list',
name: 'kinesisStreamKind',
message: 'Choose a Kinesis event source option',
choices: [
{
name: 'Use Analytics category kinesis stream in the current Amplify project',
value: 'analyticsKinesisStream',
},
{
name: 'Provide the ARN of Kinesis stream directly',
value: 'kinesisStreamRawARN',
},
],
};
streamKindAnswer = await inquirer.prompt([streamKindQuestion]);
streamKind = streamKindAnswer.kinesisStreamKind;
switch (streamKind) {
case 'kinesisStreamRawARN':
arnQuestion = {
name: 'amazonKinesisStreamARN',
message: 'Provide the ARN of Amazon Kinesis data stream or a stream consumer',
validate: context.amplify.inputValidation({
operator: 'regex',
value: 'arn:(aws[a-zA-Z0-9-]*):([a-zA-Z0-9\\-])+:([a-z]{2}(-gov)?-[a-z]+-\\d{1})?:(\\d{12})?:(.*)',
onErrorMsg: 'Invalid ARN format',
required: true,
}),
};
arnAnswer = await inquirer.prompt([arnQuestion]);
eventSourceArn = arnAnswer.amazonKinesisStreamARN;
return {
triggerEventSourceMappings: [
{
batchSize: 100,
startingPosition: 'LATEST',
eventSourceArn,
functionTemplateType: eventSourceTypeAnswer.eventSourceType,
functionTemplateName: 'Kinesis.cs.ejs',
triggerPolicies: [
{
Effect: 'Allow',
Action: [
'kinesis:DescribeStream',
'kinesis:DescribeStreamSummary',
'kinesis:GetRecords',
'kinesis:GetShardIterator',
'kinesis:ListShards',
'kinesis:ListStreams',
'kinesis:SubscribeToShard',
],
Resource: eventSourceArn,
},
],
},
],
};
case 'analyticsKinesisStream':
return await askAnalyticsCategoryKinesisQuestions(context);
default:
return {};
}
case 'dynamoDB':
streamKindQuestion = {
type: 'list',
name: 'dynamoDbStreamKind',
message: 'Choose a DynamoDB event source option',
choices: [
{
name: 'Use API category graphql @model backed DynamoDB table(s) in the current Amplify project',
value: 'graphqlModelTable',
},
{
name: 'Use storage category DynamoDB table configured in the current Amplify project',
value: 'storageDynamoDBTable',
},
{
name: 'Provide the ARN of DynamoDB stream directly',
value: 'dynamoDbStreamRawARN',
},
],
};
streamKindAnswer = await inquirer.prompt([streamKindQuestion]);
streamKind = streamKindAnswer.dynamoDbStreamKind;
switch (streamKind) {
case 'dynamoDbStreamRawARN':
arnQuestion = {
name: 'dynamoDbARN',
message: 'Provide the ARN of Amazon DynamoDB stream',
validate: context.amplify.inputValidation({
operator: 'regex',
value: 'arn:(aws[a-zA-Z0-9-]*):([a-zA-Z0-9\\-])+:([a-z]{2}(-gov)?-[a-z]+-\\d{1})?:(\\d{12})?:(.*)',
onErrorMsg: 'ARN format is invalid',
required: true,
}),
};
arnAnswer = await inquirer.prompt([arnQuestion]);
eventSourceArn = arnAnswer.dynamoDbARN;
return {
triggerEventSourceMappings: [
{
batchSize: 100,
startingPosition: 'LATEST',
eventSourceArn,
functionTemplateType: eventSourceTypeAnswer.eventSourceType,
functionTemplateName: 'DynamoDb.cs.ejs',
triggerPolicies: [
{
Effect: 'Allow',
Action: ['dynamodb:DescribeStream', 'dynamodb:GetRecords', 'dynamodb:GetShardIterator', 'dynamodb:ListStreams'],
Resource: eventSourceArn,
},
],
},
],
};
case 'graphqlModelTable':
return await askAPICategoryDynamoDBQuestions(context);
case 'storageDynamoDBTable':
const storageResources = context.amplify.getProjectDetails().amplifyMeta.storage;
if (!storageResources) {
const errMessage = 'There are no DynamoDB resources configured in your project currently';
context.print.error(errMessage);
await context.usageData.emitError(new ResourceDoesNotExistError(errMessage));
exitOnNextTick(1);
}
dynamoDBCategoryStorageRes = await askDynamoDBQuestions(context, true);
dynamoDBCategoryStorageStreamArnRef = {
Ref: `storage${dynamoDBCategoryStorageRes.resourceName}StreamArn`,
};
return {
triggerEventSourceMappings: [
{
batchSize: 100,
startingPosition: 'LATEST',
eventSourceArn: dynamoDBCategoryStorageStreamArnRef,
functionTemplateType: eventSourceTypeAnswer.eventSourceType,
functionTemplateName: 'DynamoDb.cs.ejs',
triggerPolicies: [
{
Effect: 'Allow',
Action: ['dynamodb:DescribeStream', 'dynamodb:GetRecords', 'dynamodb:GetShardIterator', 'dynamodb:ListStreams'],
Resource: dynamoDBCategoryStorageStreamArnRef,
},
],
},
],
dependsOn: [
{
category: 'storage',
resourceName: dynamoDBCategoryStorageRes.resourceName,
attributes: ['StreamArn'],
},
],
};
default:
return {};
}
default:
context.print.error('Unrecognized option selected. (this is likely an amplify error, please report)');
return {};
}
}