Created
October 8, 2018 20:00
-
-
Save ericsalesdeandrade-zz/4a1bc29284054a94f5065fbc700922a1 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"Resources": { | |
"IAMLambdaServiceRole": | |
{ | |
"Type": "AWS::IAM::Role", | |
"Properties": { | |
"RoleName": "LambdaServiceRole", | |
"AssumeRolePolicyDocument": { | |
"Version": "2012-10-17", | |
"Statement": [ | |
{ | |
"Sid": "", | |
"Effect": "Allow", | |
"Principal": { | |
"Service": "lambda.amazonaws.com" | |
}, | |
"Action": "sts:AssumeRole" | |
} | |
] | |
}, | |
"ManagedPolicyArns": ["arn:aws:iam::aws:policy/service-role/AmazonAPIGatewayPushToCloudWatchLogs"], | |
"Policies": [{ | |
"PolicyName": "LambdaServiceRolePolicy", | |
"PolicyDocument": { | |
"Version": "2012-10-17", | |
"Statement": [ | |
{ | |
"Action": ["s3:Get*","s3:List*"], | |
"Resource": "*", | |
"Effect": "Allow" | |
} | |
] | |
} | |
}] | |
} | |
}, | |
"IAMAPIServiceRole": | |
{ | |
"Type": "AWS::IAM::Role", | |
"Properties": { | |
"RoleName": "LambdaAPIServiceRole", | |
"AssumeRolePolicyDocument": { | |
"Version": "2012-10-17", | |
"Statement": [ | |
{ | |
"Sid": "", | |
"Effect": "Allow", | |
"Principal": { | |
"Service": "apigateway.amazonaws.com" | |
}, | |
"Action": "sts:AssumeRole" | |
} | |
] | |
}, | |
"ManagedPolicyArns": ["arn:aws:iam::aws:policy/service-role/AmazonAPIGatewayPushToCloudWatchLogs"], | |
"Policies": [{ | |
"PolicyName": "API_Service_Role_Policy", | |
"PolicyDocument": { | |
"Version": "2012-10-17", | |
"Statement": [ | |
{ | |
"Action": "lambda:InvokeFunction", | |
"Resource": {"Fn::GetAtt": ["APIFunction", "Arn"]}, | |
"Effect": "Allow" | |
} | |
] | |
} | |
}] | |
} | |
}, | |
"APIFunction": { | |
"Type": "AWS::Lambda::Function", | |
"Properties": { | |
"FunctionName": "GetVehicle", | |
"Description": "Function to Get Vehicle Image from S3 Bucket", | |
"Code": { | |
"S3Bucket": "car-images-hd", | |
"S3Key": "Get_Car.zip" | |
}, | |
"Handler": "Get_Car.get_car", | |
"Runtime": "python3.6", | |
"MemorySize": 1024, | |
"Role": {"Fn::GetAtt": ["IAMLambdaServiceRole", "Arn"]}, | |
"Timeout" : 60 | |
} | |
}, | |
"RestAPI": { | |
"Type" : "AWS::ApiGateway::RestApi", | |
"Properties" : { | |
"Description" : "API to get Car Image", | |
"Name" : "Get_Car API", | |
"EndpointConfiguration": {"Types" : ["REGIONAL"]}, | |
"Body" : { | |
"swagger": "2.0", | |
"info": { | |
"description": "API to return Car Image", | |
"version": "1.0.0", | |
"title": "Get_Car API" | |
}, | |
"schemes": [ | |
"https" | |
], | |
"paths": { | |
"/": {}, | |
"/get_car": { | |
"post": { | |
"produces": [ | |
"application/json", | |
"application/customer-error", | |
"application/api_not_found", | |
"application/no_record", | |
"application/api_error" | |
], | |
"responses": { | |
"200": { | |
"description": "200 response", | |
"schema": { | |
"$ref": "#/definitions/Empty" | |
} | |
}, | |
"201": { | |
"description": "201 response" | |
}, | |
"204": { | |
"description": "204 response" | |
}, | |
"230": { | |
"description": "230 response" | |
}, | |
"231": { | |
"description": "231 response" | |
}, | |
"232": { | |
"description": "232 response" | |
}, | |
"233": { | |
"description": "233 response" | |
} | |
}, | |
"security": [ | |
{ | |
"sigv4": [] | |
} | |
], | |
"x-amazon-apigateway-integration": { | |
"responses": { | |
"default": { | |
"statusCode": "200" | |
} | |
}, | |
"uri": {"Fn::Join": [ ":", ["arn:aws:apigateway", {"Ref": "AWS::Region"}, "lambda:path/2015-03-31/functions/arn:aws:lambda", {"Ref": "AWS::Region"}, {"Ref": "AWS::AccountId"}, "function", {"Fn::Join": ["",[{"Ref": "APIFunction"}, "/invocations"]]}]]}, | |
"passthroughBehavior": "when_no_match", | |
"httpMethod": "POST", | |
"contentHandling": "CONVERT_TO_TEXT", | |
"credentials": {"Fn::GetAtt": ["IAMAPIServiceRole", "Arn"]}, | |
"type": "aws" | |
} | |
} | |
} | |
}, | |
"securityDefinitions": { | |
"sigv4": { | |
"type": "apiKey", | |
"name": "Authorization", | |
"in": "header", | |
"x-amazon-apigateway-authtype": "awsSigv4" | |
} | |
}, | |
"definitions": { | |
"Empty": { | |
"type": "object", | |
"title": "Empty Schema" | |
} | |
} | |
} | |
} | |
}, | |
"RestAPICaller": { | |
"Type": "AWS::IAM::User", | |
"Properties": { | |
"UserName": "Get_Car_Caller" | |
} | |
}, | |
"RestAPICallerManagedPolicy": { | |
"Type": "AWS::IAM::ManagedPolicy", | |
"DependsOn": ["RestAPI","APIFunction","RestAPICaller"], | |
"Properties": { | |
"Description": "Get_Car API Caller", | |
"PolicyDocument": { | |
"Version": "2012-10-17", | |
"Statement": [ | |
{ | |
"Sid": "RestAPICaller001", | |
"Effect": "Allow", | |
"Action": "execute-api:Invoke", | |
"Resource": {"Fn::Join": ["", ["arn:aws:execute-api:", {"Ref": "AWS::Region"}, ":", {"Ref": "AWS::AccountId"}, ":", { "Ref": "RestAPI" }, "/*/POST/*"]]} | |
}, | |
{ | |
"Sid": "RestAPICaller002", | |
"Effect": "Allow", | |
"Action": "lambda:InvokeFunction", | |
"Resource": {"Fn::Join": ["", ["arn:aws:lambda:", {"Ref": "AWS::Region"}, ":", {"Ref": "AWS::AccountId"}, ":function:", {"Ref": "APIFunction"}]]} | |
}, | |
{ | |
"Sid": "RestAPICaller003", | |
"Effect": "Allow", | |
"Action": "s3:GetObject", | |
"Resource": "arn:aws:s3:::car-images-hd/*" | |
} | |
] | |
}, | |
"Users": ["Get_Car_Caller"], | |
"ManagedPolicyName": "API_Caller_Policy" | |
} | |
}, | |
"LambdaPermissions":{ | |
"Type": "AWS::Lambda::Permission", | |
"DependsOn": ["APIFunction"], | |
"Properties": { | |
"Action": "lambda:Invoke", | |
"FunctionName": {"Ref": "APIFunction"}, | |
"Principal": "apigateway.amazonaws.com", | |
"SourceArn": {"Fn::Join": ["", ["arn:aws:execute-api:", {"Ref": "AWS::Region"}, ":", {"Ref": "AWS::AccountId"}, ":", {"Ref": "RestAPI"}, "/*/POST/get_car"]]} | |
} | |
}, | |
"GetCarLogGroup": { | |
"Type": "AWS::Logs::LogGroup", | |
"DependsOn": "APIFunction", | |
"Properties": { | |
"LogGroupName": {"Fn::Join": ["", ["/aws/lambda/", {"Ref":"APIFunction"}]]} | |
} | |
}, | |
"ApiGatewayCloudWatchLogsRole": { | |
"Type": "AWS::IAM::Role", | |
"Properties": { | |
"AssumeRolePolicyDocument": { | |
"Version": "2012-10-17", | |
"Statement": [{ | |
"Effect": "Allow", | |
"Principal": { "Service": ["apigateway.amazonaws.com"] }, | |
"Action": ["sts:AssumeRole"] | |
}] | |
}, | |
"Policies": [{ | |
"PolicyName": "API_GW_Logs_Policy", | |
"PolicyDocument": { | |
"Version": "2012-10-17", | |
"Statement": [{ | |
"Effect": "Allow", | |
"Action": [ | |
"logs:CreateLogGroup", | |
"logs:CreateLogStream", | |
"logs:DescribeLogGroups", | |
"logs:DescribeLogStreams", | |
"logs:PutLogEvents", | |
"logs:GetLogEvents", | |
"logs:FilterLogEvents" | |
], | |
"Resource": "*" | |
}] | |
} | |
}] | |
} | |
}, | |
"BucketPolicy": { | |
"Type": "AWS::S3::BucketPolicy", | |
"Properties": { | |
"Bucket": "car-images-hd", | |
"PolicyDocument": { | |
"Version": "2012-10-17", | |
"Statement": [ | |
{ | |
"Effect": "Allow", | |
"Action": [ | |
"s3:GetObject" | |
], | |
"Resource": "arn:aws:s3:::car-images-hd/*", | |
"Condition": {}, | |
"Principal": { | |
"AWS": [ | |
{ | |
"Fn::Join": [ | |
":", | |
[ | |
"arn:aws:iam:", | |
{ | |
"Ref": "AWS::AccountId" | |
}, "user/Get_Car_Caller" | |
] | |
] | |
} | |
] | |
} | |
} | |
] | |
} | |
} | |
}, | |
"ApiGatewayAccount": { | |
"Type": "AWS::ApiGateway::Account", | |
"Properties": { | |
"CloudWatchRoleArn": {"Fn::GetAtt": ["ApiGatewayCloudWatchLogsRole", "Arn"] } | |
} | |
}, | |
"RestAPIStage": { | |
"Type": "AWS::ApiGateway::Stage", | |
"DependsOn": ["ApiGatewayAccount"], | |
"Properties": { | |
"DeploymentId": {"Ref": "RestAPIDeployment"}, | |
"MethodSettings": [{ | |
"DataTraceEnabled": true, | |
"HttpMethod": "*", | |
"LoggingLevel": "INFO", | |
"ResourcePath": "/*" | |
}], | |
"RestApiId": {"Ref": "RestAPI"}, | |
"StageName": "dev" | |
} | |
}, | |
"RestAPIDeployment": { | |
"Type": "AWS::ApiGateway::Deployment", | |
"DependsOn": ["RestAPI"], | |
"Properties": { | |
"RestApiId": {"Ref": "RestAPI"}, | |
"StageName": "dummy" | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment