apiGateway: Type: "AWS::ApiGateway::RestApi" Properties: Name: "example-api-gw" Description: "Example API" ProxyResource: Type: "AWS::ApiGateway::Resource" Properties: ParentId: !GetAtt apiGateway.RootResourceId RestApiId: !Ref apiGateway PathPart: '{proxy+}' apiGatewayRootMethod: Type: "AWS::ApiGateway::Method" Properties: AuthorizationType: NONE HttpMethod: ANY Integration: IntegrationHttpMethod: POST Type: AWS_PROXY IntegrationResponses: - StatusCode: 200 Uri: !Sub - "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${lambdaArn}/invocations" - lambdaArn: !GetAtt "lambdaFunction.Arn" ResourceId: !Ref ProxyResource RestApiId: !Ref "apiGateway" apiGatewayDeployment: Type: "AWS::ApiGateway::Deployment" DependsOn: - "apiGatewayRootMethod" Properties: RestApiId: !Ref "apiGateway" StageName: !Ref "apiGatewayStageName" lambdaFunction: Type: "AWS::Lambda::Function" Properties: Code: ZipFile: | def handler(event,context): return { 'body': 'Hello there {0}'.format(event['requestContext']['identity']['sourceIp']), 'headers': { 'Content-Type': 'text/plain' }, 'statusCode': 200 } Description: "Node.js Express REST API with a package called aws-serverless-express" FunctionName: !Ref "lambdaFunctionName" Handler: lambda.handler Runtime: nodejs8.10 MemorySize: 128 Role: !GetAtt "lambdaIAMRole.Arn" Timeout: 60 lambdaApiGatewayInvoke: Type: "AWS::Lambda::Permission" Properties: Action: "lambda:InvokeFunction" FunctionName: !GetAtt "lambdaFunction.Arn" Principal: "apigateway.amazonaws.com" SourceArn: !Sub "arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${apiGateway}/*/*/*" lambdaIAMRole: Type: "AWS::IAM::Role" Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Action: - "sts:AssumeRole" Effect: "Allow" Principal: Service: - "lambda.amazonaws.com" Policies: - PolicyDocument: Version: "2012-10-17" Statement: - Action: - "logs:CreateLogGroup" - "logs:CreateLogStream" - "logs:PutLogEvents" Effect: "Allow" Resource: - !Sub "arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/lambda/${lambdaFunctionName}:*" PolicyName: "lambda" - PolicyDocument: Version: "2012-10-17" Statement: - Action: - "logs:CreateLogGroup" - "logs:CreateLogStream" - "logs:PutLogEvents" - "ec2:CreateNetworkInterface" - "ec2:DescribeNetworkInterfaces" - "ec2:DeleteNetworkInterface" Effect: "Allow" Resource: "*" PolicyName: "lambdaVPC" lambdaLogGroup: Type: "AWS::Logs::LogGroup" Properties: LogGroupName: !Sub "/aws/lambda/${lambdaFunctionName}" RetentionInDays: 90