cfn.yaml (182 lines of code) (raw):
Transform: AWS::Serverless-2016-10-31
Description: Publishes Help Centre content from Salesforce Knowledge to manage-frontend.
Parameters:
Stage:
Type: String
AllowedValues:
- PROD
- DEV
- CODE
Default: CODE
AppName:
Type: String
Default: manage-help-content-publisher
Conditions:
IsProd: !Equals [ !Ref Stage, PROD ]
Resources:
LogGroup:
Type: AWS::Logs::LogGroup
Properties:
LogGroupName: !Sub /aws/lambda/${AppName}-${Stage}
RetentionInDays: 90
Lambda:
Type: AWS::Serverless::Function
DependsOn: LogGroup
Properties:
FunctionName: !Sub ${AppName}-${Stage}
Description: >
Codebase: https://github.com/guardian/manage-help-content-publisher.
Policies:
- Statement:
- Sid: S3BucketListPolicy
Effect: Allow
Action:
- s3:ListBucket
Resource:
# It shouldn't be necessary to have a separate list policy but there seems to be a bug in the S3 service somewhere
- arn:aws:s3:::manage-help-content*
- Statement:
- Sid: S3BucketPolicy
Effect: Allow
Action:
- s3:GetObject
- s3:PutObject
Resource:
- !Sub arn:aws:s3:::manage-help-content/${Stage}/*
- Statement:
- Sid: s3Deploy
Effect: Allow
Action: s3:GetObject
Resource:
- arn:aws:s3::*:membership-dist/*
Handler: managehelpcontentpublisher.PublishingHandler::handleRequest
Runtime: java11
CodeUri:
Bucket: membership-dist
Key: !Sub membership/${Stage}/${AppName}/${AppName}.jar
Environment:
Variables:
stage: !Ref Stage
Timeout: 30
MemorySize: 2048
Events:
ApiEvent:
Type: Api
Properties:
Path: /
Method: POST
RestApiId:
Ref: ApiGateway
TakingDownLogGroup:
Type: AWS::Logs::LogGroup
Properties:
LogGroupName: !Sub /aws/lambda/${AppName}-takedown-${Stage}
RetentionInDays: 90
TakingDownLambda:
Type: AWS::Serverless::Function
DependsOn: TakingDownLogGroup
Properties:
FunctionName: !Sub ${AppName}-takedown-${Stage}
Description: >
Codebase: https://github.com/guardian/manage-help-content-publisher.
Policies:
- Statement:
- Sid: S3BucketListPolicy
Effect: Allow
Action:
- s3:ListBucket
Resource:
# It shouldn't be necessary to have a separate list policy but there seems to be a bug in the S3 service somewhere
- arn:aws:s3:::manage-help-content*
- Statement:
- Sid: S3BucketPolicy
Effect: Allow
Action:
- s3:GetObject
- s3:PutObject
- s3:DeleteObject
Resource:
- !Sub arn:aws:s3:::manage-help-content/${Stage}/*
- Statement:
- Sid: s3Deploy
Effect: Allow
Action: s3:GetObject
Resource:
- arn:aws:s3::*:membership-dist/*
Handler: managehelpcontentpublisher.TakingDownHandler::handleRequest
Runtime: java11
CodeUri:
Bucket: membership-dist
Key: !Sub membership/${Stage}/${AppName}/${AppName}.jar
Environment:
Variables:
stage: !Ref Stage
Timeout: 30
MemorySize: 2048
Events:
ApiEvent:
Type: Api
Properties:
Path: /{articlePath}
Method: DELETE
RestApiId:
Ref: ApiGateway
ApiGateway:
Type: AWS::Serverless::Api
DependsOn:
- Lambda
- TakingDownLambda
Properties:
Name: !Sub ${AppName}-${Stage}-api-gateway
StageName: !Sub ${Stage}
Auth:
ApiKeyRequired: true
UsagePlan:
CreateUsagePlan: PER_API
UsagePlanName: !Sub ${AppName}-${Stage}-usage-plan
4xxApiAlarm:
Type: AWS::CloudWatch::Alarm
Condition: IsProd
DependsOn: ApiGateway
Properties:
AlarmActions:
- !Sub arn:aws:sns:${AWS::Region}:${AWS::AccountId}:alarms-handler-topic-PROD
AlarmName: !Sub 4XX rate from ${AppName}-${Stage}
AlarmDescription: >
See https://github.com/guardian/manage-help-content-publisher/blob/main/README.md#Troubleshooting
for troubleshooting tips.
ComparisonOperator: GreaterThanThreshold
Dimensions:
- Name: ApiName
Value: !Sub ${AppName}-${Stage}-api-gateway
- Name: Stage
Value: !Sub ${Stage}
EvaluationPeriods: 1
MetricName: 4XXError
Namespace: AWS/ApiGateway
Period: 3600
Statistic: Sum
Threshold: 1
TreatMissingData: ignore
5xxApiAlarm:
Type: AWS::CloudWatch::Alarm
Condition: IsProd
DependsOn: ApiGateway
Properties:
AlarmActions:
- !Sub arn:aws:sns:${AWS::Region}:${AWS::AccountId}:alarms-handler-topic-PROD
AlarmName: !Sub 5XX rate from ${AppName}-${Stage}
AlarmDescription: >
See https://github.com/guardian/manage-help-content-publisher/blob/main/README.md#Troubleshooting
for troubleshooting tips.
ComparisonOperator: GreaterThanThreshold
Dimensions:
- Name: ApiName
Value: !Sub ${AppName}-${Stage}-api-gateway
- Name: Stage
Value: !Sub ${Stage}
EvaluationPeriods: 1
MetricName: 5XXError
Namespace: AWS/ApiGateway
Period: 3600
Statistic: Sum
Threshold: 1
TreatMissingData: ignore