美文网首页
Aws api gateway 和swagger工具的结合使用

Aws api gateway 和swagger工具的结合使用

作者: SuperCoderMan | 来源:发表于2019-03-28 13:05 被阅读0次

    aws api gateway 介绍

    • api的网关。主要目的是用来控制api的。
      • 所有api都可以写如到api gateway中。
      • 在api gateway中控制api的调用次数,吞吐量,是否允许调用
      • 在 api gateway中控制这个API 触发的aws的服务

    swagger 介绍

    • 用来编写API文档,有专门的swagger语法。简单点说就是用文字信息和特定的格式来描述一个API

    swagger集成 api gateway

    介绍

    • swagger网站上有关于集成api gateway的功能。可以做到一键集成(注意,集成的时候最好选则overwrite,每次保存都会完整的更新api gateway)
    • 所有api gateway的功能,包括authorized response lambda 都可以用swagger文档来完成。最后一键集成到api Gateway中

    如何集成

    • google一下swagger,注册swagger hub的账号。
    • 编写swagger的文档
    • 找到 Integrations按钮(藏的有点深,我找了半天),选择集成 aws api gateway
    • 配置好aws 的key和secret 保存并执行。这样以后每次编写swagger文档都会更新api gateway了

    swagger的编写(yaml格式)

    • swagger 文档如何编写我这里就不说了,自行google,多尝试就OK了。在swagger官网中编写会有错误提示,还是比较方便的。
      这篇文章主要介绍的是和api gateway相关的内容
    • swagger集成api gateway的文档例子
    https://github.com/aws-samples/api-gateway-secure-pet-store/blob/master/src/main/resources/swagger.yaml
    
    
    # this is an example of the Uber API
    # as a demonstration of an API spec in YAML
    swagger: '2.0'
    info:
      title: API Gateway Secure Pet Store
      description: Pet store sample that uses Cognito Developer Authenticated Identities to generate credentials through a Java Lambda Function
      version: "1.0.0"
    # the domain of the service
    host: execute-api.us-east-1.amazonaws.com
    # array of all schemes that your API supports
    schemes:
      - https
    # will be prefixed to all paths
    basePath: /
    produces:
      - application/json
    paths:
      /users:
        post:
          summary: Registers a new user
          description: |
            Creates a new user in the DynamoDB backend database and returns a set
            of temporary credentials to sign future requests.
          consumes:
            - application/json
          produces:
            - application/json
          parameters:
            - name: NewUser
              in: body
              description: New user details.
              schema:
                $ref: '#/definitions/User'
          tags:
            - Auth
          x-amazon-apigateway-integration:
            type: aws
            uri: arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:XXXXXXXXXXXX:function:YOUR_FUNCTION_NAME/invocations
            credentials: arn:aws:iam::XXXXXXXXXXXX:role/YOUR_LAMBDA_INVOCATION_ROLE
            httpMethod: POST
            requestTemplates:
              application/json: |
                {
                  "action" : "com.amazonaws.apigatewaydemo.action.RegisterDemoAction",
                  "body" : $input.json('$')
                }
            responses:
              "default":
                statusCode: "200"
                responseParameters:
                  method.response.header.Access-Control-Allow-Origin : "'*'"
              "BAD.*":
                statusCode: "400"
                responseParameters:
                  method.response.header.Access-Control-Allow-Origin : "'*'"
              "INT.*":
                statusCode: "500"
                responseParameters:
                  method.response.header.Access-Control-Allow-Origin : "'*'"
          responses:
            200:
              description: The username of the new user and set of temporary credentials
              headers:
                Access-Control-Allow-Origin:
                  type: "string"
              schema:
                $ref: '#/definitions/RegisterUserResponse'
            400:
              description: Bad request
              headers:
                Access-Control-Allow-Origin:
                  type: "string"
              schema:
                $ref: '#/definitions/Error'
            500:
              description: Internal error
              headers:
                Access-Control-Allow-Origin:
                  type: "string"
              schema:
                $ref: '#/definitions/Error'
        options:
          summary: CORS support
          description: |
            Enable CORS by returning correct headers
          consumes:
            - application/json
          produces:
            - application/json
          tags:
            - CORS
          x-amazon-apigateway-integration:
            type: mock
            requestTemplates:
              application/json: |
                {
                  "statusCode" : 200
                }
            responses:
              "default":
                statusCode: "200"
                responseParameters:
                  method.response.header.Access-Control-Allow-Headers : "'Content-Type,X-Amz-Date,Authorization,X-Api-Key'"
                  method.response.header.Access-Control-Allow-Methods : "'*'"
                  method.response.header.Access-Control-Allow-Origin : "'*'"
                responseTemplates:
                  application/json: |
                    {}
          responses:
            200:
              description: Default response for CORS method
              headers:
                Access-Control-Allow-Headers:
                  type: "string"
                Access-Control-Allow-Methods:
                  type: "string"
                Access-Control-Allow-Origin:
                  type: "string"
      /login:
        post:
          summary: Login user
          description: |
            Verifies the given credentials against the user database and returns a set
            of new temporary credentials
          consumes:
            - application/json
          produces:
            - application/json
          parameters:
            - name: LoginUser
              in: body
              description: New user details.
              schema:
                $ref: '#/definitions/User'
          tags:
            - Auth
          x-amazon-apigateway-integration:
            type: aws
            uri: arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:XXXXXXXXXXXX:function:YOUR_FUNCTION_NAME/invocations
            credentials: arn:aws:iam::XXXXXXXXXXXX:role/YOUR_LAMBDA_INVOCATION_ROLE
            httpMethod: POST
            requestTemplates:
              application/json: |
                {
                  "action" : "com.amazonaws.apigatewaydemo.action.LoginDemoAction",
                  "body" : $input.json('$')
                }
            responses:
              "default":
                statusCode: "200"
                responseParameters:
                  method.response.header.Access-Control-Allow-Origin : "'*'"
              "BAD.*":
                statusCode: "400"
                responseParameters:
                  method.response.header.Access-Control-Allow-Origin : "'*'"
              "INT.*":
                statusCode: "500"
                responseParameters:
                  method.response.header.Access-Control-Allow-Origin : "'*'"
          responses:
            200:
              description: A new set of temporary credentials
              headers:
                Access-Control-Allow-Origin:
                  type: "string"
              schema:
                $ref: '#/definitions/LoginUserResponse'
            400:
              description: Bad request
              headers:
                Access-Control-Allow-Origin:
                  type: "string"
              schema:
                $ref: '#/definitions/Error'
            500:
              description: Internal error
              headers:
                Access-Control-Allow-Origin:
                  type: "string"
              schema:
                $ref: '#/definitions/Error'
        options:
          summary: CORS support
          description: |
            Enable CORS by returning correct headers
          consumes:
            - application/json
          produces:
            - application/json
          tags:
            - CORS
          x-amazon-apigateway-integration:
            type: mock
            requestTemplates:
              application/json: |
                {
                  "statusCode" : 200
                }
            responses:
              "default":
                statusCode: "200"
                responseParameters:
                  method.response.header.Access-Control-Allow-Headers : "'Content-Type,X-Amz-Date,Authorization,X-Api-Key'"
                  method.response.header.Access-Control-Allow-Methods : "'*'"
                  method.response.header.Access-Control-Allow-Origin : "'*'"
                responseTemplates:
                  application/json: |
                    {}
          responses:
            200:
              description: Default response for CORS method
              headers:
                Access-Control-Allow-Headers:
                  type: "string"
                Access-Control-Allow-Methods:
                  type: "string"
                Access-Control-Allow-Origin:
                  type: "string"
      /pets:
        post:
          summary: Creates a new pet
          description: |
            Creates a new pet object in the datastore
          x-amazon-apigateway-auth:
            type: aws_iam
          consumes:
            - application/json
          produces:
            - application/json
          parameters:
            - name: NewPet
              in: body
              description: New pet details.
              schema:
                $ref: '#/definitions/NewPet'
          tags:
            - Pet Store
          x-amazon-apigateway-integration:
            type: aws
            uri: arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:XXXXXXXXXXXX:function:YOUR_FUNCTION_NAME/invocations
            credentials: arn:aws:iam::*:user/*
            httpMethod: POST
            requestTemplates:
              application/json: |
                {
                  "action" : "com.amazonaws.apigatewaydemo.action.CreatePetDemoAction",
                  "body" : $input.json('$')
                }
            responses:
              "default":
                statusCode: "200"
                responseParameters:
                  method.response.header.Access-Control-Allow-Origin : "'*'"
              "BAD.*":
                statusCode: "400"
                responseParameters:
                  method.response.header.Access-Control-Allow-Origin : "'*'"
              "INT.*":
                statusCode: "500"
                responseParameters:
                  method.response.header.Access-Control-Allow-Origin : "'*'"
          responses:
            200:
              description: The unique identifier of the new pet
              headers:
                Access-Control-Allow-Origin:
                  type: "string"
              schema:
                $ref: '#/definitions/NewPetResponse'
            400:
              description: Bad request
              headers:
                Access-Control-Allow-Origin:
                  type: "string"
              schema:
                $ref: '#/definitions/Error'
            500:
              description: Internal error
              headers:
                Access-Control-Allow-Origin:
                  type: "string"
              schema:
                $ref: '#/definitions/Error'
        get:
          summary: List pets
          description: Retrieve a list of pets in the store
          x-amazon-apigateway-auth:
            type: aws_iam
          consumes:
            - application/json
          produces:
            - application/json
          tags:
            - Pet Store
          x-amazon-apigateway-integration:
            type: aws
            uri: arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:XXXXXXXXXXXX:function:YOUR_FUNCTION_NAME/invocations
            credentials: arn:aws:iam::*:user/*
            httpMethod: POST
            requestTemplates:
              application/json: |
                {
                  "action" : "com.amazonaws.apigatewaydemo.action.ListPetsDemoAction",
                  "body" : $input.json('$')
                }
            responses:
              "default":
                statusCode: "200"
                responseParameters:
                  method.response.header.Access-Control-Allow-Origin : "'*'"
              "BAD.*":
                statusCode: "400"
                responseParameters:
                  method.response.header.Access-Control-Allow-Origin : "'*'"
              "INT.*":
                statusCode: "500"
                responseParameters:
                  method.response.header.Access-Control-Allow-Origin : "'*'"
          responses:
            200:
              description: A list of pets
              headers:
                Access-Control-Allow-Origin:
                  type: "string"
              schema:
                $ref: '#/definitions/Pets'
            400:
              description: Bad request
              headers:
                Access-Control-Allow-Origin:
                  type: "string"
              schema:
                $ref: '#/definitions/Error'
            500:
              description: Internal error
              headers:
                Access-Control-Allow-Origin:
                  type: "string"
              schema:
                $ref: '#/definitions/Error'
        options:
          summary: CORS support
          description: |
            Enable CORS by returning correct headers
          consumes:
            - application/json
          produces:
            - application/json
          tags:
            - CORS
          x-amazon-apigateway-integration:
            type: mock
            requestTemplates:
              application/json: |
                {
                  "statusCode" : 200
                }
            responses:
              "default":
                statusCode: "200"
                responseParameters:
                  method.response.header.Access-Control-Allow-Headers : "'Content-Type,X-Amz-Date,Authorization,X-Api-Key'"
                  method.response.header.Access-Control-Allow-Methods : "'*'"
                  method.response.header.Access-Control-Allow-Origin : "'*'"
                responseTemplates:
                  application/json: |
                    {}
          responses:
            200:
              description: Default response for CORS method
              headers:
                Access-Control-Allow-Headers:
                  type: "string"
                Access-Control-Allow-Methods:
                  type: "string"
                Access-Control-Allow-Origin:
                  type: "string"
      /pets/{petId}:
        get:
          summary: Get pet by id
          description: Returns a pet definition based on the given id
          x-amazon-apigateway-auth:
            type: aws_iam
          consumes:
            - application/json
          produces:
            - application/json
          tags:
            - Pet Store
          parameters:
            - name: petId
              in: path
              description: The unique identifier for a pet
              type: string
          x-amazon-apigateway-integration:
            type: aws
            uri: arn:aws:apigateway:us-east-1:lambda:path/2015-03-31/functions/arn:aws:lambda:us-east-1:XXXXXXXXXXXX:function:YOUR_FUNCTION_NAME/invocations
            credentials: arn:aws:iam::*:user/*
            httpMethod: POST
            requestTemplates:
              application/json: |
                {
                  "action" : "com.amazonaws.apigatewaydemo.action.GetPetDemoAction",
                  "body" : {
                    "petId" : "$input.params('petId')"
                  }
                }
            responses:
              "default":
                statusCode: "200"
                responseParameters:
                  method.response.header.Access-Control-Allow-Origin : "'*'"
              "BAD.*":
                statusCode: "400"
                responseParameters:
                  method.response.header.Access-Control-Allow-Origin : "'*'"
              "INT.*":
                statusCode: "500"
                responseParameters:
                  method.response.header.Access-Control-Allow-Origin : "'*'"
          responses:
            200:
              description: A pet
              headers:
                Access-Control-Allow-Origin:
                  type: "string"
              schema:
                $ref: '#/definitions/Pet'
            400:
              description: Bad request
              headers:
                Access-Control-Allow-Origin:
                  type: "string"
              schema:
                $ref: '#/definitions/Error'
            500:
              description: Internal error
              headers:
                Access-Control-Allow-Origin:
                  type: "string"
              schema:
                $ref: '#/definitions/Error'
        options:
          summary: CORS support
          description: |
            Enable CORS by returning correct headers
          consumes:
            - application/json
          produces:
            - application/json
          tags:
            - CORS
          x-amazon-apigateway-integration:
            type: mock
            requestTemplates:
              application/json: |
                {
                  "statusCode" : 200
                }
            responses:
              "default":
                statusCode: "200"
                responseParameters:
                  method.response.header.Access-Control-Allow-Headers : "'Content-Type,X-Amz-Date,Authorization,X-Api-Key'"
                  method.response.header.Access-Control-Allow-Methods : "'*'"
                  method.response.header.Access-Control-Allow-Origin : "'*'"
                responseTemplates:
                  application/json: |
                    {}
          responses:
            200:
              description: Default response for CORS method
              headers:
                Access-Control-Allow-Headers:
                  type: "string"
                Access-Control-Allow-Methods:
                  type: "string"
                Access-Control-Allow-Origin:
                  type: "string"
    definitions:
      User:
        properties:
          username:
            type: string
            description: A unique username for the user
          password:
            type: string
            description: A password for the new user
      RegisterUserResponse:
        properties:
          username:
            type: string
            description: The username of the new user
          identityId:
            type: string
            description: The unique identifier for the new user
          token:
            type: string
            description: An OpenID token for the new user
          credentials:
            type: object
            properties:
              accessKey:
                type: string
                description: Temporary access key to sign requests
              secretKey:
                type: string
                description: Temporary secret access key to sign requests
              sessionToken:
                type: string
                description: Tempoarary session token
              expiration:
                type: integer
                description: |
                  Expiration date of the temporary credentials in millis since 1/1/1970
      LoginUserResponse:
        properties:
          identityId:
            type: string
            description: The unique identifier for the new user
          token:
            type: string
            description: An OpenID token for the new user
          credentials:
            type: object
            properties:
              accessKey:
                type: string
                description: Temporary access key to sign requests
              secretKey:
                type: string
                description: Temporary secret access key to sign requests
              sessionToken:
                type: string
                description: Tempoarary session token
              expiration:
                type: integer
                description: |
                  Expiration date of the temporary credentials in millis since 1/1/1970
      NewPet:
        properties:
          petType:
            type: string
            description: Free text pet type
          petName:
            type: string
            description: Free text pet name
          petAge:
            type: integer
            description: Age of the new pet
      NewPetResponse:
        properties:
          petId:
            type: string
            description: The generated unique identifier for the new pet
      Pet:
        properties:
          petId:
            type: string
            description: The generated unique identifier for the new pet
          petType:
            type: string
            description: Free text pet type
          petName:
            type: string
            description: Free text pet name
          petAge:
            type: integer
            description: Age of the new pet
      Pets:
        type: array
        items:
          $ref: Pet
      Error:
        properties:
          code:
            type: integer
            format: int32
          message:
            type: string
          fields:
            type: string
    

    内容很长,不要害怕,分解开来就简单了。把复杂的事情分解一下就变简单了。

    设置触发的lambda 函数

          x-amazon-apigateway-integration:
            type: "aws_proxy"
            httpMethod: "POST"
            uri:  "arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:<accountId>:function:<function-name>/invocations"
            credentials: "arn:aws:iam::<accountId>:role/<role-name>"
    
    • x-amazon-apigateway-integration 代表集成apigateway
    • type 代表使用了lambda代理
    • httpMethod 必须是POST
    • uri就是lambda的路径
    • credentials: 这个是证书的意思,比较复杂。不写也可以集成,但是你会发现无法让API gateway 触发lamnda,会报permission之类的错误

    设置 credentials

    • 首先要创建一个角色
    • 要给这个角色赋予AWSLambdaFullAccess的policy权限
    • 要让这个角色相信api gateway(role>>Trust relationships>>edit>>save)
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Service": [
              "lambda.amazonaws.com",
              "apigateway.amazonaws.com"
            ]
          },
          "Action": "sts:AssumeRole"
        }
      ]
    }
    
    
    • 要让设置在swagger中的用户拥有passRole的权限
      • 创建一个policy
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "PolicyStatementToAllowUserToPassOneSpecificRole",
                "Effect": "Allow",
                "Action": "iam:PassRole",
                "Resource": "arn:aws:iam::<accountId>:role/swagger-role"
            }
        ]
    }
    
    • 把这个policy添加给用户。这样设置给swagger的aws用户就拥有PassRole的权限了,这样写到credentials的role-那么就能发挥作用了。

    设置api gateway的 authorise 验证,

    • 放到和paths在同一级别下
    securityDefinitions:
      cognito_auth:
        type: "apiKey"
        name: "accessToken"
        in: "header"
        x-amazon-apigateway-authtype: "cognito_user_pools"
        x-amazon-apigateway-authorizer:
          type: "cognito_user_pools"
          providerARNs: ["arn:aws:cognito-idp:us-west-2:<accountId>:userpool/<userpoolId>"]
      request_lambda_auth:
        type: "apiKey"
        name: "Unused"
        in: "header"
        x-amazon-apigateway-authtype: "custom"
        x-amazon-apigateway-authorizer:
          type: "request"
          identitySource : "method.request.header.access_key, method.request.header.access_type"
          authorizerUri: "arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:<accountId>:function:<lambda name>/invocations"
          authorizerResultTtlInSeconds : 300
    
    • 这样 写好后,你就可以将cognito_auth 或者request_lambda_auth 放置到每个API的security下了

    设置 api gateway的错误返回模版

    x-amazon-apigateway-gateway-responses: 
      BAD_REQUEST_PARAMETERS:
        statusCode: 400
        responseTemplates:
          application/json: "{\"error\":{\"code\":400,\"name\":\"ParameterIncorrectException\",\"message\": $context.error.messageString} }" 
    

    相关文章

      网友评论

          本文标题:Aws api gateway 和swagger工具的结合使用

          本文链接:https://www.haomeiwen.com/subject/aofqbqtx.html