我正在尝试编写我的第一个云信息模板。我以 ELB 示例为基础。
在我的例子中,我将仅使用 64 位实例,t1.micro 大小。但是,我在模板文件中找不到指定我的实例需要 64 位架构的位置。当我尝试创建新堆栈时,它会考虑一段时间,然后失败/回滚,并出现创建第一个实例的错误:
“请求的实例类型的架构(i386)与清单中的架构不匹配”。
清单 arch 是正确的,为 64 位 — 我认为我的问题是由于我没有明确指定体系结构,所以它默认为 i386。我该如何纠正这个问题?模板参考文档中没有什么让我印象深刻的东西。
答案1
但是我在模板文件中找不到可以指定我的实例需要 64 位架构的地方。
假设您正在处理可通过以下方式下载的示例模板创建负载平衡的 Apache 网站,实例类型和架构映射通过这两个表连接:
"Mappings" : {
"AWSInstanceType2Arch" : {
"t1.micro" : { "Arch" : "64" },
"m1.small" : { "Arch" : "32" },
"m1.large" : { "Arch" : "64" },
"m1.xlarge" : { "Arch" : "64" },
"m2.xlarge" : { "Arch" : "64" },
"m2.2xlarge" : { "Arch" : "64" },
"m2.4xlarge" : { "Arch" : "64" },
"c1.medium" : { "Arch" : "32" },
"c1.xlarge" : { "Arch" : "64" },
"cc1.4xlarge" : { "Arch" : "64" }
},
"AWSRegionArch2AMI" : {
"us-east-1" : { "32" : "ami-6411e20d", "64" : "ami-7a11e213" },
"us-west-1" : { "32" : "ami-c9c7978c", "64" : "ami-cfc7978a" },
"eu-west-1" : { "32" : "ami-37c2f643", "64" : "ami-31c2f645" },
"ap-southeast-1" : { "32" : "ami-66f28c34", "64" : "ami-60f28c32" },
"ap-northeast-1" : { "32" : "ami-9c03a89d", "64" : "ami-a003a8a1" }
}
},
该接线的工作原理如下:
这AWSInstanceType2Arch映射表指定每个实例类型所需的体系结构(已经满足您的需求[即“t1.micro”:{“Arch”:“64”}])。
这AWSRegionArch2AMI映射表指定每个区域特定于架构的 AMI。即哪个 AMI 实际上提供了上面映射的正确架构。
例如,如果您使用此模板在 eu-west-1 区域启动 t1.micro 实例,它将首先推断出架构64从AWSInstanceType2Arch然后是 AMI 标识符ami-31c2f645从AWSRegionArch2AMI反过来。
该示例原则上应该可以正常工作(尽管我现在还没有亲自测试过),因此AWSRegionArch2AMI是您需要自定义的片段,方法是将示例 AMI 标识符替换为要用于 t1.micro 64 位实例的正确架构绑定标识符;但是:
“请求的实例类型的架构(i386)与清单中的架构不匹配”。
错误消息表明用于启动实例的 AMI 实际上是 32 位 AMI - 可能是您意外地将示例中的 64 位 AMI 标识符替换为 32 位 AMI 标识符?
答案2
事实上,我已经弄清楚了。我已在 AWS Cloudformation 论坛但我忘了(抱歉)这个帖子也处于活跃状态。
问题是 ELB 模板示例不完整 - 所以当我复制它时,我的示例也不完整:您需要明确指定实例类型(例如 t1.micro 或 m1.large),否则会假定默认值。
引用我在 AWS 论坛上的帖子
我复制的示例 ELB 模板未指定其创建的实例的 InstanceType 属性。它使用 InstanceType 来查找 AMI,但实际上并未指定它。
如果您指定 InstanceType 以及匹配的 AMI,那么一切都很好。
例如,这是从正确指定的模板中提取的:
"Parameters" : {
"InstanceType" : {
"Description" : "Type of EC2 instance to launch",
"Type" : "String",
"Default" : "t1.micro"
}
...
"LaunchConfig": {
"Type": "AWS::AutoScaling::LaunchConfiguration",
"Properties": {
"SecurityGroups": [{"Ref": "SecurityGroup" }],
"KeyName" : { "Ref" : "KeyName" },
"InstanceType" : { "Ref" : "InstanceType" }
....
}
},
`
我还没有尝试过,但我预计如果没有添加此参数,AWS 示例将不适用于所有 AMI 组合。
Cloudformation 很不错,但目前还处于早期阶段。到目前为止,我已经在文档中发现了几个错误。所以,如果你遇到障碍,不要以为你做错了什么……你可能没有。