我尝试使用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的名称,所以我不认为这是问题所在。关于我将如何调整其不满意的内容的任何想法?
我已经删除了很多我的配置,因此我现在指定的唯一属性是name
,我仍然得到相同的错误(Invalid REST API identifier specified
):< / p>
{
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "lorem.io Stack",
"Resources": {
"API": {
"Type" : "AWS::ApiGateway::RestApi",
"Properties" : {
"FailOnWarnings": true,
"Name": "Hello World"
}
}
}
}
根据documentation Name
是唯一必需的属性 - 这是一个带有CloudFormation的错误还是我错过了什么?
答案 0 :(得分:5)
您提供的原始模板和“Update 1”最小示例都是在我的本地测试中成功创建的,我没有看到任何明显的问题。
我注意到上面的事件日志屏幕截图显示的是UPDATE_FAILED
而不是CREATE_FAILED
,并且认为问题出现在尝试“更新”现有资源的某处。
在CloudFormation堆栈初始创建后,是否可能手动修改/删除了原始RestAPI
资源?如果是这样,请注意这违反了“Manage All Stack Resources Through AWS CloudFormation”最佳做法,可能是错误的来源:
不要对AWS CloudFormation之外的堆栈资源进行更改。这样做会导致堆栈模板与堆栈资源的当前状态不匹配,如果更新或删除堆栈,这可能会导致错误。
要恢复,您可以更改资源的逻辑名称(例如,从API
更改为API2
)并再次更新堆栈。这将导致新的RestAPI
资源与旧资源分开创建。
答案 1 :(得分:3)
我花了很多时间尝试使用您提供的lorem.json
和BodyS3Location
内容进行复制,但无法重现错误。这里是否缺少更多模板内容或背景信息?
我认为错误可能在于您的Swagger模板,而不是CloudFormation。通过故意向Swagger模板(foobar
而不是get
)添加无效方法,我能够在 AWS控制台中重现错误,然后创建堆栈。堆栈已成功创建,但尝试在控制台中查看API时显示错误。
我甚至查看了这篇文章的历史,并尝试使用原始 Swagger模板进行复制,但是堆栈不会创建。这让我相信您的堆栈有一些历史记录,并且可能最初创建了API资源,正如错误所示,指定了一个&#34;无效的REST API标识符&#34;。