我在AWS中有一个简单的API网关定义。
它有一个方法"/"用"GET"HTTP类型。
我已经更新了"集成请求"。成为一个"傻瓜"(返回一个纯API网关映射的响应…)。
没有什么花哨的,所有的请求都会通过。
对于响应,我已经更新了默认的集成响应(响应状态200,没有正则表达式,模型等)。默认的映射)。
它有一个"application/json"映射模板,在这里我刚刚添加了静态文本"hello world"(有创意,我知道)。
现在,问题是,我可以在SAM模板中定义它吗?
我可以很容易地找到很多例子来创建一个lambda函数,并让它做响应和其他各种事情。
我可以在本地运行SAM命令行来进行"SAM部署";提供相同的模板,并在我的帐户中创建一个全新的AWS堆栈,创建API网关,将lambda python或javascript等上传到s3,并创建并链接到API(通过隐式相同的定义,尚未查看外部oas/swagger)和角色等创建。
一切都很顺利。
但是,如果我想做同样的事情,但更简单-只有API网关和模拟集成响应(没有lambda) - SAM模板会是什么样子呢?
到目前为止,我还没有头绪。
我可以从无服务器模型中看到,sam (x-amazon- apiggateway -integration response)支持许多集成。
通过使用"api-gateway getexport"我可以看到oas版本是什么样子的通过aws cli。
但是我看不到一个带有隐式API创建的SAM模板,没有lambda链接,只有一个简单的Mock和静态集成响应。
感谢任何帮助!!
SAM是Cloudformation的扩展,所以是的,这是可能的,如果您创建一个SAM应用程序并添加下面的template.yaml
文件,并运行sam deploy --guided
,您将创建您需要的东西。在本例中,您将运行一个简单的cloudformation模板,可以使用以下命令进行部署:
aws cloudformation deploy --stack-name mock-api --template-file template.yaml
SAM的主要思想是促进无服务器应用程序的部署,创建在本地调用Lambda函数的可能性,改进调试等,同时提供资源。
正如我们在AWS文档中看到的:
无服务器应用程序是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: '2d{2}'
StatusCode: 200
- ResponseTemplates:
application/json: "{"message": "Internal Server Error mock response"}"
SelectionPattern: '5d{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
- 删除服务器和策略块(我将在我的同一模板中)
- 在API属性中使用DefinitionBody 引用SAM模板中的OAS规范
- 上传OAS规范
- 使用SAM部署
SAM规范。
对于这种方法,感谢valdeci的回答,以及Jens Eickmeyer的这篇文章