payment-failure/cloud-formation.yaml (176 lines of code) (raw):
AWSTemplateFormatVersion: 2010-09-09
Description: Stack to enable sending emails to customers with a recurring payment plan whos card is about to expire or failed
Parameters:
Stage:
Description: environment name
Type: String
AllowedValues:
- CODE
- PROD
IdentityPaymentFailureTopic:
Description: Arn of topic that membership workflow publishes payment failure events to
Type: String
IdentityApiEndpoint:
Description: endpoint for the identity API
Type: String
AllowedValues:
- https://idapi.theguardian.com
- https://idapi.code.dev-theguardian.com
IdentityAPIKey:
Description: key used to authenticate against the identity API
Type: String
BrazeAPIEndpoint:
Description: endpoint for the Braze API
Type: String
Default: https://rest.fra-01.braze.eu
BrazeAPIKey:
Description: key used to authenticate against the Braze API
Type: String
SQSQueueUrl:
Description: url of the queue that contains payment failure messages
Type: String
AlarmEmailAddress:
Description: Contact email for alarms
Type: String
Conditions:
IsProd: !Equals
- !Ref 'Stage'
- PROD
Resources:
TopicSendEmail:
Type: AWS::SNS::Topic
Properties:
DisplayName: SendEmailTopic
Subscription:
- Endpoint: !Ref 'AlarmEmailAddress'
Protocol: email
PaymentFailureLambdaRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
Service:
- lambda.amazonaws.com
Action:
- sts:AssumeRole
Policies:
- PolicyName: PaymentFailureLambdaPolicy
PolicyDocument:
Statement:
Effect: Allow
Action:
- lambda:InvokeFunction
Resource: !Sub arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:PaymentFailureLambda-${Stage}
- PolicyName: PaymentFailureLambdaLoggingPolicy
PolicyDocument:
Statement:
Effect: Allow
Action:
- logs:CreateLogGroup
- logs:CreateLogStream
- logs:PutLogEvents
Resource: !Sub arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/lambda/PaymentFailureLambda-${Stage}:log-stream:*
- PolicyName: PaymentFailureQueueReadPolicy
PolicyDocument:
Statement:
Effect: Allow
Action:
- sqs:ReceiveMessage
- sqs:DeleteMessage
- sqs:GetQueueAttributes
Resource: !GetAtt PaymentFailureQueue.Arn
PaymentFailureLambda:
Type: AWS::Lambda::Function
Properties:
Code:
S3Bucket: identity-lambda
S3Key: !Sub identity/${Stage}/payment-failure-lambda/main.jar
Description: Lambda to send emails to customers with a recurring payment plan whos card is about to expire or failed
Environment:
Variables:
idapiHost: !Sub ${IdentityApiEndpoint}
idapiAccessToken: !Sub ${IdentityAPIKey}
brazeApiHost: !Sub ${BrazeAPIEndpoint}
brazeApiKey: !Sub ${BrazeAPIKey}
sqsQueueUrl: !Sub ${SQSQueueUrl}
FunctionName: !Sub PaymentFailureLambda-${Stage}
Handler: com.gu.identity.paymentfailure.Lambda::handler
Role: !GetAtt PaymentFailureLambdaRole.Arn
Runtime: java11
Timeout: 30
MemorySize: 1024
PaymentFailureLambdaLogGroup:
Type: AWS::Logs::LogGroup
Properties:
LogGroupName: !Sub /aws/lambda/${PaymentFailureLambda}
RetentionInDays: 14
PaymentFailureDeadLetterQueue:
Type: AWS::SQS::Queue
Properties:
QueueName: !Sub ${Stage}-payment-failure-dead-letter
PaymentFailureQueue:
Type: AWS::SQS::Queue
Properties:
QueueName: !Sub ${Stage}-payment-failure
RedrivePolicy:
deadLetterTargetArn: !GetAtt PaymentFailureDeadLetterQueue.Arn
maxReceiveCount: 5
DelaySeconds: 120
PaymentFailureSqsWriteRole:
Type: AWS::SQS::QueuePolicy
Properties:
Queues:
- !Ref PaymentFailureQueue
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action: sqs:SendMessage
Principal:
AWS: '*'
Resource: !GetAtt PaymentFailureQueue.Arn
Condition:
ArnEquals:
aws:SourceArn: !Ref IdentityPaymentFailureTopic
PaymentFailureLambdaEventSource:
Type: AWS::Lambda::EventSourceMapping
Properties:
EventSourceArn: !GetAtt PaymentFailureQueue.Arn
FunctionName: !GetAtt PaymentFailureLambda.Arn
PaymentFailureDeadLetterQueueAlert:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmName: !Sub 'payment-failure-lambda-${Stage} Message added to payment failure dead letter queue'
AlarmDescription: Alarm if payment failure dead letter queue grows beyond 1 message
Namespace: AWS/SQS
MetricName: ApproximateNumberOfMessagesVisible
Dimensions:
- Name: QueueName
Value: !GetAtt 'PaymentFailureDeadLetterQueue.QueueName'
Statistic: Sum
Period: '300'
EvaluationPeriods: '1'
Threshold: '0'
ComparisonOperator: GreaterThanThreshold
AlarmActions:
- !If [IsProd, !Ref 'TopicSendEmail', !Ref 'AWS::NoValue']
PaymentFailureQueueLengthAlert:
Type: AWS::CloudWatch::Alarm
Properties:
AlarmName: !Sub 'payment-failure-lambda-${Stage} Too many messages on the payment failure queue'
AlarmDescription: Alarm if payment failure queue grows beyond 300 messages
Namespace: AWS/SQS
MetricName: ApproximateNumberOfMessagesVisible
Dimensions:
- Name: QueueName
Value: !GetAtt 'PaymentFailureQueue.QueueName'
Statistic: Sum
Period: '60'
EvaluationPeriods: '10'
Threshold: '300'
ComparisonOperator: GreaterThanThreshold
AlarmActions:
- !If [IsProd, !Ref 'TopicSendEmail', !Ref 'AWS::NoValue']