hops-lambda
Version:
Quick and easy deployment of Hops applications to AWS Lambda
176 lines (165 loc) • 5.58 kB
YAML
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Hops Serverless Express Application / Powered by hops-lambda
Parameters:
Runtime:
Type: String
Description: Set the Node version of the Lambda runtime; currently only nodejs12.x is supported
Default: nodejs12.x
AllowedValues:
- nodejs12.x
LambdaMemorySize:
Type: Number
MinValue: 128
MaxValue: 1536
Description: Specify the amount of memory available to your Lambda function
StageName:
Type: String
Description: The name of the API Gateway stage
BasePath:
Type: String
Description: The base path to append to your domain, when using a custom domain
BucketName:
Type: String
Description: Name of the S3 bucket where your CloudFormation template and zip bundle are stored
BundleName:
Type: String
Description: Name of the zip bundle with your Lambda code
DomainName:
Type: String
Description: A custom domain name
CertificateArn:
Type: String
Description: The Amazon resource name (ARN) of your SSL certificate in ACM
Conditions:
ShouldAddCustomDomain: !Not [!Equals [!Ref DomainName, '']]
HasCustomBasePath: !Not [!Equals [!Ref BasePath, '(none)']]
Resources:
ApiGatewayApi:
Type: AWS::Serverless::Api
Properties:
StageName: !Ref StageName
DefinitionBody:
swagger: 2.0
info:
title: !Sub 'Hops Serverless Express (${AWS::StackName})'
basePath: !Sub '/${BasePath}'
schemes:
- https
paths:
'/':
x-amazon-apigateway-any-method:
produces:
- text/html
responses: {}
x-amazon-apigateway-integration:
uri: !Sub 'arn:${AWS::Partition}:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${HopsLambdaHandler.Arn}/invocations'
passthroughBehavior: when_no_match
httpMethod: POST
type: aws_proxy
'/{proxy+}':
x-amazon-apigateway-any-method:
parameters:
- name: proxy
in: path
required: true
type: string
produces:
- text/html
responses: {}
x-amazon-apigateway-integration:
uri: !Sub 'arn:${AWS::Partition}:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${HopsLambdaHandler.Arn}/invocations'
httpMethod: POST
type: aws_proxy
x-amazon-apigateway-binary-media-types:
- '*/*'
CustomDomainName:
Type: AWS::ApiGateway::DomainName
Condition: ShouldAddCustomDomain
Properties:
DomainName: !Ref DomainName
CertificateArn: !Ref CertificateArn
BasePathMapping:
Type: AWS::ApiGateway::BasePathMapping
Condition: ShouldAddCustomDomain
# https://github.com/awslabs/serverless-application-model/issues/119
# https://github.com/awslabs/serverless-application-model/issues/70
DependsOn: ApiGatewayApiStage
Properties:
BasePath: !Ref BasePath
DomainName: !Ref DomainName
RestApiId: !Ref ApiGatewayApi
Stage: !Ref StageName
LambdaExecutionRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
Effect: Allow
Principal:
Service: !Sub 'lambda.${AWS::URLSuffix}'
Action: sts:AssumeRole
Path: '/'
Policies:
- PolicyName: root
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- logs:CreateLogGroup
- logs:CreateLogStream
- logs:PutLogEvents
Resource: !Sub 'arn:${AWS::Partition}:logs:*:*:*'
LambdaApiGatewayExecutionPermission:
Type: AWS::Lambda::Permission
Properties:
Action: lambda:InvokeFunction
FunctionName: !GetAtt HopsLambdaHandler.Arn
Principal: !Sub 'apigateway.${AWS::URLSuffix}'
SourceArn: !Sub 'arn:${AWS::Partition}:execute-api:${AWS::Region}:${AWS::AccountId}:${ApiGatewayApi}/*/*'
HopsLambdaHandler:
Type: AWS::Serverless::Function
Properties:
CodeUri:
Bucket: !Ref BucketName
Key: !Ref BundleName
Handler: node_modules/hops-lambda/lambda.handler
MemorySize: !Ref LambdaMemorySize
Role: !GetAtt LambdaExecutionRole.Arn
Runtime: !Ref Runtime
Timeout: 30
Events:
KeepWarm:
Type: Schedule
Properties:
Schedule: rate(5 minutes)
Input: !Sub >
{
"resource": "/",
"httpMethod": "GET",
"headers": {
"Accept": "x-keep/warm,*/*",
"Host": "${ApiGatewayApi}.execute-api.${AWS::Region}.${AWS::URLSuffix}"
},
"requestContext": {
"path": "/${BasePath}/"
},
"body": ""
}
Outputs:
DistributionDomainName:
Value: !If
- ShouldAddCustomDomain
- !GetAtt CustomDomainName.DistributionDomainName
- ''
Url:
Value: !If
- ShouldAddCustomDomain
- !If [
HasCustomBasePath,
!Sub 'https://${DomainName}/${BasePath}/',
!Sub 'https://${DomainName}/',
]
- !Sub 'https://${ApiGatewayApi}.execute-api.${AWS::Region}.${AWS::URLSuffix}/${BasePath}/'