AWS 如何查找EC2实例特定版本的AMI ID
一、背景
在我的CloudFormation代码里面,经常会使用到特定版本的实例。但是在AWS控制台启动EC2实例时,AWS只会提供特定版本的EC2镜像,用户并不能自由选择特定的版本进行启动。要启动特定版本的EC2只能通过AWS CLI或者AWS CloudFormation在代码里面指定ami-id
信息然后启动。这里分享一下如何寻找特定版本的ami-id信息。
二、获取AWS控制台提供的镜像ami-id
对于控制台界面能够选择的实例,比较好查找对应的ami-id信息,找到这个ami-id是第一步,后续查找实例的其他版本需要用到这个ami-id。所以先看一下如何获取图形化能选择的实例ami-id。
AWS控制台界面可以通过四种途径启动EC2,分别是:
- 快速启动(Quickstart AMIs)
- 我的AMI(My AMIs)
- 亚马逊云科技Marketplace(AWS Marketplace AMIs)
- 社区AMI(Community AMIs)。
目前AWS 中国区和AWS Global区域启动EC2的界面所有区别。对于第一、二和四种类型,在控制台界面可以直接看到ami-id信息。但是对于第三种在Marketplace上的实例,两种控制台界面获取ami-id的方法有所区别。
快速启动(QUickstart AMIs)界面获取ami-id信息
我的AMI(My AMIs)界面获取ami-id信息。
社区AMI(Community AMIs)界面获取ami-id信息。
对于AWS Global区域查看AWS Marketplace AMIs,在选择镜像后,准备启动时就可以看到ami-id信息,并不需要真的启动EC2就能获取ami-id信息。
对于AWS 中国区域查看AWS Marketplace AMIs,需要启动EC2之后,选中对应实例,才能看到对应的ami-id信息。
三、查询历史版本ami-id
现在已经了解如何通过AWS控制台界面来获取实例的ami-id信息。要获取实例其他版本的ami-id,需要使用aws cli
,并配置好凭证信息(请参考往期文章《AWS CloudFormation系列--(3)Python 操作CloudFormation》介绍了如何使用 AWS CLI以及配置凭证信息)。
这里通过一个案例,来看如何获取实例特定版本的ami-id信息,例如想要获取Fortigate 6.4.10版本的ami-id信息。
AWS控制台当前提供的Fortigate版本是7.0.7,通过上面的方法,获取到7.0.7版本的ami-id是ami-0f2b0162d497c9988
。
下面需要使用aws ec2 describe-images
[1]命令来查看这个ami-id的详细信息。
使用--region
参数,指定只查看Tokyo区域的的镜像。使用--image-ids
,指定ami-id信息。命令可以在有凭证的主机上运行,也可以在AWS CloudShell
上操作。
aws ec2 describe-images \
--region ap-northeast-1 \
--image-ids ami-0f2b0162d497c9988
AWS Gloabl区域提供CloudShell服务,进入之后可以直接配置AWS CLI,拥有和图形化界面用户相同的权限。
输出结果主要关注Description
字段,里面的信息可以作为下一次过滤的字段,例如里面有FortiGate、AWSONDEMAND、7.0.7等关键词。
[cloudshell-user@ip-10-0-179-71 ~]$ aws ec2 describe-images \
> --region ap-northeast-1 \
> --image-ids ami-0f2b0162d497c9988
{
"Images": [
{
"ProductCodes": [
{
"ProductCodeId": "2wqkpek696qhdeo7lbbjncqli",
"ProductCodeType": "marketplace"
}
],
"Description": "FortiGate-VM64-AWSONDEMAND build0367 (7.0.7) GA",
"VirtualizationType": "hvm",
"Hypervisor": "xen",
"ImageOwnerAlias": "aws-marketplace",
"EnaSupport": true,
"SriovNetSupport": "simple",
"ImageId": "ami-0f2b0162d497c9988",
"State": "available",
"BlockDeviceMappings": [
{
"DeviceName": "/dev/sda1",
"Ebs": {
"SnapshotId": "snap-04c5af4435c4672a3",
"DeleteOnTermination": true,
"VolumeType": "gp2",
"VolumeSize": 2,
"Encrypted": false
}
},
{
"DeviceName": "/dev/sdb",
"Ebs": {
"Encrypted": false,
"DeleteOnTermination": true,
"VolumeType": "gp2",
"VolumeSize": 30
}
}
],
"Architecture": "x86_64",
"ImageLocation": "aws-marketplace/FortiGate-VM64-AWSONDEMAND build0367 (7.0.7) GA-3124a694-441c-4ff1-8bf7-4d153be424a6",
"RootDeviceType": "ebs",
"OwnerId": "679593333241",
"RootDeviceName": "/dev/sda1",
"CreationDate": "2022-10-20T15:56:18.000Z",
"Public": true,
"ImageType": "machine",
"Name": "FortiGate-VM64-AWSONDEMAND build0367 (7.0.7) GA-3124a694-441c-4ff1-8bf7-4d153be424a6"
}
]
}
有了上面三个关键词之后,只需要替换版本信息,就可以进行精确的过滤查找了。
aws ec2 describe-images \
--region ap-northeast-1 \
--filters "Name=description,Values=*FortiGate*AWSONDEMAND*6.4.10*" \
--query 'Images[*].{Description:Description,ImageId:ImageId,Architecture:Architecture}'
--filters
:通过filters字段可以过滤特定字段里面的关键词,前面通过查询特定的ami-id信息,就是为了了解有哪些可以作为关键词进行查找的,这个关键字一般要经过多次尝试。
AWSONDEMAND
:这个关键词表示AWS推荐的实例,一般是PAYG(pay as you go)类型的授权。如果不添加这个关键词,会返回两个6.4.10版本的ami-id,不包含AWSONDEMAND关键词的BYOL类型的License。
--query
:这个参数可以控制返回哪些字段信息,简化输出结果。
输出结果如下,加了三个关键词,控制只输出描述信息、ami-id信息,还有系统架构信息。
[cloudshell-user@ip-10-0-179-71 ~]$ aws ec2 describe-images \
> --region ap-northeast-1 \
> --filters "Name=description,Values=*FortiGate*AWSONDEMAND*6.4.10*" \
> --query 'Images[*].{Description:Description,ImageId:ImageId,Architecture:Architecture}'
[
{
"Description": "FortiGate-VM64-AWSONDEMAND build2000 (6.4.10) GA",
"ImageId": "ami-0abf1a002258e8077",
"Architecture": "x86_64"
}
]
还可以通--output
参数,来指定输出的文本格式,默认是json类型,这里输出文本类型。而且只查看ami-id信息,会输出非常简洁的结果。
aws ec2 describe-images \
--region ap-northeast-1 \
--filters "Name=description,Values=*FortiGate*AWSONDEMAND*6.4.10*" \
--query 'Images[*].[ImageId]' \
--output text
ami-0abf1a002258e8077
四、实战案例
4.1 查询Cisco ASAv 9.14.4 ami-id
已知东京区域Cisco ASAv 9.18.1版本的ami-id是ami-058c3870fc61fdc32
,请查询9.14.4版本的ami-id信息。
首先查看这个ami-id的详细信息,主要是查看Description字段里面可以提取的关键词。
aws ec2 describe-images \
--region ap-northeast-1 \
--image-ids ami-058c3870fc61fdc32
输出结果摘要如下,可以看到关键词是asav9-18-1
...
"Description": "[Copied ami-00ce522a548e6bc01 from us-east-1] asav9-18-1-ENA",
...
进一步查询asav9-14-4版本的信息:
aws ec2 describe-images \
--region ap-northeast-1 \
--filters "Name=description,Values=*asav9-14-4*" \
--query 'Images[*].{Description:Description,ImageId:ImageId}'
输出结果如下,可以看到有两个ami-id信息,而且从描述来看也没法区分哪个是BYOL的授权,哪个是PAYG(pay as you go)类型的授权。这种情况根据我的个人经验(不一定准确),这个输出结果的顺序与AWS控制台当前版本的顺序大概率是一致的,所以可以先猜测第二个ami-id是PAYG类型的授权。
[
{
"Description": "[Copied ami-03e7d9c4b42328a0b from us-east-1] asav9-14-4-ENA",
"ImageId": "ami-0aed364da25893e71"
},
{
"Description": "[Copied ami-03e7d9c4b42328a0b from us-east-1] asav9-14-4-ENA",
"ImageId": "ami-0f46125dd0064a704"
}
]
如果需要进一步确认,可以使用命令行快速在默认VPC使用这个ami-id启动一台EC2确认一下。
aws ec2 run-instances --image-id ami-0f46125dd0064a704 --count 1 --instance-type c5.xlarge --key-name Global_Tokyo_KeyPair --security-group-ids sg-cbd442b7 --subnet-id subnet-ee03eca6
4.2 查询Palo Alto Bundle2 10.2.2 ami-id
已知东京区域Palo Alto PAN-OS 10.0.11-h1 Bundle 2版本的ami-id是ami-05587f4db3c1c966b
,请查询10.2.2版本的ami-id信息。
直接输出这个ami-id的描述信息,获取关键词信息。
aws ec2 describe-images \
--region ap-northeast-1 \
--image-ids ami-05587f4db3c1c966b \
--query 'Images[*].[Description]' \
--output text
[Copied ami-0588942bc26617f1d from us-east-1] PA-VM-AWS-10.0.11-h1
输入关键词词PA-VM-AWS-10.2.2-h1
进行查找,这个结果非常清晰。
aws ec2 describe-images \
--region ap-northeast-1 \
--filters "Name=description,Values=*PA-VM-AWS-10.2.2-h1*" \
--query 'Images[*].[ImageId]' \
--output text
ami-0af0b709bb9eb7d08
五、参考文档
- [1] AWS CLI describe-images:https://awscli.amazonaws.com/v2/documentation/api/2.1.29/reference/ec2/describe-images.html
- [2] AWS CLI describe-instances --query:https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/describe-instances.html
- [3] Python Searches across all AWS AMI Images in all regions:https://github.com/hutchris/amisearch