AWS AMI废弃(API:ec2:RunInstances未被授权使用镜像)

12

我一直在使用 AWS AMI 在我的云形成模板中。

似乎他们每个月都会创建新的映像,并在发布新映像约2周后使旧映像过时。这会带来很多问题:

  1. 旧模板堆栈变得不可用。
  2. 需要更新模板。

我有什么遗漏的吗?例如,我正在查看我的云形成事件中的错误:

API: ec2:RunInstances Not authorized for images: [ami-1523bd2f]

查找后发现这是 02.12 映像 ID:http://thecloudmarket.com/image/ami-1523bd2f--windows-server-2012-rtm-english-64bit-sql-2012-sp1-web-2014-02-12

而现在有一个新的映像 ID:http://thecloudmarket.com/image/ami-e976efd3--windows-server-2012-rtm-english-64bit-sql-2012-sp1-web-2014-03-12


如果您使用自动缩放,这也是一个巨大的问题。 AMI 过时后,自动缩放开始失败,因为它无法添加新实例,您的生产系统变得损坏。这似乎是 AWS 工作方式中的重大设计缺陷。 - bikeman868
4个回答

15

你说得没错。当发布新版本时,Windows AMI会被弃用(请参阅http://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/Basics_WinAMI.html)。

目前还没有“点一下就能解决”的方法,文档上写着:“AWS每年更新几次AWS Windows AMI。更新包括弃用以前的AMI并用新的AMI和AMI ID替换它。要在更新后查找AMI,请使用名称而不是ID。AMI名称的基本结构通常相同,只是在末尾添加了一个新日期。您可以使用查询或脚本按名称搜索AMI,确认您已找到正确的AMI,然后启动实例。”

一个可能的解决方案是开发一个CloudFormation自定义资源,在启动EC2实例之前检查AMI的可用性。

有关CFN Custom Resources的文档,请参见:http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/crpg-walkthrough.html

以及re:Invent上的这个讲座:https://www.youtube.com/watch?v=ZhGMaw67Yu0#t=945(以及AMI查找的这个示例代码

您还可以选择基于Amazon提供的一个自定义AMI。即使您不修改任何内容,您的自定义AMI也将是Amazon提供的那个AMI的精确副本,并且在Amazon AMI弃用后仍然可用。

Netflix已经开源了一些工具来帮助管理AMIs,请查看Aminator

Linux AMI在发布几年后就被弃用了(2003.11至今仍可用!),但是Windows AMI只要有补丁版本可用就会被弃用,出于安全考虑。


我猜我的另一种选择是启动实例并从中创建我的私有镜像......嗯。虽然你的回答可能很标准,但它引出了不一致性的问题,因为我之前创建的内容是使用“特定”的镜像测试过的,可能无法使用未来的镜像。 - Sleeper Smith
1
你说得对,我忘了提到创建自定义AMI的选项,基于亚马逊提供的AMI,即使没有修改。这也会增加管理这些AMI的行政开销,特别是如果您部署到多个区域。Netflix已经开源了一些工具来帮助管理AMI,请查看Aminator和Asgard。 - Sébastien Stormacq
我知道Asgard用于应用程序部署和资源管理,但不知道Aminator。感谢您的建议。 - Sleeper Smith
你能把这些添加到问题中吗?我会将其标记为答案。谢谢。 - Sleeper Smith
嗯,Aminator只适用于CentOS和RHL。我的一些东西需要Windows。而且Windows需要在AWS上使用捆绑而不是快照。唉...拥有历史AMI库真的不会花费太多,不知道为什么他们要废弃它们。zzz. - Sleeper Smith

2

这个 PowerShell 脚本适用于我的需求,我们使用 Windows 2012 基础映像:

$imageId = "xxxxxxx"

if ( (Get-EC2Image -ImageIds $imageId) -eq $null ) {

    $f1 = New-Object  Amazon.EC2.Model.Filter ; $f1.Name="owner-alias";$f1.Value="amazon"
    $f2 = New-Object  Amazon.EC2.Model.Filter ; $f2.Name="platform";$f2.Value="windows"

    $img = Get-EC2Image -Filters $f1,$f2 | ? {$_.Name.StartsWith("Windows_Server-2012-RTM-English-64Bit-Base")} | Select-Object -First 1

    $imageId =$img.ImageId

}

抱歉,不行。请看我在之前回答中的评论。无论是在开发、UAT、Staging还是其他环境中使用的图像,我都会完全相同地在生产环境中使用。没有任何条件或者但是。 - Sleeper Smith
啊,我的错,我没有仔细看评论。看起来你必须要切割一个AMI。你最终是如何处理它的? - Avner
我们使用用户数据运行一些脚本来准备机器。目前我们还没有全面的解决方案。这在我们的待办事项清单上,但排在很后面。 :/ - Sleeper Smith
我是指准备好机器并对其进行 AMI。 - Sleeper Smith

0

如果您正在使用培训材料并复制代码,请确保将AMI名称替换为帐户下可见的AMI列表中提供的正确AMI图像值。其他值也是如此。如果您只是从培训代码中剪切和粘贴值,则可能现在无法使用。


0

我最近遇到了同样的错误。我在一个账户中构建了一个自定义AMI,然后尝试从另一个账户运行EC2实例。

对我来说问题是AMI没有正确的权限,以使得来自其他账户的用户可以运行它。

为了解决这个问题,我登录了另一个账户并向AMI添加了所需的权限:

aws ec2 modify-image-attribute --image-id youramiid --launch-permission "Add=[{UserId=youruserid}]"

更多信息请参见此文档页面


此外,您可以在源帐户中更新权限:从AMI AWS控制台管理页面中选择所需的AMI,然后选择“修改镜像权限”操作菜单项以添加所需的帐户。注意:CLI命令在提到UserId时需要一个帐户号码。 - Michael Behrens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接