formstack-consents/cloud-formation.yaml (106 lines of code) (raw):

AWSTemplateFormatVersion: '2010-09-09' Transform: 'AWS::Serverless-2016-10-31' Parameters: Stage: Description: environment name Type: String AllowedValues: - CODE - PROD IdentityApiEndpoint: Description: endpoint for the identity API Type: String AllowedValues: - https://idapi.theguardian.com - https://idapi.code.dev-theguardian.com IdentityAPIKey: Description: key used to authenticate against the identity API Type: String FormstackSharedSecret: Description: The shared secret is included in the form submission data Type: String AlarmEmailAddress: Description: Contact email for alarms Type: String Conditions: IsProd: !Equals - !Ref 'Stage' - PROD Resources: TopicSendEmail: Type: AWS::SNS::Topic Properties: DisplayName: SendEmailTopic Subscription: - Endpoint: !Ref 'AlarmEmailAddress' Protocol: email FormstackConsentsLambda: Type: AWS::Serverless::Function Properties: MemorySize: 1024 FunctionName: !Sub FormstackConsentsLambda-${Stage} Timeout: 120 Description: Lambda to send email to user who has signed up to a newsletter via Formstack Environment: Variables: idapiHost: !Sub ${IdentityApiEndpoint} idapiAccessToken: !Sub ${IdentityAPIKey} formstackSharedSecret: !Sub ${FormstackSharedSecret} Handler: com.gu.identity.formstackconsents.Lambda::handler Runtime: java11 CodeUri: Bucket: identity-lambda Key: !Sub identity/${Stage}/formstack-consents-lambda/main.jar Events: FormstackConsentApi: Type: Api Properties: RestApiId: Ref: ServlessRestApi Path: /consent Method: POST ServerlessRestApi: Type: AWS::Serverless::Api Properties: StageName: !Sub ${Stage} DefinitionBody: swagger: 2.0 info: version: '1.0' title: Ref: AWS::StackName paths: /consent: post: x-amazon-apigateway-integration: # The HTTP method used in the integration request. For Lambda function invocations, the value must be POST. httpMethod: POST type: aws_proxy uri: Fn::Sub: arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${FormstackConsentsLambda.Arn}/invocations responses: {} FormstackConsentsLambdaPerms: Type: AWS::Lambda::Permission DependsOn: - FormstackConsentsLambda - ServerlessRestApi Properties: Action: lambda:InvokeFunction FunctionName: !Ref FormstackConsentsLambda Principal: apigateway.amazonaws.com FormstackConsentsLambdaErrorAlarm: Type: AWS::CloudWatch::Alarm Properties: AlarmName: !Sub 'formstack-consents-lambda-${Stage} failed execution' AlarmDescription: Alert when formstack consents lambda errors Namespace: AWS/Lambda Dimensions: - Name: FunctionName Value: !Ref 'FormstackConsentsLambda' MetricName: Errors Statistic: Sum ComparisonOperator: GreaterThanOrEqualToThreshold Threshold: '1' Period: '60' EvaluationPeriods: '1' AlarmActions: - !If [IsProd, !Ref 'TopicSendEmail', !Ref 'AWS::NoValue']