【问题标题】:Simple API gateway with Mock response defined in SAM?SAM中定义了模拟响应的简单API网关?
【发布时间】:2021-12-09 12:12:51
【问题描述】:

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

它有一个“/”方法和“GET”HTTP 类型。

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

没什么花哨的,所有请求都会通过。

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

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

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

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

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

而且一切都很顺利。

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

到目前为止,我很茫然。

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

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

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

任何帮助表示赞赏!

【问题讨论】:

    标签: amazon-web-services mocking aws-api-gateway serverless aws-sam


    【解决方案1】:

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

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

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

    正如我们在 AWS 中看到的documentation

    无服务器应用程序是 Lambda 函数、事件源和其他资源的组合,它们协同工作以执行任务。请注意,无服务器应用程序不仅仅是一个 Lambda 函数,它还可以包含其他资源,例如 API、数据库和事件源映射

    因此,如果您不使用 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。我看到类型不同,AWS::ApiGateway....等与 AWS::Serverless 相比,后者的定义集要小得多。我确实想使用 SAM,因为我最终会部署一两个 lambda(准备好),但想使用 mock 来进行一些小的静态响应。我发现了一些看起来可行并且会添加答案的东西
    • 答案中列出的所有这些类型都适用于 Sam。 serverlrss 仅适用于 lambda 和 stepfunctions,要使用它们,您只需将 Transform: AWS::Serverless-2016-10-31 添加到模板顶部即可。 SAM 模板实际上只是现有 Cloudformation 结构之上的附加部分。虽然有一些简化(即 api 网关无服务器版本是处理 lambda* 包的一部分,但大多数非 SAM 版本继续工作。
    • 根据我的尝试,这个例子适用于 SAM 和 Cloudformation,使用相同的模板,你能分享@mud 你在做什么吗?如果您需要,我可以创建一个 SAM 项目并与您分享
    • 谢谢 - 我假设我的错误被引入并重试。至于我在做什么,我尝试将建议编辑为 GET 而不是 POST,并删除一些我认为可以的相关部分(输入、模型等),但必须在此过程中破坏它跨度>
    • 它部署精美,无需更改:D 谢谢。它比我需要的要复杂一些,所以试图弄清楚它想要发布的内容,也许可以通过一些示例请求来改进答案。
    【解决方案2】:

    使用 SAM 的另一种方式 - 我有

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

    the SAM specifications.

    感谢valdeci this answer 和 Jens Eickmeyer for this post 提供这种方法

    【讨论】:

      猜你喜欢
      • 2021-09-17
      • 2021-01-01
      • 2018-01-03
      • 2017-06-23
      • 2019-11-03
      • 2021-02-03
      • 2014-01-09
      • 2018-11-28
      • 1970-01-01
      相关资源
      最近更新 更多