in cdk/lib/slo-monitoring.ts [17:106]
constructor(scope: App, id: string, props: GuStackProps) {
super(scope, id, props);
const deadLetterQueue = new Queue(this, 'DeadLetterQueue', {
queueName: `notifications-slo-monitoring-dlq-${props.stage}`,
});
const queue = new Queue(this, 'MessageQueue', {
queueName: `notifications-slo-monitoring-${props.stage}`,
visibilityTimeout: Duration.minutes(6),
deadLetterQueue: {
queue: deadLetterQueue,
maxReceiveCount: 1,
},
});
// this advertises the url of the queue to the notifications app
new StringParameter(this, 'SenderQueueSSMParameter', {
parameterName: `/notifications/${props.stage}/mobile-notifications/notifications.queues.sloMonitoring`,
description:
'Queue for SLO Monitoring service. N.B. this parameter is created via cdk',
simpleName: false,
stringValue: queue.queueUrl,
tier: ParameterTier.STANDARD,
dataType: ParameterDataType.TEXT,
});
// this advertises the arn of the queue which can be used by the notifications app cloudformation
new StringParameter(this, 'SenderQueueSSMArnParameter', {
parameterName: `/notifications/${props.stage}/mobile-notifications/notifications.queues.sloMonitoringArn`,
description:
'Arn for the queue for SLO Monitoring service. N.B. this parameter is created via cdk',
simpleName: false,
stringValue: queue.queueArn,
tier: ParameterTier.STANDARD,
dataType: ParameterDataType.TEXT,
});
const sloMonitor = new GuLambdaFunction(this, 'SloMonitor', {
functionName: `mobile-notifications-slo-monitor-${props.stage}`,
fileName: 'slomonitor.jar',
handler: 'com.gu.notifications.slos.SloMonitor::handleMessage',
runtime: Runtime.JAVA_11,
app: 'slomonitor',
timeout: Duration.minutes(5),
});
const policies = [
new PolicyStatement({
actions: ['cloudwatch:PutMetricData'],
resources: ['*'],
}),
new PolicyStatement({
actions: [
'athena:StartQueryExecution',
'athena:GetQueryExecution',
'athena:GetQueryResults',
],
resources: ['*'],
}),
new PolicyStatement({
actions: ['glue:GetDatabase', 'glue:GetTable', 'glue:GetPartitions'],
resources: [
`arn:aws:glue:${this.region}:${this.account}:catalog`,
`arn:aws:glue:${this.region}:${this.account}:database/default`,
`arn:aws:glue:${this.region}:${this.account}:database/notifications`,
`arn:aws:glue:${this.region}:${this.account}:table/notifications/*`,
],
}),
new PolicyStatement({
actions: ['s3:Get*', 's3:List*'],
resources: [
`arn:aws:s3:::aws-mobile-event-logs-${props.stage.toLowerCase()}`,
`arn:aws:s3:::aws-mobile-event-logs-${props.stage.toLowerCase()}/*`,
],
}),
new PolicyStatement({
actions: ['s3:AbortMultipartUpload', 's3:PutObject'],
resources: [
`arn:aws:s3:::aws-mobile-event-logs-${props.stage.toLowerCase()}/athena/slo-monitoring/*`,
],
}),
];
policies.map((policy) => sloMonitor.addToRolePolicy(policy));
queue.grantConsumeMessages(sloMonitor);
sloMonitor.addEventSource(new SqsEventSource(queue, { batchSize: 1 }));
}