handlers/holiday-stop-processor/cfn.yaml (152 lines of code) (raw):

AWSTemplateFormatVersion: "2010-09-09" Description: Updates subscriptions with outstanding holiday stops. Parameters: Stage: Description: Stage name Type: String AllowedValues: - CODE - PROD Default: CODE Conditions: IsProd: !Equals [!Ref "Stage", "PROD"] Mappings: StageMap: CODE: FulfilmentDatesBucketUrn: "arn:aws:s3:::fulfilment-date-calculator-code/*" ScheduleName: holiday-stop-processor-schedule-code PROD: FulfilmentDatesBucketUrn: "arn:aws:s3:::fulfilment-date-calculator-prod/*" ScheduleName: holiday-stop-processor-schedule Resources: HolidayStopProcessorRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Statement: - Effect: Allow Principal: Service: - lambda.amazonaws.com Action: - sts:AssumeRole Path: / Policies: - PolicyName: HolidayStopProcessorPolicy PolicyDocument: Statement: - Effect: Allow Action: - lambda:InvokeFunction - logs:CreateLogGroup - logs:CreateLogStream - logs:PutLogEvents Resource: !Sub arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/lambda/holiday-stop-processor-${Stage}:log-stream:* - PolicyName: ReadZuoraCredentials PolicyDocument: Statement: - Effect: Allow Action: s3:GetObject Resource: !Sub arn:aws:s3:::gu-reader-revenue-private/membership/support-service-lambdas/${Stage}/zuoraRest-${Stage}*.json - PolicyName: ReadSalesforceCredentials PolicyDocument: Statement: - Effect: Allow Action: s3:GetObject Resource: !Sub arn:aws:s3:::gu-reader-revenue-private/membership/support-service-lambdas/${Stage}/sfAuth-${Stage}*.json - PolicyName: FulfilmentDatesCalculatorBucket PolicyDocument: Statement: - Effect: Allow Action: s3:GetObject Resource: - !FindInMap [StageMap, !Ref Stage, FulfilmentDatesBucketUrn] HolidayStopProcessor: Type: AWS::Lambda::Function Properties: FunctionName: !Sub holiday-stop-processor-${Stage} Description: Updates subscriptions with outstanding holiday stops. Source - https://github.com/guardian/support-service-lambdas/tree/main/handlers/holiday-stop-processor Code: S3Bucket: support-service-lambdas-dist S3Key: !Sub membership/${Stage}/holiday-stop-processor/holiday-stop-processor.jar Handler: com.gu.holidaystopprocessor.Handler::handle Environment: Variables: Stage: !Ref Stage Role: !GetAtt HolidayStopProcessorRole.Arn MemorySize: 1024 Runtime: java21 Timeout: 900 Architectures: - arm64 DependsOn: - HolidayStopProcessorRole HolidayStopProcessorFailureAlarm: Type: AWS::CloudWatch::Alarm Condition: IsProd Properties: AlarmName: "URGENT 9-5 - PROD: Failed to process holiday stops" AlarmDescription: > IMPACT: If this goes unaddressed at least one subscription that was supposed to be suspended will be fulfilled. Until we document how to deal with likely problems please alert the Value team. For general advice, see https://docs.google.com/document/d/1_3El3cly9d7u_jPgTcRjLxmdG2e919zCLvmcFCLOYAk AlarmActions: - !Sub arn:aws:sns:${AWS::Region}:${AWS::AccountId}:alarms-handler-topic-PROD Metrics: - Id: errors Expression: "FILL(m1,0)" Label: ErrorCount - Id: m1 ReturnData: false MetricStat: Metric: Namespace: AWS/Lambda MetricName: Errors Dimensions: - Name: FunctionName Value: !Ref HolidayStopProcessor Stat: Sum Period: 60 Unit: Count ComparisonOperator: GreaterThanOrEqualToThreshold Threshold: 1 DatapointsToAlarm: 10 EvaluationPeriods: 240 TreatMissingData: notBreaching DependsOn: - HolidayStopProcessor HolidayStopProcessorScheduleRule: Type: AWS::Events::Rule Properties: Description: Trigger processing of holiday stops every 20 mins (to ensure successful processing of all batches within 24 hours) Name: !FindInMap [StageMap, !Ref Stage, ScheduleName] ScheduleExpression: "cron(0/20 * ? * * *)" State: ENABLED Targets: - Arn: !GetAtt HolidayStopProcessor.Arn Id: !Ref HolidayStopProcessor Input: "null" DependsOn: - HolidayStopProcessor HolidayStopProcessorLambdaInvokePermission: Type: AWS::Lambda::Permission Properties: Action: lambda:invokeFunction FunctionName: !Ref HolidayStopProcessor Principal: events.amazonaws.com SourceArn: !GetAtt HolidayStopProcessorScheduleRule.Arn DependsOn: - HolidayStopProcessor - HolidayStopProcessorScheduleRule # As processor runs every 20 mins anyway, there's no need to retry HolidayStopProcessorRetryConfig: Type: AWS::Lambda::EventInvokeConfig Properties: FunctionName: !Ref HolidayStopProcessor MaximumRetryAttempts: 0 Qualifier: '$LATEST' DependsOn: - HolidayStopProcessor