获取AWS实例的最新AMI ID

Vau*_*ein 2 amazon-ec2 amazon-web-services autoscaling

我想在为自动缩放架构创建ec2实例时获取AWS Linux计算机的最新ami id。

我正在尝试使用awscli获取图像类型,但是如果使用该describe-images命令,它将打印出很多信息。

我的要求是仅获取映像ID,以便可以使用它来创建启动配置或使用最新的ami-id启动实例。

Joh*_*ein 12

一项鲜为人知的近期功能是使用AWS Systems Manager参数存储|查询最新的Amazon Linux AMI ID的功能。AWS计算博客

命名空间由两部分组成:

  • 参数存储前缀(树): /aws/service/ami-amazon-linux-latest/
  • AMI名称别名:(示例)amzn-ami-hvm-x86_64-gp2

这些:

aws ec2 describe-images --owners amazon --filters "Name=name,Values=amzn*" --query 'sort_by(Images, &CreationDate)[].Name'

Get-EC2ImageByName -Name amzn* | Sort-Object CreationDate | Select-Object Name
Run Code Online (Sandbox Code Playgroud)

可以更改为:

aws ssm get-parameters --names /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 --region us-east-1 

Get-SSMParameter -Name /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 -region us-east-1
Run Code Online (Sandbox Code Playgroud)

另外,它可以在CloudFormation模板中使用

# Use public Systems Manager Parameter
 Parameters :
 LatestAmiId :
 Type : 'AWS::SSM::Parameter::Value'
 Default: ‘/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2’

Resources :
 Instance :
 Type : 'AWS::EC2::Instance'
 Properties :
 ImageId : !Ref LatestAmiId
Run Code Online (Sandbox Code Playgroud)


Vau*_*ein 6

AWS CLI

过滤输出并获取唯一必需属性的一种方法是使用过滤器的组合,对aws describe-images命令的查询如下:

aws ec2 describe-images \ 
--owners 'amazon' \
--filters 'Name=description,Values=Amazon Linux AMI*' \
--query 'sort_by(Images, &CreationDate)[-1].[ImageId]' \
--output 'text'
Run Code Online (Sandbox Code Playgroud)

命令说明

  • 所有者:对于亚马逊的图像,请使用“ amazon”。要查询自己的图像,请使用“自我”
  • filter:您可以使用过滤器列表来过滤出您要查找的实例。我更喜欢描述,因为我发现某些图像缺少名称过滤器。支持通配符。有关过滤器的更多信息
  • query:查询只能用于过滤输出中需要的内容。您还可以对输出中将出现的字段进行排序。我对图像和创建日期进行了排序,以获取最后创建的图像并过滤了ImageId
  • 输出:根据您打算使用的输出方式,输出可以是json文本

使用Python

您可以使用以下python脚本执行相同的操作:

import boto3
from operator import itemgetter

client = boto3.client('ec2')
response = client.describe_images(
    Filters=[
        {
            'Name': 'description',
            'Values': [
                'Amazon Linux AMI*',
            ]
        },
    ],
    Owners=[
        'amazon'
    ]
)
# Sort on Creation date Desc
image_details = sorted(response['Images'],key=itemgetter('CreationDate'),reverse=True)
ami_id = image_details[0]['ImageId']
Run Code Online (Sandbox Code Playgroud)

更新:

您可以使用细粒度过滤器来获得更快的响应。@Jack的答案中提到的过滤器。

filters = [ {
    'Name': 'name',
    'Values': ['amzn-ami-hvm-*']
},{
    'Name': 'description',
    'Values': ['Amazon Linux AMI*']
},{
    'Name': 'architecture',
    'Values': ['x86_64']
},{
    'Name': 'owner-alias',
    'Values': ['amazon']
},{
    'Name': 'owner-id',
    'Values': ['137112412989']
},{
    'Name': 'state',
    'Values': ['available']
},{
    'Name': 'root-device-type',
    'Values': ['ebs']
},{
    'Name': 'virtualization-type',
    'Values': ['hvm']
},{
    'Name': 'hypervisor',
    'Values': ['xen']
},{
    'Name': 'image-type',
    'Values': ['machine']
} ]

# Use above filters 
response = client.describe_images(
  Filters=filters,
  Owners=[
      'amazon'
  ]
)
Run Code Online (Sandbox Code Playgroud)