我能够使用Cloudformation /无服务器应用程序模型来定义和部署我的API网关+ Lambda堆栈,希望将模型添加到我的API中。
我已经在YAML中创建了该模型,但是它似乎无法引用文件Outputs
部分中定义的API。
我看到的错误是
无法创建变更集:服务员ChangeSetCreateComplete失败: 服务员遇到终端故障状态,状态:FAILED。
原因: 模板格式错误:尚未解决的资源依赖项[MyApi] 模板的资源块
是否可以引用Output
对象,或者在这种情况下不将其视为资源?即我是否需要显式定义AWS::Serverless::Api
而不是使用Output
?
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Resources:
PutItemFunction:
Type: AWS::Serverless::Function
Properties:
FunctionName: put_item
Handler: handlers.put_item
Runtime: python3.6
Events:
PutResource:
Type: Api
Properties:
Path: /
Method: put
ModelResource:
Type: AWS::ApiGateway::Model
Properties:
RestApiId:
Ref: MyApi
ContentType: "application/json"
Name: MyModel
Schema:
"$schema": "http://json-schema.org/draft-04/schema#"
type: object
properties:
id:
type: string
Outputs:
MyApi:
Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/s/"
答案 0 :(得分:1)
首先,模板的“输出”部分用于显示模板执行后的信息。在创建资源时,您无法获得对该部分中任何内容的引用。
无服务器函数中 Api
属性的 Events
类型的文档位于:
https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-function-api.html
有一个名为 RequestModel
的属性可以添加到您的 Path
和 Method
属性下方以引用您的 ModelResource
模型。因此,您的活动部分可能如下所示:
Events:
PutResource:
Type: Api
Properties:
Path: /
Method: put
RequestModel: MyModel
...并取出 RestApiId
属性。
我还没有测试过这个,所以我不知道它是否会起作用,但试一试。而且,由于我在您提出这个问题 2 年后才回答这个问题,所以您可能已经想通了。