cloudformation/cfn.yaml (118 lines of code) (raw):
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Anghammarad Lambda and SNS topic
Parameters:
ArtifactBucket:
Description: S3 bucket containing the Lambda's artifact
Type: String
ArtifactLocation:
Description: S3 path to the Lambda's artifact
Type: String
ConfigBucket:
Description: S3 bucket containing the configuration
Type: String
Stage:
Description: Application stage (e.g. PROD, CODE)
Type: String
AllowedValues:
- PROD
- CODE
- DEV
AllowedAWSAccountIDs:
Description: List of AWS account IDs to grant SNS Publish permission to
Type: CommaDelimitedList
SendAlarmNotifications:
Type: String
Default: TRUE
AllowedValues:
- TRUE
- FALSE
Mappings:
Constants:
Stack:
Value: deploy
App:
Value: anghammarad
Resources:
DeadLetterQueue:
Type: AWS::SQS::Queue
Properties:
QueueName: !Sub anghammarad-${Stage}-dead-letters
KmsMasterKeyId: alias/aws/sqs
ProcessorFunction:
Type: AWS::Serverless::Function
Properties:
FunctionName: !Sub anghammarad-${Stage}
Description: !Sub Process Anghammarad ${Stage} notifications
Policies:
- Statement:
- Effect: Allow
Action:
- ses:SendEmail
Resource: "*"
- Statement:
- Effect: Allow
Action:
- s3:GetObject
Resource: !Sub arn:aws:s3:::${ConfigBucket}/*
Handler: com.gu.anghammarad.Lambda::handleRequest
Runtime: java21
MemorySize: 512
Timeout: 30
CodeUri:
Bucket: !Ref ArtifactBucket
Key: !Ref ArtifactLocation
Events:
Notification:
Type: SNS
Properties:
Topic: !Ref NotificationTopic
Environment:
Variables:
Stage: !Ref Stage
Tags:
Stack: !FindInMap [ Constants, Stack, Value ]
App: !FindInMap [ Constants, App, Value ]
Stage: !Ref Stage
DeadLetterQueue:
TargetArn: !GetAtt DeadLetterQueue.Arn
Type: SQS
NotificationTopic:
Type: AWS::SNS::Topic
Properties:
DisplayName: !Sub Anghammarad ${Stage} notification topic
NotificationTopicPolicy:
Type: "AWS::SNS::TopicPolicy"
Properties:
PolicyDocument:
Statement:
- Effect: Allow
Action:
- SNS:Publish
Principal:
AWS: !Ref AllowedAWSAccountIDs
Resource: "*"
Topics:
- !Ref NotificationTopic
DlqDepthAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmDescription: !Sub |
Triggers if Anghammarad failed to process some messages in ${Stage}.
For suggested actions, see: https://docs.google.com/document/d/1cDd9mVAKFAYibuBPiCw4HkSCl16dG5zSu0qdSXDPuSE/edit#
Namespace: AWS/SQS
MetricName: ApproximateNumberOfMessagesVisible
Dimensions:
- Name: QueueName
Value: !GetAtt DeadLetterQueue.QueueName
Period: 60
Statistic: Sum
EvaluationPeriods: 1
ComparisonOperator: GreaterThanThreshold
Threshold: 0
AlarmActions: [ !Sub "arn:aws:sns:${AWS::Region}:${AWS::AccountId}:devx-sec-ops-reliability-alerts" ]
ActionsEnabled: !Ref SendAlarmNotifications
TreatMissingData: notBreaching
Outputs:
TopicName:
Value: !GetAtt NotificationTopic.TopicName