【问题标题】:AWS latest ami imageId from an old imageid?AWS 最新的 ami imageId 来自旧的 imageid?
【发布时间】:2017-04-21 02:36:52
【问题描述】:

我有一个 EC2 实例运行来自 AWS 的旧 AMI,在我当前的设置中来自 WINDOWS_2016_BASE。现在我知道了,但实例不知道。

使用 PowerShell,我希望 EC2 实例创建更像它自己,但不是从我创建的 AMI(因为那当然总是在旧版本中),而不是“直接”从它创建的实际 AMI ImageId从。因为如果它不是最新版本,AWS 不允许这样做(因此我需要间接路由来获取该 AMI ImageId,即使结果是相同的......即如果它已经是最新版本)。

所以我需要使用 PowerShell 找到我已经知道的 AMI 的最新版本(我从元数据中获得)并且我不想指定 AMI 的名称,例如 WINDOWS_2016_BASE,因为我想要机器可以创建更像自己的机器,而无需我对脚本中的内容进行硬编码。

我不知道该怎么做,因为我不想使用Get-EC2ImageByName -Names WINDOWS_2016_BASE,因为我不想硬编码该名称参数或通过用户数据传递它。

Get-EC2Image -ImageId <an old imageid> 返回 null,因为 AMI 不再是最新的。

【问题讨论】:

  • 不幸的是,一旦 AMI 被弃用,就无法检索 AMI 的名称。因此,您需要提供搜索名称。

标签: powershell amazon-web-services amazon-ami aws-powershell


【解决方案1】:

如果不将此名称存储在您的脚本可以提示的某个位置(您已声明您不想这样做),或者不依赖名称/amis 之间的某些映射(即 Get- EC2ImageByName 已经为你做了)。

AMI 元数据的设计使得可以轻松检索相关 AMI 的“家谱”,假设它们的名称相似,但版本或日期等可能存在细微差异。相关 AMI 的前缀一致是一种常见模式,这使得它们更易于搜索和聚合。

这一点使您的方法变得困难,因为您的脚本将丢失那部分数据——AMI 名称前缀。

您可以从 metadata service 动态检索您的实例的 AMI ID 并将其传递到 Get-EC2Image 以获取 AMI 详细信息,但是如果没有某种名称前缀来匹配并用于搜索,您将无法从那里走得更远对于较新的相关 AMI。

也许重新考虑这种方法,并通过用户数据将名称前缀隐藏在标签中或实例上?例如,我刚刚检查过,英文 Windows Server 2016 Base AMI 都共享这个前缀:Windows_Server-2016-English-Full-Base。如果您将其存储在您的实例上或作为标签之一,您的脚本可以检索它并运行以下 powershell 以获取最新的 Windows Server 2016 AMI:

@(Get-EC2Image -Owner amazon -Filter @{ Name="name"; Values="Windows_Server-2016-English-Full-Base*" } | Sort CreationDate -Desc)[0].ImageId

【讨论】:

  • CLI 等效项:aws ec2 describe-images --query Images[*].[ImageId,Name] --filters Name=name,Values=Windows_Server-2016-English-Full-Base-*,然后对结果进行排序。
  • 谢谢,这是一个很好的答案,但它有点在问题停止的同一点上,因为正是我不想做的事情变成了答案;-) 我相信我有找到了一些我现在将发布的答案。
  • @cineammispelt 对,我想这样做的动力是我在挑战你的问题的前提,并促使你考虑为什么这个解决方案 - 这或多或少是规范 -在深入兔子洞之前,它不适合您的用例。 :)
  • 确实,但我还是谢谢你们,我想我只是设法把我的头放在兔子洞里,因为我刚刚发布了实际答案。如果亚马逊停止记录图像名称,它很容易退回,但由于他们决定记录它,我怀疑他们会很快改变它。在我看来有点根深蒂固。
  • @cineammispelt 嘿,很好。很好的发现。
【解决方案2】:

来自系统日志的示例(我从 aws 控制台视图中获得)

2016/12/26 14:36:12Z:AMI 源名称:Windows_Server-2016-English-Full-Base

等效的powershell是:

获取 EC2ConsoleOutput

所以下面是完整的(我是 powershell 的新手,但我很确定有人可以以某种方式将其包装成一个字符)

# read the system console log $consoleLog = Get-EC2ConsoleOutput $currentInstanceObj.InstanceId $consoleLogOutput = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($consoleLog.Output)); # extract the lines that contain AMI Origin in them (there should be 2) - sort them so name i first and version is second $originLines = $consoleLogOutput -split '[\r\n]' | Where-Object {$_.Contains("AMI Origin")} | Sort-Object # get the running name $originLine = $originLines[0] $originLineParts = $originLine.Split(':') $originName = $originLineParts[$originLineParts.Length - 1].Trim() "The origin name is $originName" # get the running version (slighly pointless since the code below doesn't care as we want the latest - but it's for verbosity) $originLine = $originLines[1] $originLineParts = $originLine.Split(':') $originVersion = $originLineParts[$originLineParts.Length - 1].Trim() "The origin version is $originVersion" # concatenate to get the original origin name (note: amazon have a naming pattern here - (name-version) $amiName = $originName + "-" + $originVersion "The original origin ami name is $amiName" #find the latest of the same name and report the difference $latestOriginObj = (Get-EC2Image -Filter @{ Name="name"; Values=($originName + "*")} | Sort-Object CreationDate -Descending | Select-Object -First 1) if($latestOriginObj.ImageId -ne $currentInstanceObj.ImageId) { "The ami has been upgraded from " + ($currentInstanceObj.ImageId) + " to " + ($latestOriginObj.ImageId) } #....so go ahead and use the $latestOriginObj.ImageId when you create a new instance

而知识源来自这些amazons docs

摘录如下:

AWS 管理控制台提供有关您用于创建 Amazon EC2 实例的 AMI 的详细信息。描述选项卡上的 AMI ID 字段包含的信息包括 Windows Server SKU、架构(32 位或 64 位)、AMI 的创建日期和 AMI ID。

如果 AMI 已私有化或被更高版本替换并且不再列在目录中,则 AMI ID 字段状态为,“无法加载 ami-xxxxx 的详细信息。您可能无权查看它." 要确定使用哪个 AMI 创建实例,您必须打开系统日志。在 EC2 控制台中,选择一个实例,然后从上下文菜单(右键单击)选择实例设置,然后选择获取系统日志。 AMI 的创建日期和 SKU 列在 AMI 原始版本和 AMI 原始名称字段中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-23
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 2023-03-16
    • 2020-07-01
    相关资源
    最近更新 更多