Amazon API Gateway Mock Integration built with CloudFormation: Difference between revisions
Jump to navigation
Jump to search
(9 intermediate revisions by the same user not shown) | |||
Line 5: | Line 5: | ||
=CloudFormation Stack= | =CloudFormation Stack= | ||
elysium-stack.yaml: | |||
<syntaxhighlight lang='yaml'> | <syntaxhighlight lang='yaml'> | ||
Line 13: | Line 15: | ||
Parameters: | Parameters: | ||
ProjectID: | |||
Type: String | |||
Default: elysium | |||
Bucket: | Bucket: | ||
Line 23: | Line 29: | ||
OpenApiAwsS3Key: | OpenApiAwsS3Key: | ||
Type: String | Type: String | ||
Default: elysium-openapi-aws.yaml | |||
Description: | | Description: | | ||
The S3 key of the file that contains the OpenAPI AWS metadata. The S3 object is expected to be | The S3 key of the file that contains the OpenAPI AWS metadata. The S3 object is expected to be | ||
Line 28: | Line 35: | ||
Resources: | Resources: | ||
AccessLogGroup: | |||
Type: AWS::Logs::LogGroup | |||
Properties: | |||
LogGroupName: !Sub ${ProjectID}-api-access-logs | |||
RetentionInDays: 1 | |||
Api: | Api: | ||
Line 34: | Line 47: | ||
Name: !Ref AWS::StackName | Name: !Ref AWS::StackName | ||
Description: | | Description: | | ||
A manually deployed API, used for experiments. If you are | A manually deployed API, used for experiments. If you are reading this, it means that it can be safely deleted. | ||
FailOnWarnings: true | FailOnWarnings: true | ||
BodyS3Location: | BodyS3Location: | ||
Line 58: | Line 70: | ||
RestApiId: !Ref Api | RestApiId: !Ref Api | ||
DeploymentId: !Ref ApiDeployment | DeploymentId: !Ref ApiDeployment | ||
MethodSettings: | |||
- ResourcePath: '/*' | |||
HttpMethod: '*' | |||
LoggingLevel: 'INFO' | |||
AccessLogSetting: | |||
DestinationArn: !GetAtt AccessLogGroup.Arn | |||
Format: >- | |||
{"requestId":"$context.requestId", "ip": "$context.identity.sourceIp", | |||
"caller":"$context.identity.caller", | |||
"user":"$context.identity.user","requestTime":"$context.requestTime", | |||
"eventType":"$context.eventType","routeKey":"$context.routeKey", | |||
"status":"$context.status","connectionId":"$context.connectionId"} | |||
</syntaxhighlight> | </syntaxhighlight> | ||
=OpenAPI AWS Specification= | =OpenAPI AWS Specification= | ||
elysium-openapi-aws.yaml: | |||
<syntaxhighlight lang='yaml'> | <syntaxhighlight lang='yaml'> | ||
Line 110: | Line 136: | ||
aws cloudformation create-stack --stack-name elysium --template-body file://./elysium-stack.yaml | aws cloudformation create-stack --stack-name elysium --template-body file://./elysium-stack.yaml | ||
If everything goes as planned, a new API, API Deployment and "test" Stage will become available. The API can be tested with: | |||
curl https://''api-id''.execute-api.us-west-2.amazonaws.com/test/a |
Latest revision as of 05:49, 28 March 2019
Internal
CloudFormation Stack
elysium-stack.yaml:
AWSTemplateFormatVersion: '2010-09-09'
Description: |
An API Gateway Stack.
Parameters:
ProjectID:
Type: String
Default: elysium
Bucket:
Type: String
Default: ovidiu-experiments
Description: |
The name of the S3 bucket that will contain the OpenAPI AWS metadata file during stack creation.
The content of the file will provide the API metadata.
OpenApiAwsS3Key:
Type: String
Default: elysium-openapi-aws.yaml
Description: |
The S3 key of the file that contains the OpenAPI AWS metadata. The S3 object is expected to be
available in the ${Bucket} bucket.
Resources:
AccessLogGroup:
Type: AWS::Logs::LogGroup
Properties:
LogGroupName: !Sub ${ProjectID}-api-access-logs
RetentionInDays: 1
Api:
Type: AWS::ApiGateway::RestApi
Properties:
Name: !Ref AWS::StackName
Description: |
A manually deployed API, used for experiments. If you are reading this, it means that it can be safely deleted.
FailOnWarnings: true
BodyS3Location:
Bucket: !Ref Bucket
Key: !Ref OpenApiAwsS3Key
ApiDeployment:
Type: AWS::ApiGateway::Deployment
DependsOn: Api
Properties:
RestApiId: !Ref Api
Description: |
Deployment created as part of a CloudFormation stack.
Stage:
Type: AWS::ApiGateway::Stage
DependsOn:
- Api
- ApiDeployment
Properties:
StageName: test
RestApiId: !Ref Api
DeploymentId: !Ref ApiDeployment
MethodSettings:
- ResourcePath: '/*'
HttpMethod: '*'
LoggingLevel: 'INFO'
AccessLogSetting:
DestinationArn: !GetAtt AccessLogGroup.Arn
Format: >-
{"requestId":"$context.requestId", "ip": "$context.identity.sourceIp",
"caller":"$context.identity.caller",
"user":"$context.identity.user","requestTime":"$context.requestTime",
"eventType":"$context.eventType","routeKey":"$context.routeKey",
"status":"$context.status","connectionId":"$context.connectionId"}
OpenAPI AWS Specification
elysium-openapi-aws.yaml:
---
swagger: "2.0"
info:
title: "elysium"
schemes:
- "https"
paths:
/a:
get:
consumes:
- "application/json"
produces:
- "application/json"
responses:
200:
description: "200 response"
schema:
$ref: "#/definitions/Empty"
x-amazon-apigateway-integration:
responses:
default:
statusCode: "200"
passthroughBehavior: "when_no_match"
requestTemplates:
application/json: "{\"statusCode\": 200}"
type: "mock"
definitions:
Empty:
type: "object"
title: "Empty Schema"
Procedure
- Save the content of CloudFormation stack in a file named elysium-stack.yaml.
- Save the OpenAPI specification into a file named elysium-openapi-aws.yaml
- Create an S3 bucket or use one that already exists:
aws s3 mb s3://ovidiu-experiments
- Copy the OpenAPI AWS metadata file in the S3 bucket:
aws s3 cp ./elysium-openapi-aws.yaml s3://ovidiu-experiments
- Deploy the stack:
aws cloudformation create-stack --stack-name elysium --template-body file://./elysium-stack.yaml
If everything goes as planned, a new API, API Deployment and "test" Stage will become available. The API can be tested with:
curl https://api-id.execute-api.us-west-2.amazonaws.com/test/a