in main/cdk/search-stack.ts [37:168]
constructor(app: cdk.App, id: string, props: SearchStackProps) {
super(app, id, props);
var searchTable: dynamodb.Table | null = null;
var createTable = true;
if (props.dynamoTableNames.indexOf(TABLE_NAME) > -1) {
console.log("Found table " + TABLE_NAME);
createTable = false;
}
if (createTable) {
console.log("Creating new table " + TABLE_NAME);
searchTable = new dynamodb.Table(this, "search", {
partitionKey: {
name: "searchId",
type: dynamodb.AttributeType.STRING,
},
sortKey: {
name: "imageId",
type: dynamodb.AttributeType.STRING,
},
tableName: "BioimsSearch",
billingMode: BillingMode.PAY_PER_REQUEST
});
} else {
console.log("Using already existing table " + TABLE_NAME);
searchTable = dynamodb.Table.fromTableName(
this,
TABLE_NAME,
TABLE_NAME
) as Table;
}
this.searchQueue = new sqs.Queue(this, 'BioimsSearchQueue', {
fifo: true,
});
this.managementQueue = new sqs.Queue(this, 'BioimsManagementQueue', {
fifo: true,
});
this.searchLambda = new lambda.Function(
this,
"searchFunction",
{
code: lambda.Code.fromAsset("src/search/build"),
handler: "search.handler",
runtime: lambda.Runtime.NODEJS_12_X,
environment: {
TABLE_NAME: searchTable.tableName,
PARTITION_KEY: "searchId",
SORT_KEY: "imageId",
TRAINING_CONFIGURATION_LAMBDA_ARN: props.trainingConfigurationLambda.functionArn,
IMAGE_MANAGEMENT_LAMBDA_ARN: props.imageManagementLambda.functionArn,
PROCESS_PLATE_LAMBDA_ARN: props.processPlateLambda.functionArn,
MESSAGE_LAMBDA_ARN: props.messageLambda.functionArn,
SEARCH_QUEUE_URL: this.searchQueue.queueUrl,
MANAGEMENT_QUEUE_URL: this.managementQueue.queueUrl
},
memorySize: 3008,
timeout: cdk.Duration.minutes(15),
}
);
const searchTableAccessPolicy = new iam.PolicyStatement({
actions: ["dynamodb:*"],
effect: iam.Effect.ALLOW,
resources: [
searchTable.tableArn,
searchTable.tableArn + "/index/*"
]
})
const lambdaPolicy = new iam.Policy(this, "searchAccessPolicy");
lambdaPolicy.addStatements(searchTableAccessPolicy);
this.searchLambda!.role!.attachInlinePolicy(lambdaPolicy);
// Train Loader
const searchTrainLoaderPlateFunction = new tasks.LambdaInvoke(this, "SearchTrainLoaderPlateProcessor", {
lambdaFunction: this.searchLambda,
outputPath: '$.Payload.body'
});
const searchTrainPlateStateMachine = new sfn.StateMachine(this, "SearchTrainPlateStateMachine",
{
definition: searchTrainLoaderPlateFunction,
timeout: cdk.Duration.hours(1)
});
const trainPlateProcessor = new tasks.StepFunctionsStartExecution(this, "SearchTrainPlateSFN", {
stateMachine: searchTrainPlateStateMachine,
});
const searchTrainLoader = createTrainPlateVisitor(this, "SearchTrainLoader", trainPlateProcessor, 0,
props.trainingConfigurationLambda, props.imageManagementLambda, props.processPlateLambda);
this.searchTrainLoaderStateMachine = new sfn.StateMachine(this, "SearchTrainLoaderStateMachine",
{
definition: searchTrainLoader,
timeout: cdk.Duration.hours(24),
});
// Tag Loader
const searchTagLoaderPlateFunction = new tasks.LambdaInvoke(this, "SearchTagLoaderPlateProcessor", {
lambdaFunction: this.searchLambda,
outputPath: '$.Payload.body'
});
const searchTagPlateStateMachine = new sfn.StateMachine(this, "SearchTagPlateStateMachine",
{
definition: searchTagLoaderPlateFunction,
timeout: cdk.Duration.hours(1)
});
const tagPlateProcessor = new tasks.StepFunctionsStartExecution(this, "SearchTagPlateSFN", {
stateMachine: searchTagPlateStateMachine,
});
const searchTagLoader = createEmbeddingPlateVisitor(this, "SearchTagLoader", tagPlateProcessor, 0,
props.trainingConfigurationLambda, props.imageManagementLambda, props.processPlateLambda);
this.searchTagLoaderStateMachine = new sfn.StateMachine(this, "SearchTagLoaderStateMachine",
{
definition: searchTagLoader,
timeout: cdk.Duration.hours(24),
});
}