AWSTemplateFormatVersion: "2010-09-09" Description: "My API Gateway and Lambda function" Parameters: apiGatewayStageName: Type: "String" AllowedPattern: "^[a-z0-9]+$" Default: "call" lambdaFunctionName: Type: "String" AllowedPattern: "^[a-zA-Z0-9]+[a-zA-Z0-9-]+[a-zA-Z0-9]+$" Default: "GetSongs" S3Bucketname: Type: "String" AllowedPattern: "^[a-zA-Z0-9]+[a-zA-Z0-9-]+[a-zA-Z0-9]+$" Default: "Rhythmcloud" Resources: apiGateway: Type: "AWS::ApiGateway::RestApi" Properties: Name: "drum-instructor" Description: "Rhythmcloud Drum Instructor API" ListSongs: Type: 'AWS::ApiGateway::Resource' Properties: RestApiId: !Ref apiGateway PathPart: "songs" ParentId: !GetAtt "apiGateway.RootResourceId" Metadata: 'AWS::CloudFormation::Designer': id: cc6c3940-2889-423b-be87-868ff11f0a23 apiGatewayRootMethod: Type: "AWS::ApiGateway::Method" Properties: AuthorizationType: "NONE" HttpMethod: "GET" Integration: IntegrationHttpMethod: "GET" Type: "AWS_PROXY" Uri: !Sub - "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${lambdaArn}/invocations" - lambdaArn: !GetAtt "lambdaFunction.Arn" # ResourceId: !GetAtt "apiGateway.RootResourceId" ResourceId: !Ref - "ListSongs" - "apiGateway" RestApiId: !Ref "apiGateway" OperationName: "ListSongs" 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: "My function" FunctionName: !Ref "lambdaFunctionName" Handler: "index.handler" MemorySize: 128 Role: !GetAtt "lambdaIAMRole.Arn" Runtime: "python2.7" Timeout: 10 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}/*/POST/" 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" lambdaLogGroup: Type: "AWS::Logs::LogGroup" Properties: LogGroupName: !Sub "/aws/lambda/${lambdaFunctionName}" RetentionInDays: 90 Outputs: apiGatewayInvokeURL: Value: !Sub "https://${apiGateway}.execute-api.${AWS::Region}.amazonaws.com/${apiGatewayStageName}" lambdaArn: Value: !GetAtt "lambdaFunction.Arn"