当我的 EC2 实例使用 AMI 不再为公有,或者看到“无法加载 ami-xxxxxx 的详细信息。你可能无权查看它。”的错误时该怎么做?

上次更新时间:2019 年 11 月 7 日

我在 AWS 管理控制台中无法再选择我的 Amazon Elastic Compute Cloud (Amazon EC2) 实例使用的 Amazon 系统映像 (AMI)。当我查看该 AMI 的“详细信息”选项卡时,看到“无法加载 ami-xxxxxx 的详细信息。你可能无权查看它。”的错误

如何获取不再公开可用的 AMI 的描述?

或者

我在 AWS CloudFormation 模板中引用了某个特定的 AMI ID。Amazon Web Services (AWS) 会定期创建新映像并在几周后弃用旧映像。这会导致旧模板堆栈中断或模板需要定期更新等问题。为什么会发生这种情况,我该如何防止此问题?

简短描述

您的 EC2 Windows 实例使用的 AMI 不再公有。

AWS 提供专为 Windows 平台配置的公有 AMI。每次发布的 AMI 都具有新的 AMI ID。在新 AMI 发布后 10 天内,三个月以前的 AMI 将被设为私有。

取消注册自定义 AMI 后也会出现这种情况。

有关更多信息,请参阅补丁、安全更新和 AMI ID

注意:如果您需要从同一 AMI 中启动实例,则必须从该 AMI 创建新的实例。

解决方法

检索不再公有的 AMI ID 的描述 

首先,在注册表中找到该 AMI 的名称。然后,使用 PowerShell 找到具有相同名称的最新 AMI。请按照以下步骤执行操作:

注意:这些步骤仅在您使用 Amazon 提供的 AMI 时适用。

1.    从 Amazon EC2 控制台的导航窗格中选择实例。选择要使用不再可用的 AMI 启动的实例。

2.    连接到该实例。

3.    检查以下注册表位置以确认 AMI 名称:

Get-Itemproperty HKLM:\SOFTWARE\Amazon\MachineImage -Name AMIName

注意:HKLM\SOFTWARE\Amazon\MachineImage 注册表位置含有实例启动时该 AMI 的名称和日期。

4.    运行 Get-EC2ImageByName PowerShell 命令以按名称列出所有公有 AMI。要缩小结果范围,请运行以下命令,将 AMIName 替换为第 3 步中的 AMI 名称。

Get-EC2ImageByName –Names AMIName
Example: Get-EC2ImageByName -Names WINDOWS_2016_CORE

注意:此命令将返回大量关于该映像的元数据,包括该区域的最新 AMI ID。AMI 在每个区域都有不同的 ID。

除包含了最新的 Microsoft 软件更新以及由 AWS 作出的任何性能改进外,此 AMI 与旧 AMI 相同。考虑使用最新 AMI 来启动新实例。

要接收有关这些定期更改的通知,您可以订阅 Windows AMI 通知

AMI ID 已经硬编码到 CloudFormation 模板或 IaaS 平台

最佳实践是编写按名称或描述查找最新 AWS Windows AMI 的脚本,而不是按 AMI ID 查找。每次发布后,AMI ID 都会发生变化。

有关更多信息,请参阅补丁、安全更新和 AMI ID

为免您的构建管道发生中断,您可以通过编程方式来检索 AWS 发布到公有参数仓库并且与您的需求相符的最新 AMI。有关更多信息,请参阅使用公有参数

您还可以创建自己的 AMI,从而更好地控制 AMI 的生命周期和更新。要从该 AMI 使用的实例创建映像,请执行以下步骤:

1.    停止该实例。

2.    从 Amazon EC2 控制台的导航窗格中选择实例

3.    选择该实例。对于操作,请选择映像创建映像
对于映像名称,请输入一个名称。
(可选)对于映像描述,请输入描述。
选择创建映像

4.    重要提示:第 3 步将为您的实例创建一个完全相同的映像,包括服务器名称和管理员密码。为防止冲突,请创建根据该新映像创建一个新实例。执行任何需要的自定义操作,然后再进行通用操作以创建运行正常的 AMI。有关说明,请参阅如何使用 Sysprep 创建和安装自定义可重用 Windows AMI?

5.    您现在可以使用在第 4 步中创建的映像来启动实例。


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助吗?