无法在AWS :: ApiGateway :: Model资源的Outputs部分中引用API

时间:2018-08-17 20:30:57

标签: yaml aws-api-gateway amazon-cloudformation serverless-framework aws-serverless

我能够使用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/"

1 个答案:

答案 0 :(得分:1)

首先,模板的“输出”部分用于显示模板执行后的信息。在创建资源时,您无法获得对该部分中任何内容的引用。

无服务器函数中 Api 属性的 Events 类型的文档位于: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-function-api.html

有一个名为 RequestModel 的属性可以添加到您的 PathMethod 属性下方以引用您的 ModelResource 模型。因此,您的活动部分可能如下所示:

      Events:
        PutResource:
          Type: Api
          Properties:
            Path: /
            Method: put  
            RequestModel: MyModel  

...并取出 RestApiId 属性。

我还没有测试过这个,所以我不知道它是否会起作用,但试一试。而且,由于我在您提出这个问题 2 年后才回答这个问题,所以您可能已经想通了。