具有 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 部署
对于这种方法感谢valdeci for , and Jens Eickmeyer for this post
我在 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 部署
对于这种方法感谢valdeci for