handlers/catalog-service/cfn.yaml (195 lines of code) (raw):

AWSTemplateFormatVersion: "2010-09-09" Description: Reads the product catalog from Zuora and stores it in S3 Parameters: Stage: Description: Stage name Type: String AllowedValues: - CODE - PROD Default: CODE Mappings: StageVariables: CODE: ReadableS3Buckets: - arn:aws:s3:::gu-reader-revenue-private/membership/support-service-lambdas/CODE/zuoraRest-CODE.*.json WriteableS3Buckets: - arn:aws:s3:::gu-zuora-catalog/CODE/* PROD: ReadableS3Buckets: - arn:aws:s3:::gu-reader-revenue-private/membership/support-service-lambdas/CODE/zuoraRest-CODE.*.json - arn:aws:s3:::gu-reader-revenue-private/membership/support-service-lambdas/PROD/zuoraRest-PROD.*.json WriteableS3Buckets: - arn:aws:s3:::gu-zuora-catalog/PROD/* Conditions: CreateProdOnlyResources: !Equals [ !Ref Stage, PROD ] Resources: CatalogServiceRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Statement: - Effect: Allow Principal: Service: - lambda.amazonaws.com Action: - sts:AssumeRole Path: / Policies: - PolicyName: LambdaPolicy PolicyDocument: Statement: - Effect: Allow Action: - logs:CreateLogGroup - logs:CreateLogStream - logs:PutLogEvents - lambda:InvokeFunction Resource: - !Sub arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/lambda/catalog-service-zuora-code-${Stage}:log-stream:* - !Sub arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/lambda/catalog-service-zuora-prod-${Stage}:log-stream:* - PolicyName: ReadPrivateCredentials PolicyDocument: Statement: - Effect: Allow Action: s3:GetObject Resource: !FindInMap [StageVariables, !Ref Stage, ReadableS3Buckets] - Effect: Allow Action: s3:PutObject Resource: !FindInMap [StageVariables, !Ref Stage, WriteableS3Buckets] CODECatalogServiceLambda: Type: AWS::Lambda::Function Properties: Description: Reads the product catalog from CODE Zuora and stores it in S3 FunctionName: !Sub catalog-service-zuora-code-${Stage} Code: S3Bucket: subscriptions-dist S3Key: !Sub subscriptions/${Stage}/catalog-service/catalog-service.jar Handler: com.gu.catalogService.Handler::apply Environment: Variables: Stage: !Ref Stage ZuoraEnvironment: CODE Role: !GetAtt CatalogServiceRole.Arn MemorySize: 1536 Runtime: java21 Timeout: 300 Architectures: - arm64 DependsOn: - CatalogServiceRole CODECatalogServiceLambdaInvokePermission: Type: AWS::Lambda::Permission Properties: Action: lambda:invokeFunction FunctionName: !Ref CODECatalogServiceLambda Principal: events.amazonaws.com SourceArn: !GetAtt CatalogServiceScheduler.Arn DependsOn: - CODECatalogServiceLambda - CatalogServiceScheduler CatalogServiceScheduler: Type: "AWS::Events::Rule" Properties: Description: Triggers the CODE Catalog Service Lambda on a schedule Name: !Sub catalog-service-scheduler-zuora-code-${Stage} ScheduleExpression: rate(10 minutes) #https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html#RateExpressions Targets: - Arn: !GetAtt CODECatalogServiceLambda.Arn Id: !Ref CODECatalogServiceLambda DependsOn: - CODECatalogServiceLambda CatalogS3Bucket: Type: "AWS::S3::Bucket" Condition: CreateProdOnlyResources Properties: AccessControl: Private BucketName: gu-zuora-catalog VersioningConfiguration: Status: Enabled DeletionPolicy: Retain PRODCatalogServiceLambda: Type: AWS::Lambda::Function Properties: Description: Reads the product catalog from PROD Zuora and stores it in S3 FunctionName: !Sub catalog-service-zuora-prod-${Stage} Code: S3Bucket: subscriptions-dist S3Key: !Sub subscriptions/${Stage}/catalog-service/catalog-service.jar Handler: com.gu.catalogService.Handler::apply Environment: Variables: Stage: !Ref Stage ZuoraEnvironment: PROD Role: !GetAtt CatalogServiceRole.Arn MemorySize: 1536 Runtime: java21 Timeout: 300 Architectures: - arm64 DependsOn: - CatalogServiceRole PRODCatalogServiceLambdaInvokePermission: Type: AWS::Lambda::Permission Condition: CreateProdOnlyResources Properties: Action: lambda:invokeFunction FunctionName: !Ref PRODCatalogServiceLambda Principal: events.amazonaws.com SourceArn: !GetAtt ProdCatalogServiceScheduler.Arn DependsOn: - PRODCatalogServiceLambda - ProdCatalogServiceScheduler ProdCatalogServiceScheduler: Type: "AWS::Events::Rule" Condition: CreateProdOnlyResources Properties: Description: Triggers the PROD Catalog Service Lambda on a schedule Name: !Sub catalog-service-scheduler-zuora-prod-${Stage} ScheduleExpression: rate(10 minutes) #https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html#RateExpressions Targets: - Arn: !GetAtt PRODCatalogServiceLambda.Arn Id: !Sub PRODCatalogServiceLambda DependsOn: - PRODCatalogServiceLambda StaleProdCatalogAlarm: Type: AWS::CloudWatch::Alarm Condition: CreateProdOnlyResources Properties: AlarmActions: - Fn::Sub: arn:aws:sns:${AWS::Region}:${AWS::AccountId}:alarms-handler-topic-PROD AlarmName: High error rate when fetching PROD Zuora Catalog ComparisonOperator: GreaterThanOrEqualToThreshold Dimensions: - Name: FunctionName Value: !Ref PRODCatalogServiceLambda EvaluationPeriods: 18 MetricName: Errors Namespace: AWS/Lambda Period: 300 Statistic: Sum Threshold: 1 TreatMissingData: notBreaching StaleCodeCatalogAlarm: Type: AWS::CloudWatch::Alarm Condition: CreateProdOnlyResources Properties: AlarmActions: - Fn::Sub: arn:aws:sns:${AWS::Region}:${AWS::AccountId}:alarms-handler-topic-PROD AlarmName: High error rate when fetching CODE Zuora Catalog ComparisonOperator: GreaterThanOrEqualToThreshold Dimensions: - Name: FunctionName Value: !Ref CODECatalogServiceLambda EvaluationPeriods: 18 MetricName: Errors Namespace: AWS/Lambda Period: 300 Statistic: Sum Threshold: 1 TreatMissingData: notBreaching