feast-acquisition-events.cloudformation.yaml (429 lines of code) (raw):
AWSTemplateFormatVersion: 2010-09-09
Description: FeastAcquisitionEventsLambdas
Transform: AWS::Serverless-2016-10-31
Parameters:
MobileAccountId:
Type: AWS::SSM::Parameter::Value<String>
Default: 'mobileAccountId'
Stack:
Description: Stack name
Type: String
App:
Description: Application name
Type: String
Stage:
Description: Stage name
Type: String
AllowedValues:
- CODE
- PROD
DeployBucket:
Description: Bucket where RiffRaff uploads artifacts on deploy
Type: String
AlarmTopic:
Description: The ARN of the SNS topic to send all the cloudwatch alarms to
Type: String
Mappings:
StageVariables:
CODE:
AlarmActionsEnabled: FALSE
PROD:
AlarmActionsEnabled: TRUE
Conditions:
IsCode: !Equals [!Ref "Stage", "CODE"]
IsProd: !Equals [!Ref "Stage", "PROD"]
Resources:
FeastAppleAcquisitionEventsQueue:
Type: AWS::SQS::Queue
Properties:
QueueName: !Sub ${App}-${Stage}-feast-apple-acquisition-events-queue
RedrivePolicy:
deadLetterTargetArn: !GetAtt FeastAppleAcquisitionEventsDlq.Arn
maxReceiveCount: 5
Tags:
- Key: gu:repo
Value: guardian/mobile-purchases
- Key: App
Value: !Ref App
- Key: Stack
Value: !Ref Stack
- Key: Stage
Value: !Ref Stage
VisibilityTimeout: 300
UpdateReplacePolicy: Delete
DeletionPolicy: Delete
FeastAppleAcquisitionEventsDlq:
Type: AWS::SQS::Queue
Properties:
QueueName: !Sub ${App}-${Stage}-feast-apple-acquisition-events-dlq
Tags:
- Key: gu:repo
Value: guardian/mobile-purchases
- Key: App
Value: !Ref App
- Key: Stack
Value: !Ref Stack
- Key: Stage
Value: !Ref Stage
FeastAppleAcquisitionEventsDlqDepthAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
ActionsEnabled:
!FindInMap [ StageVariables, !Ref Stage, AlarmActionsEnabled ]
AlarmDescription: "Ensure that the feast apple acquisition events dead letter queue is empty"
Namespace: "AWS/SQS"
MetricName: ApproximateNumberOfMessagesVisible
Dimensions:
- Name: QueueName
Value: !GetAtt "FeastAppleAcquisitionEventsDlq.QueueName"
Period: 60
Statistic: Sum
EvaluationPeriods: 1
ComparisonOperator: GreaterThanThreshold
Threshold: 0
AlarmActions:
- Ref: AlarmTopic
OKActions:
- Ref: AlarmTopic
TreatMissingData: notBreaching
Tags:
- Key: App
Value: mobile-purchases-feast-apple-acquisition-events
FeastGoogleAcquisitionEventsQueue:
Type: AWS::SQS::Queue
Properties:
QueueName: !Sub ${App}-${Stage}-feast-google-acquisition-events-queue
RedrivePolicy:
deadLetterTargetArn: !GetAtt FeastGoogleAcquisitionEventsDlq.Arn
maxReceiveCount: 5
Tags:
- Key: gu:repo
Value: guardian/mobile-purchases
- Key: App
Value: !Ref App
- Key: Stack
Value: !Ref Stack
- Key: Stage
Value: !Ref Stage
VisibilityTimeout: 300
UpdateReplacePolicy: Delete
DeletionPolicy: Delete
FeastGoogleAcquisitionEventsDlq:
Type: AWS::SQS::Queue
Properties:
QueueName: !Sub ${App}-${Stage}-feast-google-acquisition-events-dlq
Tags:
- Key: gu:repo
Value: guardian/mobile-purchases
- Key: App
Value: !Ref App
- Key: Stack
Value: !Ref Stack
- Key: Stage
Value: !Ref Stage
FeastGoogleAcquisitionEventsDlqDepthAlarm:
Type: AWS::CloudWatch::Alarm
Properties:
ActionsEnabled:
!FindInMap [ StageVariables, !Ref Stage, AlarmActionsEnabled ]
AlarmDescription: "Ensure that the feast google acquisition events dead letter queue is empty"
Namespace: "AWS/SQS"
MetricName: ApproximateNumberOfMessagesVisible
Dimensions:
- Name: QueueName
Value: !GetAtt "FeastGoogleAcquisitionEventsDlq.QueueName"
Period: 60
Statistic: Sum
EvaluationPeriods: 1
ComparisonOperator: GreaterThanThreshold
Threshold: 0
AlarmActions:
- Ref: AlarmTopic
OKActions:
- Ref: AlarmTopic
TreatMissingData: notBreaching
Tags:
- Key: App
Value: mobile-purchases-feast-google-acquisition-events
FeastAcquisitionEventsLambdaServiceRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Statement:
- Action: sts:AssumeRole
Effect: Allow
Principal:
Service: lambda.amazonaws.com
Version: '2012-10-17'
ManagedPolicyArns:
- !Join
- ''
- - 'arn:'
- !Ref AWS::Partition
- ':iam::aws:policy/service-role/AWSLambdaBasicExecutionRole'
Tags:
- Key: App
Value: !Ref App
- Key: gu:repo
Value: guardian/mobile-purchases
- Key: Stack
Value: !Ref Stack
- Key: Stage
Value: !Ref Stage
FeastAcquisitionEventsLambdaServiceRoleDefaultPolicy:
Type: AWS::IAM::Policy
Properties:
PolicyName: FeastAcquisitionEventsLambdaServiceRoleDefaultPolicy
PolicyDocument:
Statement:
- Action:
- sqs:ReceiveMessage
- sqs:ChangeMessageVisibility
- sqs:GetQueueUrl
- sqs:DeleteMessage
- sqs:GetQueueAttributes
Effect: Allow
Resource:
- !GetAtt FeastAppleAcquisitionEventsQueue.Arn
- !GetAtt FeastGoogleAcquisitionEventsQueue.Arn
- Action:
- s3:GetObject*
- s3:GetBucket*
- s3:List*
Effect: Allow
Resource:
- !Join
- ''
- - 'arn:'
- !Ref AWS::Partition
- ':s3:::'
- !Ref DeployBucket
- !Join
- ''
- - 'arn:'
- !Ref AWS::Partition
- ':s3:::'
- !Ref DeployBucket
- !Sub ${Stack}/${Stage}/${App}-feast-apple-acquisition-events/${App}-feast-acquisition-events-router.zip
- !Join
- ''
- - 'arn:'
- !Ref AWS::Partition
- ':s3:::'
- !Ref DeployBucket
- !Sub ${Stack}/${Stage}/${App}-feast-apple-acquisition-events/${App}-feast-apple-acquisition-events.zip
- !Join
- ''
- - 'arn:'
- !Ref AWS::Partition
- ':s3:::'
- !Ref DeployBucket
- !Sub ${Stack}/${Stage}/${App}-feast-google-acquisition-events/${App}-feast-google-acquisition-events.zip
- Action: ssm:GetParametersByPath
Effect: Allow
Resource: !Join
- ''
- - 'arn:aws:ssm:'
- !Ref AWS::Region
- ':'
- !Ref AWS::AccountId
- ':parameter/PROD/mobile/feast-acquisition-events-router'
- ':parameter/PROD/mobile/feast-apple-acquisition-events'
- ':parameter/PROD/mobile/feast-google-acquisition-events'
- Action:
- ssm:GetParameters
- ssm:GetParameter
Effect: Allow
Resource: !Join
- ''
- - 'arn:aws:ssm:'
- !Ref AWS::Region
- ':'
- !Ref AWS::AccountId
- ':parameter/PROD/mobile/feast-acquisition-events-router/*'
- ':parameter/PROD/mobile/feast-apple-acquisition-events/*'
- ':parameter/PROD/mobile/feast-google-acquisition-events/*'
- Action:
- ssm:GetParametersByPath
Effect: Allow
Resource: !Sub arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/${App}/${Stage}/${Stack}/*
- Action:
- s3:GetObject
Effect: Allow
Resource: !Sub arn:aws:s3:::gu-mobile-access-tokens/${Stage}/google-play-developer-api/*
Version: '2012-10-17'
Roles:
- !Ref FeastAcquisitionEventsLambdaServiceRole
FeastAcquisitionEventsRouterLambda:
Type: AWS::Serverless::Function
Properties:
Handler: feast-acquisition-events-router.handler
Runtime: nodejs20.x
CodeUri:
Bucket: !Ref DeployBucket
Key: !Sub ${Stack}/${Stage}/${App}-feast-acquisition-events-router/feast-acquisition-events-router.zip
FunctionName: !Sub ${App}-feast-acquisition-events-router-${Stage}
Environment:
Variables:
App: !Sub ${App}
Stack: !Sub ${Stack}
Stage: !Sub ${Stage}
MobileAccountId: !Sub ${MobileAccountId}
Description: A lambda triggered by DynamoDB input actions to identify Feast subscriptions and write to the corresponding queue.
MemorySize: 512
Timeout: 60
Events:
Schedule:
Type: DynamoDB
Properties:
Stream:
Fn::ImportValue: !Sub ${App}-${Stage}-user-subscriptions-stream-arn
StartingPosition: LATEST
MaximumRetryAttempts: 10
Tags:
Stage: !Ref Stage
Stack: !Ref Stack
App: !Ref App
Policies:
- Statement:
- Effect: Allow
Action:
- "dynamodb:Query"
- "dynamodb:GetItem"
Resource:
- !Sub arn:aws:dynamodb:${AWS::Region}:${AWS::AccountId}:table/${App}-${Stage}-subscriptions
- !Sub arn:aws:dynamodb:${AWS::Region}:${AWS::AccountId}:table/${App}-${Stage}-subscriptions/*
- Statement:
- Effect: Allow
Action:
- ssm:GetParametersByPath
Resource: !Sub arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/${App}/${Stage}/${Stack}/*
- Statement:
- Effect: Allow
Action:
- "dynamodb:GetRecords"
- "dynamodb:GetShardIterator"
- "dynamodb:DescribeStream"
- "dynamodb:ListStreams"
Resource:
- Fn::ImportValue: !Sub ${App}-${Stage}-user-subscriptions-stream-arn
- Statement:
- Effect: Allow
Action:
- sqs:SendMessage
Resource:
- !GetAtt FeastAppleAcquisitionEventsQueue.Arn
- !GetAtt FeastGoogleAcquisitionEventsQueue.Arn
DependsOn:
- FeastAcquisitionEventsLambdaServiceRoleDefaultPolicy
- FeastAcquisitionEventsLambdaServiceRole
FeastAppleAcquisitionEventsLambda:
Type: AWS::Lambda::Function
Properties:
Code:
S3Bucket: !Ref DeployBucket
S3Key: !Sub ${Stack}/${Stage}/${App}-feast-apple-acquisition-events/feast-apple-acquisition-events.zip
Description: An SQS triggered lambda to process acquisition events for iOS devices and write to event buffer.
Environment:
Variables:
App: !Ref App
Stack: !Ref Stack
Stage: !Ref Stage
FunctionName: !Sub ${App}-feast-apple-acquisition-events-${Stage}
Handler: feast-apple-acquisition-events.handler
MemorySize: 1024
Role: !GetAtt FeastAcquisitionEventsLambdaServiceRole.Arn
Runtime: nodejs20.x
Tags:
- Key: App
Value: !Ref App
- Key: gu:repo
Value: guardian/mobile-purchases
- Key: Stack
Value: !Ref Stack
- Key: Stage
Value: !Ref Stage
Timeout: 300
DependsOn:
- FeastAcquisitionEventsLambdaServiceRoleDefaultPolicy
- FeastAcquisitionEventsLambdaServiceRole
FeastGoogleAcquisitionEventsLambda:
Type: AWS::Lambda::Function
Properties:
Code:
S3Bucket: !Ref DeployBucket
S3Key: !Sub ${Stack}/${Stage}/${App}-feast-google-acquisition-events/feast-google-acquisition-events.zip
Description: An SQS triggered lambda to process acquisition events for android devices and write to event buffer.
Environment:
Variables:
App: !Ref App
Stack: !Ref Stack
Stage: !Ref Stage
FunctionName: !Sub ${App}-feast-google-acquisition-events-${Stage}
Handler: feast-google-acquisition-events.handler
MemorySize: 1024
Role: !GetAtt FeastAcquisitionEventsLambdaServiceRole.Arn
Runtime: nodejs20.x
Tags:
- Key: App
Value: !Ref App
- Key: gu:repo
Value: guardian/mobile-purchases
- Key: Stack
Value: !Ref Stack
- Key: Stage
Value: !Ref Stage
Timeout: 300
DependsOn:
- FeastAcquisitionEventsLambdaServiceRoleDefaultPolicy
- FeastAcquisitionEventsLambdaServiceRole
FeastAppleAcquisitionEventsSqsEventSource:
Type: AWS::Lambda::EventSourceMapping
Properties:
EventSourceArn: !GetAtt FeastAppleAcquisitionEventsQueue.Arn
FunctionName: !Ref FeastAppleAcquisitionEventsLambda
FunctionResponseTypes:
- ReportBatchItemFailures
FeastGoogleAcquisitionEventsSqsEventSource:
Type: AWS::Lambda::EventSourceMapping
Properties:
EventSourceArn: !GetAtt FeastGoogleAcquisitionEventsQueue.Arn
FunctionName: !Ref FeastGoogleAcquisitionEventsLambda
FunctionResponseTypes:
- ReportBatchItemFailures
FeastAcquisitionEventsLambdaS3inlinepolicy:
Type: AWS::IAM::Policy
Properties:
PolicyDocument:
Statement:
- Action: s3:GetObject
Effect: Allow
Resource:
- !Sub arn:aws:s3:::mobile-dist/mobile/${Stage}/${App}-feast-acquisition-events-router/
- !Sub arn:aws:s3:::mobile-dist/mobile/${Stage}/${App}-feast-apple-acquisition-events/
- !Sub arn:aws:s3:::mobile-dist/mobile/${Stage}/${App}-feast-google-acquisition-events/
Version: '2012-10-17'
PolicyName: S3inlinepolicy
Roles:
- !Ref FeastAcquisitionEventsLambdaServiceRole
FeastAcquisitionEventsLambdaSecretManagerAccessPolicy:
Type: AWS::IAM::Policy
Properties:
PolicyDocument:
Statement:
- Action: secretsmanager:GetSecretValue
Effect: Allow
Resource:
- !Join
- ''
- - 'arn:aws:secretsmanager:'
- !Ref AWS::Region
- ':'
- !Ref AWS::AccountId
- !Sub :secret:${Stage}/${App}-feast-acquisition-events-router/*
- !Sub :secret:${Stage}/${App}-feast-apple-acquisition-events/*
- !Sub :secret:${Stage}/${App}-feast-google-acquisition-events/*
Version: '2012-10-17'
PolicyName: Secretmanageraccesspolicy79659139
Roles:
- !Ref FeastAcquisitionEventsLambdaServiceRole