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));
}