如何过滤' Get-EC2ImageByName'获得最新的稳定AMI-ID(非-rc)?

时间:2016-03-10 09:48:13

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

我已成功通过Get-EC2ImageByName收集AMI ID,但我正在尝试确定一种方法来提取最新的" not-rc" AMI。

我目前正在运行:

Get-EC2ImageByName -Names *amzn-ami-pv*x86_64*ebs* - | Select-Object -ExpandProperty "ImageId" -First 1

它给了我:

ami-978639e4

当我跑步时:

Get-EC2ImageByName -Names *amzn-ami-pv*x86_64*ebs*

前两个条目是:

Architecture        : x86_64
BlockDeviceMappings : {/dev/sda1}
CreationDate        : 2016-02-27T22:30:03.000Z
Description         : Amazon Linux AMI 2016.03.rc-0 x86_64 PV EBS
Hypervisor          : xen
ImageId             : ami-978639e4
ImageLocation       : amazon/amzn-ami-pv-2016.03.rc-0.x86_64-ebs
ImageOwnerAlias     : amazon
ImageType           : machine
KernelId            : aki-52a34525
Name                : amzn-ami-pv-2016.03.rc-0.x86_64-ebs
OwnerId             : 137112412989
Platform            : 
ProductCodes        : {}
Public              : True
RamdiskId           : 
RootDeviceName      : /dev/sda1
RootDeviceType      : ebs
SriovNetSupport     : 
State               : available
StateReason         : 
Tags                : {}
VirtualizationType  : paravirtual

Architecture        : x86_64
BlockDeviceMappings : {/dev/sda1}
CreationDate        : 2016-02-10T22:22:22.000Z
Description         : Amazon Linux AMI 2015.09.2 x86_64 PV EBS
Hypervisor          : xen
ImageId             : ami-a93484da
ImageLocation       : amazon/amzn-ami-pv-2015.09.2.x86_64-ebs
ImageOwnerAlias     : amazon
ImageType           : machine
KernelId            : aki-52a34525
Name                : amzn-ami-pv-2015.09.2.x86_64-ebs
OwnerId             : 137112412989
Platform            : 
ProductCodes        : {}
Public              : True
RamdiskId           : 
RootDeviceName      : /dev/sda1
RootDeviceType      : ebs
SriovNetSupport     : 
State               : available
StateReason         : 
Tags                : {}
VirtualizationType  : paravirtual

我试图忽略" rc"输入,并在没有" rc"的情况下拿起第一个AMI ID。在名称中,或者只是第一个"不是rc" AMI ID。 在此示例中,我想要的AMI-ID是:

ami-a93484da

有没有人知道如何在不使用" -Skip 1"的情况下实现这一目标? (我正在避免使用" -Skip 1"因为我试图使脚本可重复,例如,如果有2个或更多" rc"版本。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

假设名称的其他部分都没有变化,您可以使用正则表达式来对抗递增的“rc- 数字”值。您可以使用以下表达式:

".rc-\d+."

此表达式检查字符串“.rc- digits ”。字符串中的任何位置, digits 可以是一个或多个数字。从那里,您可以对所需的输出进行排序和过滤。

下面是一个快速的实时测试,我在其中执行以下操作:

  • 获取与您提供的名称相符的图片。
  • 将结果传递给Where-Object(别名:?)并使用-notmatch过滤掉结果,其中我明确地查找与我的表达式不匹配的结果。
  • 按最近的AMI CreationDate排序。 (这假设稍后发布新版本)
  • 选择要输出的ImageId,Name和CreationDate。
  • 将整个表达式包装在@()中以强制输出为集合,然后通过指定[0]来检索该集合中的第一个项目。

示例:

PS C:/> @(Get-EC2ImageByName -Names "amzn-ami-pv*x86_64*ebs*" | `
Where-Object { $_.Name -notmatch ".rc-\d+." } | `
Sort CreationDate -Desc | `
Select ImageId, Name, CreationDate)[0]

<强>输出:

ImageId             Name                                    CreationDate
-------             ----                                    ------------
ami-d4f7ddbe        amzn-ami-pv-2015.09.2.x86_64-ebs        2016-02-10T22:21:22.000Z