Untitled
unknown
plain_text
2 years ago
5.2 kB
6
Indexable
import { SqsToLambda } from "@aws-solutions-constructs/aws-sqs-lambda";
import { ChocolateLambda } from "@lib/constructs/lambda";
import {
getDefaultLambdaSqsEventSourceProperties,
getOverprovisionedDeadLetterQueueProperties,
getOverprovisionedMaxReceiveCount,
getOverprovisionedQueueProperties,
} from "@lib/resource-defaults/sqs";
import * as cdk from "aws-cdk-lib";
import * as events from "aws-cdk-lib/aws-events";
import * as targets from "aws-cdk-lib/aws-events-targets";
import * as iam from "aws-cdk-lib/aws-iam";
import * as lambda from "aws-cdk-lib/aws-lambda";
import * as rds from "aws-cdk-lib/aws-rds";
import * as s3 from "aws-cdk-lib/aws-s3";
import * as sqs from "aws-cdk-lib/aws-sqs";
import { Construct } from "constructs";
import { Environments } from "../environments";
interface FirmCrmReportStackProps extends cdk.NestedStackProps {
readonly stage: Environments;
readonly dbConfig: {
auroraCredentialsArn: string;
auroraRdsArn: string;
auroraDbName: string;
cluster: rds.ServerlessCluster | rds.ServerlessClusterFromSnapshot;
};
readonly faFirmReportConfig: {
executeTimeRule: string;
};
}
export class FirmCrmReportStack extends cdk.NestedStack {
config: FirmCrmReportStackProps;
deadLetterQueue: sqs.Queue;
queue: sqs.Queue;
bucket: s3.Bucket;
lambdaTimeoutInMinutes = 1;
constructor(
scope: Construct,
id: string,
props: FirmCrmReportStackProps
) {
super(scope, id);
this.config = props;
this.bucket = this.createBucket();
this.deadLetterQueue = this.createDLQ();
this.queue = this.createQueue(this.deadLetterQueue);
this.createEnqueueFirmCrmReportHandler();
this.createFirmCrmReportHandler();
}
private createDLQ() {
const queue = new sqs.Queue(
this,
"FirmCrmReportDeadLetterQueue",
getOverprovisionedDeadLetterQueueProperties()
);
return queue;
}
private createBucket() {
const bucket = new s3.Bucket(this, "FirmCrmReportBucket", {
removalPolicy: cdk.RemovalPolicy.RETAIN,
enforceSSL: true,
versioned: true,
});
return bucket;
}
private createQueue(deadLetterQueue: sqs.Queue) {
const queue = new sqs.Queue(this, "FirmCrmReportQueue", {
...getOverprovisionedQueueProperties(),
visibilityTimeout: cdk.Duration.minutes(6 * this.lambdaTimeoutInMinutes),
deadLetterQueue: {
...getOverprovisionedMaxReceiveCount(),
queue: deadLetterQueue,
},
});
return queue;
}
private createEnqueueFirmCrmReportHandler() {
const handler = new ChocolateLambda(
this,
"createEnqueueFirmCrmReport",
{
account: this.account,
stage: this.config.stage,
region: this.region,
lambdaProps: {
code: lambda.Code.fromAsset(
"./dist/lambdas/enqueue-firm-crm-report"
),
environment: {
NODE_OPTIONS: "--enable-source-maps",
REGION: this.region,
AURORA_CREDENTIALS_ARN: this.config.dbConfig.auroraCredentialsArn,
AURORA_RDS_ARN: this.config.dbConfig.auroraRdsArn,
AURORA_DB_NAME: this.config.dbConfig.auroraDbName,
MONTHLY_FA_FIRM_REPORT_QUEUE_URL: this.queue.queueUrl,
},
timeout: cdk.Duration.minutes(5),
},
}
).getLambda();
this.config.dbConfig.cluster.grantDataApiAccess(handler);
this.queue.grantSendMessages(handler);
new events.Rule(this, "EnqueueFaFirmReportScheduleRule", {
targets: [new targets.LambdaFunction(handler)],
schedule: events.Schedule.expression(
this.config.faFirmReportConfig.executeTimeRule
),
});
}
private createFirmCrmReportHandler() {
const chromeLayer = new lambda.LayerVersion(this, "chromeLayer", {
layerVersionName: "chromeLayer",
code: lambda.Code.fromAsset("./assets/chromium.zip"),
compatibleRuntimes: [lambda.Runtime.NODEJS_16_X],
});
const handler = new ChocolateLambda(
this,
"generateFirmCrmReportHandler",
{
account: this.account,
stage: this.config.stage,
region: this.region,
lambdaProps: {
code: lambda.Code.fromAsset(
"./dist/lambdas/generate-firm-crm-report"
),
layers: [chromeLayer],
timeout: cdk.Duration.minutes(this.lambdaTimeoutInMinutes),
memorySize: 1600,
environment: {
NODE_OPTIONS: "--enable-source-maps",
REGION: this.region,
STAGE: this.config.stage,
AURORA_CREDENTIALS_ARN: this.config.dbConfig.auroraCredentialsArn,
AURORA_RDS_ARN: this.config.dbConfig.auroraRdsArn,
AURORA_DB_NAME: this.config.dbConfig.auroraDbName,
BUCKET_NAME: this.bucket.bucketName,
},
},
}
).getLambda();
this.config.dbConfig.cluster.grantDataApiAccess(handler);
this.bucket.grantPut(handler);
new SqsToLambda(this, "SqsToFirmCrmReportHandler", {
existingLambdaObj: handler,
existingQueueObj: this.queue,
sqsEventSourceProps: {
...getDefaultLambdaSqsEventSourceProperties(),
batchSize: 1,
},
});
}
}
Editor is loading...