具有 SAM 中定义的 Mock 响应的简单 API 网关?

Simple API gateway with Mock response defined in SAM?

我在 AWS 中有一个简单的 API 网关定义。

它有一个用于“/”的单一方法,具有“GET”HTTP 类型。

我已将“集成请求”更新为“模拟”(return 纯粹使用 API 网关映射的响应 ...)。

没什么特别的,所有请求都会通过。

对于响应,我更新了默认的集成响应(响应状态 200、无正则表达式、模型等。默认映射)。

它有一个“application/json”映射模板,在这里我刚刚添加了静态文本“hello world”(创意,我知道)。

现在的问题是,我可以在 SAM 模板中定义它吗?

我可以很容易地找到很多例子来创建一个 lambda 函数,并让 做响应和各种其他事情。

我可以 运行 SAM cli 在本地执行“sam 部署”并提供 sam 模板,并在我的帐户中创建一个全新的 AWS Stack,并创建 API 网关, lambda python 或 javascript 等上传到 s3 并创建并链接到 API(通过隐式 sam 定义,尚未查看外部 oas/swagger)和创建的角色等.

一切都很完美。

但如果我想做同样的事情,但更简单 - 仅 API 网关和模拟集成响应(无 lambda) - SAM 模板会是什么样子?

到现在我还很茫然

我可以从无服务器模型中看到,sam 支持很多集成(x-amazon-api网关集成响应)。

我可以通过 aws cli 使用“api-gateway getexport”查看 oas 版本。

但我看不到带有隐式 API 创建的 SAM 模板,其中没有链接 lambda,只是一个简单的 Mock 和静态集成响应。

感谢任何帮助!!

SAM 是 Cloudformation 的扩展,所以是的,如果您创建一个 sam 应用程序并添加波纹管 template.yaml 文件,并且 运行 sam deploy --guided 您将创建你需要什么。在这种情况下,您将 运行ning 一个简单的 cloudformation 模板,可以使用以下命令进行部署:

aws cloudformation deploy --stack-name mock-api --template-file template.yaml

SAM 的主要思想是促进无服务器应用程序的部署,创造在本地调用 Lambda 函数的可能性,改进调试等,同时配置您的资源。

正如我们在 AWS 中看到的那样 documentation:

A serverless application is a combination of Lambda functions, event sources, and other resources that work together to perform tasks. Note that a serverless application is more than just a Lambda function—it can include additional resources such as APIs, databases, and event source mappings

因此,如果您不使用 Lambda 并且想要配置您的资源,您可以简单地使用 Cloudformation 或其他 IaC 工具作为 Terraform。

template.yml 示例(您需要的):

AWSTemplateFormatVersion: '2010-09-09'

Description: AWS API Gateway with a Mock Integration

Resources:

  ApiGatewayRestApi:
    Type: AWS::ApiGateway::RestApi
    Properties:
      ApiKeySourceType: HEADER
      Description: An API Gateway with a Mock Integration
      EndpointConfiguration:
        Types:
          - EDGE
      Name: mock-api

  ApiGatewayResource:
    Type: AWS::ApiGateway::Resource
    Properties:
      ParentId: !GetAtt ApiGatewayRestApi.RootResourceId
      PathPart: 'mock'
      RestApiId: !Ref ApiGatewayRestApi

  ApiGatewayMethod:
    Type: AWS::ApiGateway::Method
    Properties:
      ApiKeyRequired: false
      AuthorizationType: NONE
      HttpMethod: POST
      Integration:
        ConnectionType: INTERNET
        IntegrationResponses:
          - ResponseTemplates:
              application/json: "{\"message\": \"OK mock response\"}"
            SelectionPattern: '2\d{2}'
            StatusCode: 200
          - ResponseTemplates:
              application/json: "{\"message\": \"Internal Server Error mock response\"}"
            SelectionPattern: '5\d{2}'
            StatusCode: 500
        PassthroughBehavior: WHEN_NO_TEMPLATES
        RequestTemplates:
          application/json: "{\"statusCode\": $input.json('$.statusCode'), \"message\": $input.json('$.message')}"
        Type: MOCK
        TimeoutInMillis: 29000
      MethodResponses:
        - ResponseModels:
            application/json: !Ref ApiGatewayModel
          StatusCode: 200
        - ResponseModels:
            application/json: !Ref ApiGatewayModel
          StatusCode: 500
      OperationName: 'mock'
      ResourceId: !Ref ApiGatewayResource
      RestApiId: !Ref ApiGatewayRestApi

  ApiGatewayModel:
    Type: AWS::ApiGateway::Model
    Properties:
      ContentType: 'application/json'
      RestApiId: !Ref ApiGatewayRestApi
      Schema: {}

  ApiGatewayStage:
    Type: AWS::ApiGateway::Stage
    Properties:
      DeploymentId: !Ref ApiGatewayDeployment
      Description: Mock API Stage v0
      RestApiId: !Ref ApiGatewayRestApi
      StageName: 'v0'

  ApiGatewayDeployment:
    Type: AWS::ApiGateway::Deployment
    DependsOn: ApiGatewayMethod
    Properties:
      Description: Mock API Deployment
      RestApiId: !Ref ApiGatewayRestApi

要用 SAM 以另一种方式做到这一点 - 我有

  • 手动创建了一个简单的 API 网关,其中包含单个 GET 和集成响应中静态文本的模拟响应。
  • 使用 aws apigateway get-export
  • 导出
  • 删除服务器和策略块(我将在我的 sam 模板中使用的那些)
  • 在 DefinitionBody
  • 的 API 属性中参考 SAM 模板中的 OAS 规范
  • 上传 OAS 规范
  • 使用 SAM 部署

the SAM specifications.

对于这种方法感谢valdeci for , and Jens Eickmeyer for this post