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

From NovaOrdis Knowledge Base
Jump to navigation Jump to search
 
(5 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 29: Line 35:


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


   Api:
   Api:
Line 34: Line 46:
     Properties:
     Properties:
       Name: !Ref AWS::StackName
       Name: !Ref AWS::StackName
       Description: >
       Description: |
         A manually deployed API, used for experiments. If you are reading 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