Amazon API Gateway Mock Integration built with CloudFormation: Difference between revisions

From NovaOrdis Knowledge Base
Jump to navigation Jump to search
 
(8 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: !Sub ${AWS::StackName}-openapi-aws.yaml
     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 29: Line 35:


Resources:
Resources:
  AccessLogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Sub ${ProjectID}-api-access-logs
      RetentionInDays: 1


   Api:
   Api:
Line 35: Line 47:
       Name: !Ref AWS::StackName
       Name: !Ref AWS::StackName
       Description: |
       Description: |
         A manually deployed API, used for experiments. If you are readin this, it means that it can be
         A manually deployed API, used for experiments. If you are reading this, it means that it can be safely deleted.
        safely deleted.
       FailOnWarnings: true
       FailOnWarnings: true
       BodyS3Location:
       BodyS3Location:
Line 59: 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 111: 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

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