handlers/digital-voucher-api/cfn.yaml (214 lines of code) (raw):
AWSTemplateFormatVersion: "2010-09-09"
Description: API for integrating Imovos digital voucher services
Parameters:
Stage:
Description: Stage name
Type: String
AllowedValues:
- PROD
- CODE
Default: CODE
Conditions:
IsProd: !Equals [ !Ref Stage, PROD ]
Mappings:
StageMap:
CODE:
ApiName: digital-voucher-api-CODE
PROD:
ApiName: digital-voucher-api-PROD
Resources:
DigitalVoucherApiRole:
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/digital-voucher-api-${Stage}:log-stream:*"
- PolicyName: ReadPrivateCredentials
PolicyDocument:
Statement:
- Effect: Allow
Action: s3:GetObject
Resource: !Sub "arn:aws:s3:::gu-reader-revenue-private/membership/support-service-lambdas/${Stage}/*"
- PolicyName: ReadApplicationConfig
PolicyDocument:
Statement:
- Effect: Allow
Action: ssm:GetParametersByPath
Resource: !Sub "arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/${Stage}/membership/support-service-lambdas-shared-imovo"
- PolicyName: DecryptApplicationConfig
PolicyDocument:
Statement:
- Effect: Allow
Action: kms:Decrypt
Resource: !Sub "arn:aws:kms:${AWS::Region}:${AWS::AccountId}:key/302bd430-2d97-4984-8625-b55a70691b49"
DigitalVoucherApi:
Type: "AWS::ApiGateway::RestApi"
Properties:
Description: api for accessing digital voucher in salesforce
Name: !FindInMap [StageMap, !Ref Stage, ApiName]
DigitalVoucherApiPermission:
Type: AWS::Lambda::Permission
Properties:
Action: lambda:invokeFunction
FunctionName: !Sub digital-voucher-api-${Stage}
Principal: apigateway.amazonaws.com
DependsOn: DigitalVoucherApiLambda
DigitalVoucherApiLambda:
Type: AWS::Lambda::Function
Properties:
Description: api for accessing digital voucher in salesforce
FunctionName:
!Sub digital-voucher-api-${Stage}
Code:
S3Bucket: support-service-lambdas-dist
S3Key: !Sub membership/${Stage}/digital-voucher-api/digital-voucher-api.jar
Handler: com.gu.digital_voucher_api.Handler::handle
Environment:
Variables:
App: !Sub digital-voucher-api-${Stage}
Stack: membership
Stage: !Ref Stage
Role:
Fn::GetAtt:
- DigitalVoucherApiRole
- Arn
MemorySize: 1536
Runtime: java21
Timeout: 300
Architectures:
- arm64
DependsOn:
- DigitalVoucherApiRole
DigitalVoucherApiUsagePlan:
Type: AWS::ApiGateway::UsagePlan
Properties:
UsagePlanName: digital-voucher-api
ApiStages:
- ApiId: !Ref DigitalVoucherApi
Stage: !Ref Stage
DependsOn:
- DigitalVoucherApi
- DigitalVoucherApiStage
DigitalVoucherApiKey:
Type: AWS::ApiGateway::ApiKey
Properties:
Description: Used by manage-frontend
Enabled: true
Name: !Sub digital-voucher-api-key-${Stage}
StageKeys:
- RestApiId: !Ref DigitalVoucherApi
StageName: !Ref Stage
DependsOn:
- DigitalVoucherApi
- DigitalVoucherApiStage
DigitalVoucherApiUsagePlanKey:
Type: AWS::ApiGateway::UsagePlanKey
Properties:
KeyId: !Ref DigitalVoucherApiKey
KeyType: API_KEY
UsagePlanId: !Ref DigitalVoucherApiUsagePlan
DependsOn:
- DigitalVoucherApiKey
- DigitalVoucherApiUsagePlan
DigitalVoucherApiProxyResource:
Type: AWS::ApiGateway::Resource
Properties:
RestApiId: !Ref DigitalVoucherApi
ParentId: !GetAtt [DigitalVoucherApi, RootResourceId]
PathPart: "{proxy+}"
DependsOn: DigitalVoucherApi
DigitalVoucherApiAnyMethod:
Type: AWS::ApiGateway::Method
Properties:
AuthorizationType: NONE
ApiKeyRequired: true
RestApiId: !Ref DigitalVoucherApi
ResourceId: !Ref DigitalVoucherApiProxyResource
HttpMethod: ANY
Integration:
Type: AWS_PROXY
IntegrationHttpMethod: POST # this for the interaction between API Gateway and Lambda and MUST be POST
Uri: !Sub arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${DigitalVoucherApiLambda.Arn}/invocations
DependsOn:
- DigitalVoucherApi
- DigitalVoucherApiLambda
- DigitalVoucherApiProxyResource
DigitalVoucherApiStage:
Type: AWS::ApiGateway::Stage
Properties:
Description: Stage for digital-voucher-api
RestApiId: !Ref DigitalVoucherApi
DeploymentId: !Ref DigitalVoucherApiDeployment
StageName: !Sub ${Stage}
DependsOn:
- DigitalVoucherApiAnyMethod
DigitalVoucherApiDeployment:
Type: AWS::ApiGateway::Deployment
Properties:
Description: Deploys digital-voucher-api into an environment/stage
RestApiId: !Ref DigitalVoucherApi
DependsOn:
- DigitalVoucherApiAnyMethod
4xxApiAlarm:
Type: AWS::CloudWatch::Alarm
Condition: IsProd
Properties:
AlarmName: "URGENT 9-5 - PROD: 4XX response from digital voucher API"
AlarmDescription: >
IMPACT: If this goes unaddressed, some digital vouchers will not be generated or provisioned.
It's likely that a SF subscription has been misconfigured.
AlarmActions:
- !Sub arn:aws:sns:${AWS::Region}:${AWS::AccountId}:alarms-handler-topic-PROD
ComparisonOperator: GreaterThanThreshold
Dimensions:
- Name: ApiName
Value: !FindInMap [StageMap, !Ref Stage, ApiName]
- Name: Stage
Value: !Sub ${Stage}
EvaluationPeriods: 1
MetricName: 4XXError
Namespace: AWS/ApiGateway
Period: 3600
Statistic: Sum
Threshold: 1
TreatMissingData: notBreaching
5xxApiAlarm:
Type: AWS::CloudWatch::Alarm
Condition: IsProd
Properties:
AlarmName: "URGENT 9-5 - PROD: 5XX response from digital voucher API"
AlarmDescription: >
IMPACT: If this goes unaddressed, some digital vouchers will not be generated or provisioned.
It's likely that there's an error upstream in the voucher provider's API.
AlarmActions:
- !Sub arn:aws:sns:${AWS::Region}:${AWS::AccountId}:alarms-handler-topic-PROD
ComparisonOperator: GreaterThanThreshold
Dimensions:
- Name: ApiName
Value: !FindInMap [StageMap, !Ref Stage, ApiName]
- Name: Stage
Value: !Sub ${Stage}
EvaluationPeriods: 1
MetricName: 5XXError
Namespace: AWS/ApiGateway
Period: 3600
Statistic: Sum
Threshold: 1
TreatMissingData: notBreaching