cloudformation.yaml (160 lines of code) (raw):

AWSTemplateFormatVersion: '2010-09-09' Description: Lambda for purging fastly cache in response to CAPI updates Parameters: Stack: Description: Stack name Type: String Default: content-api-fastly-cache-purger App: Description: Application name Type: String Default: fastly-cache-purger Stage: Description: Stage name Type: String AllowedValues: - CODE - PROD Default: CODE DeployBucket: Description: Bucket where RiffRaff uploads artifacts on deploy Type: String Default: content-api-dist ConfigBucket: Description: Bucket where app settings are stored Type: String Default: fastly-cache-purger-config KinesisStream: Description: Name of the crier kinesis stream Type: String StreamEFOConsumer: Description: Name of the Enhanced Fan Out consumer for the kinesis (firehose) stream Type: String AlarmTopicSSM: Description: 'Pointer to an SNS topic ARN for Cloudwatch alerts' Type: AWS::SSM::Parameter::Value<String> Default: /account/content-api-common/alarms/urgent-alarm-topic OphanAccountID: Description: 'AWS account/profile ID of Ophan' Type: AWS::SSM::Parameter::Value<String> Default: OphanAccountID Conditions: IsProd: !Equals - !Ref Stage - PROD Resources: Lambda: Type: AWS::Lambda::Function Properties: FunctionName: !Sub "${App}-${Stage}" Description: Fastly cache purger Runtime: java11 Architectures: - arm64 Handler: com.gu.fastly.Lambda::handle MemorySize: 768 Timeout: 30 Role: !GetAtt LambdaRole.Arn ReservedConcurrentExecutions: 10 Tags: - Key: Stack Value: !Ref Stack - Key: Stage Value: !Ref Stage - Key: App Value: !Ref App Code: S3Bucket: !Ref DeployBucket S3Key: !Sub ${Stack}/${Stage}/${App}/${App}.zip LambdaKinesisEvent: Type: AWS::Lambda::EventSourceMapping Properties: BatchSize: 1 EventSourceArn: !If - IsProd - !Sub "arn:aws:kinesis:${AWS::Region}:${AWS::AccountId}:stream/${KinesisStream}/consumer/${StreamEFOConsumer}" - !Sub "arn:aws:kinesis:${AWS::Region}:${AWS::AccountId}:stream/${KinesisStream}" FunctionName: !Ref Lambda StartingPosition: TRIM_HORIZON LambdaRole: Type: AWS::IAM::Role Properties: ManagedPolicyArns: - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole - arn:aws:iam::aws:policy/service-role/AWSLambdaKinesisExecutionRole Policies: - PolicyName: ReadConfigFromBucket PolicyDocument: Statement: Action: - s3:GetObject - s3:ListBucket Resource: !Sub arn:aws:s3:::${ConfigBucket}/* Effect: Allow - PolicyName: AllowPutMetrics PolicyDocument: Statement: Action: - cloudwatch:PutMetricData Resource: "*" Effect: Allow - PolicyName: AllowSNSPublish PolicyDocument: Statement: Action: - sns:Publish Resource: "*" Effect: Allow AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Action: sts:AssumeRole Effect: Allow Principal: Service: lambda.amazonaws.com DecachedContentTopic: Type: AWS::SNS::Topic Properties: TopicName: !Sub "${App}-${Stage}-decached" DisplayName: !Sub '${App}-${Stage}-Decached' DecachedContentTopicPolicy: Type: AWS::SNS::TopicPolicy Properties: Topics: - !Ref DecachedContentTopic PolicyDocument: Statement: - Sid: OphanAccount Effect: Allow Principal: AWS: !Ref 'OphanAccountID' Action: "sns:Subscribe" Resource: !Ref 'DecachedContentTopic' IteratorAgeAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmName: !Sub ${Stack}-${Stage}-iterator-age-alarm AlarmDescription: 'Fastly Cache purger is not keeping up with the Firehose.' Namespace: AWS/Lambda Dimensions: - Name: FunctionName Value: !Ref Lambda MetricName: IteratorAge Statistic: Maximum Period: 60 EvaluationPeriods: 5 Threshold: 180000 ComparisonOperator: GreaterThanThreshold AlarmActions: - !If [ IsProd, !Ref AlarmTopicSSM, !Ref "AWS::NoValue" ] InsufficientDataActions: - !If [ IsProd, !Ref AlarmTopicSSM, !Ref "AWS::NoValue" ] Outputs: DecachedContentSNSTopicARN: Description: ARN of the SNS DecachedContentTopic Value: Ref: DecachedContentTopic Export: Name: !Sub "${AWS::StackName}-DecachedContentSNSTopicARN"