diff --git a/aws/README.md b/aws/README.md index 650afc7..3125637 100644 --- a/aws/README.md +++ b/aws/README.md @@ -75,3 +75,5 @@ AWS_PROFILE=cloud-snitch-dev npx cdk deploy '*-dev' ## Observability The CDK deploys a CloudWatch dashboard in us-east-1 with key metrics for all regions. + +Alarms are created in each region and will send notifications to an SNS topic in each region. To receive notifications, you should subscribe to the SNS topic in each region. diff --git a/aws/lib/regional-stack.ts b/aws/lib/regional-stack.ts index c8f72a2..6a8d00e 100644 --- a/aws/lib/regional-stack.ts +++ b/aws/lib/regional-stack.ts @@ -5,6 +5,8 @@ import { aws_certificatemanager as acm, aws_cloudfront as cloudfront, aws_cloudfront_origins as origins, + aws_cloudwatch as cw, + aws_cloudwatch_actions as cw_actions, aws_ecr_assets as ecr_assets, aws_events as events, aws_events_targets as events_targets, @@ -16,6 +18,7 @@ import { aws_s3 as s3, aws_s3_deployment as s3deploy, aws_ses as ses, + aws_sns as sns, aws_sqs as sqs, aws_route53_targets as route53_targets, Duration, @@ -64,6 +67,8 @@ export class RegionalStack extends Stack { constructor(scope: Construct, id: string, props: Props) { super(scope, id, props); + const alarmTopic = new sns.Topic(this, 'AlarmTopic'); + // Unfortunately CloudFormation templates must be made available via public S3 bucket: // https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudformation-stack.html#cfn-cloudformation-stack-templateurl const publicS3BucketName = @@ -123,6 +128,12 @@ export class RegionalStack extends Stack { const dlq = new sqs.Queue(this, 'DeadLetterQueue', { queueName: `${queueName}-DLQ`, }); + const dlqAlarm = new cw.Alarm(this, 'DeadLetterQueueAlarm', { + metric: dlq.metricApproximateNumberOfMessagesVisible(), + threshold: 1, + evaluationPeriods: 1, + }); + dlqAlarm.addAlarmAction(new cw_actions.SnsAction(alarmTopic)); const queue = new sqs.Queue(this, 'Queue', { deadLetterQueue: { @@ -255,6 +266,12 @@ export class RegionalStack extends Stack { const dlq = new sqs.Queue(this, 'StripeEventHandlerDLQ', { queueName: `CloudSnitchStripeEventHandler-DLQ`, }); + const dlqAlarm = new cw.Alarm(this, 'StripeEventHandlerDLQAlarm', { + metric: dlq.metricApproximateNumberOfMessagesVisible(), + threshold: 1, + evaluationPeriods: 1, + }); + dlqAlarm.addAlarmAction(new cw_actions.SnsAction(alarmTopic)); const stripeEventHandler = new lambda.DockerImageFunction(this, 'StripeEventHandler', { architecture: lambda.Architecture.ARM_64,