【问题标题】:AWS AMI deprecation (API: ec2:RunInstances Not authorized for images)AWS AMI 弃用(API:ec2:RunInstances 未授权图像)
【发布时间】:2014-05-04 09:37:54
【问题描述】:

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

似乎他们每个月都会创建新图像,并在新图像发布 2 周左右后弃用旧图像。这会产生很多问题:

  1. 旧模板堆栈损坏。
  2. 模板需要更新。

我错过了什么吗?

例如 我在看

API:ec2:RunInstances 未授权图像:[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 工作方式中的一个重大设计缺陷。

标签: amazon-web-services amazon-ami amazon-cloudformation


【解决方案1】:

你确实是对的。发布新版本时不推荐使用 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 自定义资源的文档:http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/crpg-walkthrough.html

还有来自 re:Invent 的演讲:https://www.youtube.com/watch?v=ZhGMaw67Yu0#t=945(以及用于 AMI 查找的 this sample code

您还可以选择根据 Amazon 提供的 AMI 创建您自己的自定义 AMI。即使您不修改任何内容。您的自定义 AMI 将与 Amazon 提供的完全相同,但在 Amazon AMI 弃用后仍然可用。

Netflix 有帮助管理 AMI 的开源工具,请查看 Aminator

Linux AMI 在发布多年后被弃用(2003.11 今天仍然可用!),但 Windows AMI 在补丁版本可用后立即被弃用。这是出于安全原因。

【讨论】:

  • 我想我的另一个选择是启动实例并从中创建我的私有图像.....zzz。虽然您的答案可能是标准的,但它会产生不一致的问题,因为我之前创建的内容是用“特定”图像测试的,可能不适用于未来的图像。
  • 你说得对,我忘了提到基于亚马逊提供的创建您自己的自定义 AMI 的选项。即使没有修改。这也会增加管理这些的管理开销。特别是如果您部署到多个区域。 Netflix 有开源工具来帮助管理 AMI,看看 Aminator 和 Asgard
  • 我知道 Asgard 用于应用程序部署和资源管理,但不了解 Aminator。感谢您的建议。
  • 您能否将这些添加到问题中,我会将其标记为答案。谢谢。
  • 嗯,Aminator 仅适用于 CentOS 和 RHL。我的一些东西需要窗户。这和 windows 需要在 AWS 上使用捆绑而不是快照。呃……拥有一个历史悠久的 AMI 库真的不会花费那么多,不知道为什么他们必须弃用它们。 zzz。
【解决方案2】:

这个 ps 脚本适用于我的目的,我们使用 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

}

【讨论】:

  • 对不起,没有。请参阅我对上一个答案的评论。无论我在 Dev、UAT、Staging、w/e 中使用什么图像,我都将在 Prod 中使用它。不,如果,不,但是,不。
  • 啊,我在浏览 cmets 时表现不佳。看起来你必须削减一个ami。你最后是怎么处理的?
  • 我们使用用户数据运行一些脚本来准备机器。不,我们目前没有全面的解决方案。它在我们的待办事项清单上,但非常遥远。 ://
  • 我的意思是准备好机器并拿走它。
【解决方案3】:

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

对我来说,问题是 AMI 没有正确的权限让我的用户从其他帐户运行它。

为了修复它,我登录了另一个帐户并将所需的权限添加到 ami:

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

更多信息请访问this documentation page

【讨论】:

  • 此外,还可以更新源账户中的权限:在 AMI AWS 控制台管理页面中,选择所需的 AMI,然后选择操作菜单项“修改映像权限”以添加所需的账户。注意:CLI 命令需要一个提及 UserId 的帐号。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-12
    • 2019-03-11
    • 1970-01-01
    • 2019-03-22
    • 2019-10-15
    相关资源
    最近更新 更多