football/cfn.yaml (24 lines of code) (raw):
AWSTemplateFormatVersion: 2010-09-09
Description: mobile-notifications-football
Parameters:
Stack:
Description: Stack name
Type: String
Default: mobile-notifications
App:
Description: Application name
Type: String
Default: football
Stage:
Description: Stage name
Type: String
AllowedValues:
- CODE
- PROD
Default: CODE
DeployBucket:
Description: Bucket where RiffRaff uploads artifacts on deploy
Type: String
Default: mobile-dist
DynamoNotificationTopic:
Description: SNS topic to notify when there's a dynamo throttling event
Type: String
Resources:
ExecutionRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Statement:
- Effect: Allow
Principal:
Service:
- lambda.amazonaws.com
Action: sts:AssumeRole
Path: /
Policies:
- PolicyName: logs
PolicyDocument:
Statement:
Effect: Allow
Action:
- logs:CreateLogGroup
- logs:CreateLogStream
- logs:PutLogEvents
Resource: arn:aws:logs:*:*:*
- PolicyName: lambda
PolicyDocument:
Statement:
Effect: Allow
Action:
- lambda:InvokeFunction
Resource: "*"
- PolicyName: ssmConfig
PolicyDocument:
Statement:
Effect: Allow
Action:
- ssm:GetParametersByPath
Resource: !Sub arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/${App}/${Stage}/${Stack}
- PolicyName: dynamodb
PolicyDocument:
Statement:
Effect: Allow
Action:
- dynamodb:PutItem
- dynamodb:UpdateItem
- dynamodb:Query
Resource: !Sub arn:aws:dynamodb:eu-west-1:201359054765:table/${Stack}-${App}-notifications-${Stage}
Lambda:
Type: AWS::Lambda::Function
Properties:
FunctionName: !Sub ${Stack}-${App}-${Stage}
Code:
S3Bucket:
Ref: DeployBucket
S3Key: !Sub ${Stack}/${Stage}/${App}/${App}.jar
Environment:
Variables:
App: !Ref App
Stack: !Ref Stack
Stage: !Ref Stage
Description: Send Goal Alert notifications
Handler: com.gu.mobile.notifications.football.Lambda::handler
MemorySize: 1024
Role: !GetAtt ExecutionRole.Arn
Runtime: java11
Timeout: 60
MinuteEvent:
Type: AWS::Events::Rule
Properties:
Description: Event sent to poll PA for match events
ScheduleExpression: cron(* * * * ? *)
Targets:
- Id: Lambda
Arn: !GetAtt Lambda.Arn
MinuteEventLambdaPermission:
Type: AWS::Lambda::Permission
Properties:
Action: lambda:InvokeFunction
FunctionName: !GetAtt Lambda.Arn
Principal: events.amazonaws.com
SourceArn: !GetAtt MinuteEvent.Arn
GoalEvent:
Type: AWS::Logs::MetricFilter
Properties:
LogGroupName: !Sub "/aws/lambda/${Lambda}"
FilterPattern: "successfully sent"
MetricTransformations:
- MetricNamespace: !Sub "${Stage}/football-notifications"
MetricName: "goal-success"
MetricValue: 1
ErrorEvent:
Type: AWS::Logs::MetricFilter
Properties:
LogGroupName: !Sub "/aws/lambda/${Lambda}"
FilterPattern: "Error"
MetricTransformations:
- MetricNamespace: !Sub "${Stage}/football-notifications"
MetricName: "error"
MetricValue: 1
DynamoTable:
Type: AWS::DynamoDB::Table
Properties:
TableName: !Sub ${Stack}-${App}-notifications-${Stage}
AttributeDefinitions:
- AttributeName: notificationId
AttributeType: S
KeySchema:
- AttributeName: notificationId
KeyType: HASH
ProvisionedThroughput:
ReadCapacityUnits: 3
WriteCapacityUnits: 3
TimeToLiveSpecification:
AttributeName: ttl
Enabled: true
Tags:
- Key: devx-backup-enabled
Value: true
MobileNotificationsFootballConsumedReadThrottleEvents:
Type: AWS::CloudWatch::Alarm
Properties:
Namespace: AWS/DynamoDB
MetricName: ReadThrottleEvents
Unit: Count
Statistic: Sum
ComparisonOperator: GreaterThanOrEqualToThreshold
Dimensions:
- Name: TableName
Value: !Ref DynamoTable
Threshold: 10
Period: 300
EvaluationPeriods: 1
AlarmActions: [ !Ref DynamoNotificationTopic ]
TreatMissingData: notBreaching
MobileNotificationsFootballConsumedWriteThrottleEvents:
Type: AWS::CloudWatch::Alarm
Properties:
Namespace: AWS/DynamoDB
MetricName: WriteThrottleEvents
Unit: Count
Statistic: Sum
ComparisonOperator: GreaterThanOrEqualToThreshold
Dimensions:
- Name: TableName
Value: !Ref DynamoTable
Threshold: 10
Period: 300
EvaluationPeriods: 1
AlarmActions: [ !Ref DynamoNotificationTopic ]
TreatMissingData: notBreaching