|
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: "my-function" |
|
|
|
Resources: |
|
apiGateway: |
|
Type: "AWS::ApiGateway::RestApi" |
|
Properties: |
|
Name: "my-api" |
|
Description: "My API" |
|
|
|
apiGatewayRootMethod: |
|
Type: "AWS::ApiGateway::Method" |
|
Properties: |
|
AuthorizationType: "NONE" |
|
HttpMethod: "POST" |
|
Integration: |
|
IntegrationHttpMethod: "POST" |
|
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" |
|
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: "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" |