【问题标题】:AWS CloudFormation w/ AWS::ApiGateway::RestApi gives Invalid REST API identifier specifiedAWS CloudFormation w/ AWS::ApiGateway::RestApi 给出了指定的无效 REST API 标识符
【发布时间】:2017-04-27 18:18:40
【问题描述】:

我正在尝试使用 CloudFormation 创建 AWS::ApiGateway::RestApi 资源,但在运行时

aws cloudformation deploy --template-file lorem.json --stack-name lorem

这最终失败了,在查看 CloudFormation 控制台时,我发现错误是 Invalid REST API identifier specified

这是我的lorem.json 文件:

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "lorem.io Stack",
  "Resources": {
    "API": {
      "Type" : "AWS::ApiGateway::RestApi",
      "Properties" : {
        "FailOnWarnings": true,
        "BodyS3Location": {
          "Bucket": "cloudformation.lorem.io",
          "Key": "open-api.json"
        }
      }
    }
  }
}

这里我指定了BodyS3Location,它指向一个包含以下内容的 S3 对象:

{
  "swagger": "2.0",
  "info": {
    "title": "Lorem.IO API",
    "version": "1.0.0"
  },
  "definitions": {
    "Generator": {
      "type": "object",
      "properties": {
        "title": {
          "type": "string"
        }
      }
    }
  },
  "produces": [
    "application/json"
  ],
  "paths": {
    "/generators": {
      "get": {
        "responses": {
          "200": {
            "schema": {
              "type": "array",
              "items": {
                "$ref": "#/definitions/Generator"
              }
            }
          }
        }
      }
    }
  }
}

因为我是根据documentation 提供这个文件的,所以我不应该提供 RestApi 的名称,所以我认为这不是问题所在。知道我将如何去调试它不满意的地方吗?

更新 #1

我已经删除了很多配置,因此我现在指定的唯一属性是 name,但我仍然收到相同的错误 (Invalid REST API identifier specified):

{
  "AWSTemplateFormatVersion": "2010-09-09",
  "Description": "lorem.io Stack",
  "Resources": {
    "API": {
      "Type" : "AWS::ApiGateway::RestApi",
      "Properties" : {
        "FailOnWarnings": true,
        "Name": "Hello World"
      }
    }
  }
}

根据 documentation Name 是唯一必需的属性 - 这是 CloudFormation 的错误还是我遗漏了什么?

【问题讨论】:

标签: amazon-web-services amazon-cloudformation


【解决方案1】:

您提供的原始模板和“更新 1”最小示例都在我的本地测试中成功创建,我看不出它们有任何明显的问题。

我注意到上面的事件日志屏幕截图是 UPDATE_FAILED 而不是 CREATE_FAILED,我认为问题出在尝试“更新”现有资源的某个地方。

是否有可能在 CloudFormation 堆栈初始创建后手动修改/删除了原始 RestAPI 资源?如果是这样,请注意这违反了“Manage All Stack Resources Through AWS CloudFormation”最佳实践,并且可能是错误的根源:

请勿在 AWS CloudFormation 之外更改堆栈资源。这样做会导致堆栈模板与堆栈资源的当前状态不匹配,如果您更新或删除堆栈,可能会导致错误。

要恢复,您可以更改资源的逻辑名称(例如,从 APIAPI2)并再次更新堆栈。这将导致新的RestAPI 资源与旧资源分开创建。

【讨论】:

  • 我在 API Gateway 控制台中手动删除 Cloudformation 创建的 API 后遇到了这个问题。删除 CF 堆栈并重新创建它解决了问题。
【解决方案2】:

我花了很长时间尝试使用您提供的 lorem.jsonBodyS3Location 内容进行复制,但无法重现错误。这里是否缺少更多模板内容或背景信息?

我认为错误可能在于您的 Swagger 模板,而不是 CloudFormation。通过故意向 Swagger 模板(foobar 而不是 get)添加无效方法,然后创建堆栈,我能够在 AWS 控制台 中重现错误。堆栈已成功创建,但尝试在控制台中查看 API 时显示您的错误。

我什至查看了这篇文章的历史,并尝试使用 original Swagger 模板进行复制,但堆栈不会创建。这使我相信您的堆栈有一些历史记录,并且可能最初创建 API 资源时,正如错误所暗示的那样,“指定了无效的 REST API 标识符”。

【讨论】:

    猜你喜欢
    • 2017-11-08
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 2018-11-24
    • 2022-08-04
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多