logo头像
Snippet 博客主题

AWS 如何查找EC2实例特定版本的AMI ID

B站视频链接:https://www.bilibili.com/video/BV1884y1q7qM/
微信公众号:自刘地
自刘地

一、背景

在我的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,分别是:

  1. 快速启动(Quickstart AMIs)
  2. 我的AMI(My AMIs)
  3. 亚马逊云科技Marketplace(AWS Marketplace AMIs)
  4. 社区AMI(Community AMIs)。

目前AWS 中国区和AWS Global区域启动EC2的界面所有区别。对于第一、二和四种类型,在控制台界面可以直接看到ami-id信息。但是对于第三种在Marketplace上的实例,两种控制台界面获取ami-id的方法有所区别。

快速启动(QUickstart AMIs)界面获取ami-id信息image-20221023162305407

我的AMI(My AMIs)界面获取ami-id信息。image-20221023162342186

社区AMI(Community AMIs)界面获取ami-id信息。image-20221023162424372

对于AWS Global区域查看AWS Marketplace AMIs,在选择镜像后,准备启动时就可以看到ami-id信息,并不需要真的启动EC2就能获取ami-id信息。image-20221023161702882

对于AWS 中国区域查看AWS Marketplace AMIs,需要启动EC2之后,选中对应实例,才能看到对应的ami-id信息。image-20221023163440007

三、查询历史版本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上操作。

1
2
3
aws ec2 describe-images \
--region ap-northeast-1 \
--image-ids ami-0f2b0162d497c9988

AWS Gloabl区域提供CloudShell服务,进入之后可以直接配置AWS CLI,拥有和图形化界面用户相同的权限。image-20221023165409193

输出结果主要关注Description字段,里面的信息可以作为下一次过滤的字段,例如里面有FortiGate、AWSONDEMAND、7.0.7等关键词。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
[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"
}
]
}

有了上面三个关键词之后,只需要替换版本信息,就可以进行精确的过滤查找了。

1
2
3
4
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信息,还有系统架构信息。

1
2
3
4
5
6
7
8
9
10
11
[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信息,会输出非常简洁的结果。

1
2
3
4
5
6
7
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字段里面可以提取的关键词。

1
2
3
aws ec2 describe-images \
--region ap-northeast-1 \
--image-ids ami-058c3870fc61fdc32

输出结果摘要如下,可以看到关键词是asav9-18-1

1
2
3
...
"Description": "[Copied ami-00ce522a548e6bc01 from us-east-1] asav9-18-1-ENA",
...

进一步查询asav9-14-4版本的信息:

1
2
3
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类型的授权。

1
2
3
4
5
6
7
8
9
10
[
{
"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确认一下。

1
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的描述信息,获取关键词信息。

1
2
3
4
5
6
7
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进行查找,这个结果非常清晰。

1
2
3
4
5
6
7
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

五、参考文档