constructor()

in infrastructure/lib/dataSourceConstruct.ts [34:73]


    constructor(scope: cdk.Construct, id: string) {
        super(scope, id);

        const dataSourceMonitorFunctionRole = new iam.Role(this, 'DataFunctionRole', {
            assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'),
            managedPolicies: [iam.ManagedPolicy.fromAwsManagedPolicyName('service-role/AWSLambdaBasicExecutionRole')],
        });

        this.dataBucket = new s3.Bucket(this, 'DataBucket', {
            blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL,
            encryption: s3.BucketEncryption.S3_MANAGED,
        });

        this.dataBucket.grantRead(dataSourceMonitorFunctionRole);

        this.dataManifestBucket = new s3.Bucket(this, 'DataManifestBucket', {
            blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL,
            versioned: true,
        });

        this.dataManifestBucket.grantWrite(dataSourceMonitorFunctionRole);

        const newDataTopic = new sns.Topic(this, 'NewDataTopic');

        this.dataBucket.addObjectCreatedNotification(new s3Notification.SnsDestination(newDataTopic));

        const dataMonitorFunction = new lambdaNodeJs.NodejsFunction(this, 'DataSourceMonitorFunction', {
            runtime: lambda.Runtime.NODEJS_14_X,
            handler: 'handler',
            entry: path.join(__dirname, '../functions/dataSourceMonitor/index.ts'),
            timeout: cdk.Duration.minutes(1),
            role: dataSourceMonitorFunctionRole,
            reservedConcurrentExecutions: 1,
            environment: {
                DATA_MANIFEST_BUCKET_NAME: this.dataManifestBucket.bucketName,
            },
        });

        newDataTopic.addSubscription(new snsSubscription.LambdaSubscription(dataMonitorFunction));
    }