web-dev-qa-db-ja.com

AWS CloudFormation w / AWS :: ApiGateway :: RestApiは無効なREST API識別子が指定されています

CloudFormationを使用してAWS::ApiGateway::RestApiリソースを作成しようとしていますが、実行中

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

これは失敗してしまい、CloudFormationコンソールを見ると、エラーはInvalid REST API identifier specifiedであることがわかります。

enter image description here

これが私の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"
        }
      }
    }
  }
}

ここでは、以下を含むS3オブジェクトを指すBodyS3Locationを指定しています。

{
  "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"
      }
    }
  }
}

documentationNameが唯一の必須属性によると-これはCloudFormationのバグですか、それとも何かが足りませんか?

9
Kyle Decot

元のテンプレートと提供した「Update1」の最小限の例の両方がローカルテストで正常に作成されましたが、どちらにも明らかな問題は見られません。

上記のイベントログのスクリーンショットにUPDATE_FAILED の代わりに CREATE_FAILED、そして問題は既存のリソースを「更新」しようとする試みのどこかにあると思います。

CloudFormationスタックの最初の作成後に、元のRestAPIリソースが手動で変更/削除された可能性はありますか?その場合、これは「 AWS CloudFormationを介してすべてのスタックリソースを管理する 」のベストプラクティスに違反し、エラーの原因となる可能性があることに注意してください。

AWSCloudFormationの外部のスタックリソースに変更を加えないでください。これを行うと、スタックのテンプレートとスタックリソースの現在の状態の間に不一致が生じ、スタックを更新または削除した場合にエラーが発生する可能性があります。

回復するには、リソースの論理名を変更できます(たとえば、APIからAPI2)そしてスタックを再度更新します。これにより、新しいRestAPIリソースが古いリソースとは別に作成されます。

5
wjordan

ご提供いただいたlorem.jsonおよびBodyS3Locationのコンテンツを使用して複製を試みましたが、エラーを再現できませんでした。ここに不足しているテンプレートコンテンツや背景情報が他にありますか?

エラーはCloudFormationではなくSwaggerテンプレートにあると思います。 AWSコンソールでエラーを再現することができました。Swaggerテンプレートに無効なメソッドを意図的に追加し(foobarではなくget)、スタックを作成しました。スタックは正常に作成されましたが、コンソールでAPIを表示しようとするとエラーが表示されました。

この投稿の履歴を見て、originalSwaggerテンプレートを使用して複製しようとしましたが、スタックは作成されませんでした。これにより、スタックに何らかの履歴があると思われます。おそらく、エラーが示すように、APIリソースは最初に「無効なREST API識別子が指定されました」で作成されました。

3
Hijinks