describe-images
命令,它将打印出很多信息。 我的要求是仅获取图像ID,以便我可以使用它来创建启动配置或使用最新的AMI-ID启动实例。
最新功能是可以使用AWS Systems Manager参数存储|获得最新的Amazon Linux AMI IDS的功能| 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
可以更改为: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
Plus,它可以在cloudformation模板中使用:# Use public Systems Manager Parameter
Parameters :
LatestAmiId :
Type : 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
Default: ‘/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2’
Resources :
Instance :
Type : 'AWS::EC2::Instance'
Properties :
ImageId : !Ref LatestAmiId
用于过滤输出并获得唯一所需属性的方法是使用过滤器的组合,在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'
命令解释:
,因为我发现某些图像缺少了
名。值支持通配符。 在过滤器上更多
Query:查询可用于仅过滤输出所需的内容。您也可以在输出中存在的字段上排序。我已经对图像和创建日期进行了排序,以获取最后一个创建的图像并过滤imageId
输出:根据您计划消费的方式,输出可以是
jsonimport 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']
update:
您可以使用细粒过滤器来获得更快的响应。 @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'
]
)
# Use public Systems Manager Parameter
Parameters:
LatestAmiId:
Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'
Resources:
Instance:
Type: 'AWS::EC2::Instance'
Properties:
ImageId: !Ref LatestAmiId
aws ssm get-parameters-by-path --path "/aws/service/ami-amazon-linux-latest" --region us-east-1
Get-SSMParametersByPath -Path "/aws/service/ami-amazon-linux-latest" -region us-east-1
vaulstein和John Rotenstein的答案帮助我理解了这一解决方案。谢谢!
在我的情况下,我们有很多由不同所有者发布的私人AMI(有2-3),并且使用Centos或Amazonlinux2作为基础创建了他们的自定义私人AMIS。任务是找到在X86体系结构上使用的最新AMI,并基于Amazonlinux2。注意我不使用 - 所有者,因为在我的情况下,AMIS由不同的团队发布并具有不同的所有者ID。但是,如果您有一个发表这些的单一所有者/团队,则建议包括滤除所有其他不需要的AMI的选项。
aws ec2 describe-images \
--query 'sort_by(Images, &CreationDate)[-1].Name' \
--region eu-west-1 \
--no-include-deprecated \
--executable-users self \
--output text \
--filters "Name=name,Values=here-ami-amzn2-*" \
"Name=architecture,Values=x86_64" \
"Name=image-type,Values=machine" \
"Name=state,Values=available" \
"Name=virtualization-type,Values=hvm" \
"Name=root-device-type,Values=ebs"
解释: 我们在这里做的是:
this获得由CreationDate排序的结果。我们正在从结果中获取-1(最后/最新)项目的名称。--query 'sort_by(Images, &CreationDate)[-1].Name'
注意可用的AMI可能因地区而异,因此请确保指定您打算实例化的区域。
--region eu-west-1 \
避免弃用AMIS(如果有)。我们没有任何东西,但决定将来要安全。
--no-include-deprecated \
确保您实际上是您使用的。
--executable-users self \
这是可选的。如果文本,则返回AMI名称,而无需双引号--output text \
filters用于缩小结果并排除不需要的结果。幸运的是,我们的组织以AMI名称易于与Wither Amzn2或CentOS区分开的方式命名了AMIS。我们想要Amazon Linux 2ami
--filters "Name=name,Values=org-name-ami-amzn2-*" \
我们具有AMIS的ARM和X86_64版本,并且我的团队代码仅在X86_64上进行了测试。因此,选择:
"Name=architecture,Values=x86_64" \
这可能具有不同的价值,我认为对于大多数人来说,这将是机器
"Name=image-type,Values=machine" \
仅在可用状态下选择AMI:
"Name=state,Values=available" \
这是虚拟化实现的方式。大多数人可以安全选择HVM:
"Name=virtualization-type,Values=hvm" \
conlose Amis具有root卷为EBS
"Name=root-device-type,Values=ebs"
我在这里看到了一个类似的脚本https://github.com/bwood/latest-ami/blob/master/latest-ami.py
如何出于某种原因,当运行时,我会遇到错误
您可以使用Terraform中的过滤器选项获得最新的Amazon Ami Image 2023
data "aws_ami" "base_ami" {
most_recent = true
owners = ["amazon"]
filter {
name = "name"
values = ["al2023-ami-2023.*-x86_64"]
}
filter {
name = "architecture"
values = ["x86_64"]
}
filter {
name = "virtualization-type"
values = ["hvm"]
}
}
*架构刚刚添加了
resource "aws_instance" "ec2_instance" {
ami = data.aws_ami.base_ami.id
count = "1"
subnet_id = "<your subnet>"
instance_type = "<instance type>"
key_name = "<private_key>"
}
awsssm get-parameter -name“/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64” - grigion us-east-east-1-query“ parameter.value” - - 输出文本