最新「じゃない」 AMI を AWS CLI で検索するまとめ

2019.02.19

ちなみに

最新の AMI ID を得る方法についてはこちらを参照ください。

パラメーターストアから最新のWindows AMIのIDを取得する

最新のECS-optimized AMI IDをParameter Storeから取得できるようになりました(Amazon Linuxもあるよ)

ここでは 訳あって古い AMI の ID を探しているんだけどマネジメントコンソールから探すの大変 というときに、AWS CLI を使って一覧取得・検索する方法をご紹介します。なるべく OS ベンダオフィシャルな AMI が検索されるようにしています。

なお、以下は東京リージョン ( ap-northeast-1 ) の結果となります。別のリージョンでお試しになる場合は --region オプションで指定するか、AWS_DEFAULT_REGION 環境変数に記載をしてください。

export AWS_DEFAULT_REGION=ap-northeast-1

具体的な検索方法

Windows の場合

ひとくちに Windows といっても、バージョンや言語、SQL サーバを含む・含まないといった違いで様々な種類があります。

ここでは Windows Server 2012 R2 (日本語) に限定して一覧してみます。

aws ec2 describe-images \
--owners amazon \
--filters \
"Name=name,Values=Windows_Server-2012-R2_RTM-Japanese-64Bit-Base*" \
--query 'reverse(sort_by(Images, &Name))[].[Name,ImageId,CreationDate]' \
--output table
----------------------------------------------------------------------------------------
| DescribeImages |
+------------------------------------------------------------+-------------------------+
| Windows_Server-2012-R2_RTM-Japanese-64Bit-Base-2019.02.13 | ami-01c4c164efd510022 |
| Windows_Server-2012-R2_RTM-Japanese-64Bit-Base-2019.02.09 | ami-01847ac7578ef1007 |
| Windows_Server-2012-R2_RTM-Japanese-64Bit-Base-2018.12.13 | ami-0fcaa969e6d634d90 |
| Windows_Server-2012-R2_RTM-Japanese-64Bit-Base-2018.11.29 | ami-025158ca2047e8a24 |
+------------------------------------------------------------+-------------------------+

--query にて reverse(sort_by()) しているので、新しい順に並んでいます1。いまであれば 2018年 11月末に公開された AMI までは入手できるようです。

コマンドラインを見てもらうとわかるとおもいますが、4行目の Values= で AMI 種別を示す文字列を指定してます。

ここに指定できる文字列にどんなものがあるかは、マネジメントコンソールや aws ec2 describe-images の結果を眺めてもらうのがいいと思いますが、例えば「Windows_Server」かつ「Japanese」を含むものというとこれだけあります。参考にしてみてください。

aws ec2 describe-images \
--owners amazon \
--filters \
"Name=name,Values=Windows_Server*Japanese*" \
--query 'Images[].[Name]' \
--output text | \
sed -e 's/\-[0-9.]*$//' | sort | uniq
Windows_Server-2008-R2_SP1-Japanese-64Bit-Base
Windows_Server-2008-R2_SP1-Japanese-64Bit-SQL_2008_R2_SP3_Express
Windows_Server-2008-R2_SP1-Japanese-64Bit-SQL_2008_R2_SP3_Standard
Windows_Server-2008-R2_SP1-Japanese-64Bit-SQL_2008_R2_SP3_Web
Windows_Server-2008-R2_SP1-Japanese-64Bit-SQL_2012_SP4_Express
Windows_Server-2008-R2_SP1-Japanese-64Bit-SQL_2012_SP4_Standard
Windows_Server-2012-R2_RTM-Japanese-64Bit-Base
Windows_Server-2012-R2_RTM-Japanese-64Bit-SQL_2014_SP2_Express
Windows_Server-2012-R2_RTM-Japanese-64Bit-SQL_2014_SP2_Standard
Windows_Server-2012-R2_RTM-Japanese-64Bit-SQL_2014_SP3_Express
Windows_Server-2012-R2_RTM-Japanese-64Bit-SQL_2014_SP3_Standard
Windows_Server-2012-R2_RTM-Japanese-64Bit-SQL_2016_SP1_Enterprise
Windows_Server-2012-R2_RTM-Japanese-64Bit-SQL_2016_SP1_Express
Windows_Server-2012-R2_RTM-Japanese-64Bit-SQL_2016_SP1_Standard
Windows_Server-2012-R2_RTM-Japanese-64Bit-SQL_2016_SP1_Web
Windows_Server-2012-R2_RTM-Japanese-64Bit-SQL_2016_SP2_Enterprise
Windows_Server-2012-R2_RTM-Japanese-64Bit-SQL_2016_SP2_Express
Windows_Server-2012-R2_RTM-Japanese-64Bit-SQL_2016_SP2_Standard
Windows_Server-2012-R2_RTM-Japanese-64Bit-SQL_2016_SP2_Web
Windows_Server-2012-RTM-Japanese-64Bit-Base
Windows_Server-2012-RTM-Japanese-64Bit-SQL_2008_R2_SP3_Express
Windows_Server-2012-RTM-Japanese-64Bit-SQL_2008_R2_SP3_Standard
Windows_Server-2012-RTM-Japanese-64Bit-SQL_2012_SP4_Express
Windows_Server-2012-RTM-Japanese-64Bit-SQL_2012_SP4_Standard
Windows_Server-2012-RTM-Japanese-64Bit-SQL_2012_SP4_Web
Windows_Server-2012-RTM-Japanese-64Bit-SQL_2014_SP2_Express
Windows_Server-2012-RTM-Japanese-64Bit-SQL_2014_SP2_Standard
Windows_Server-2012-RTM-Japanese-64Bit-SQL_2014_SP2_Web
Windows_Server-2012-RTM-Japanese-64Bit-SQL_2014_SP3_Express
Windows_Server-2012-RTM-Japanese-64Bit-SQL_2014_SP3_Standard
Windows_Server-2012-RTM-Japanese-64Bit-SQL_2014_SP3_Web
Windows_Server-2016-Japanese-Full-Base
Windows_Server-2016-Japanese-Full-SQL_2016_SP1_Enterprise
Windows_Server-2016-Japanese-Full-SQL_2016_SP1_Express
Windows_Server-2016-Japanese-Full-SQL_2016_SP1_Standard
Windows_Server-2016-Japanese-Full-SQL_2016_SP1_Web
Windows_Server-2016-Japanese-Full-SQL_2016_SP2_Enterprise
Windows_Server-2016-Japanese-Full-SQL_2016_SP2_Express
Windows_Server-2016-Japanese-Full-SQL_2016_SP2_Standard
Windows_Server-2016-Japanese-Full-SQL_2016_SP2_Web
Windows_Server-2019-Japanese-Full-Base

Amazon Linux の場合

( 2 では無いほうの)Amazon Linux の AMI を検索する場合は、仮想化タイプ( HVM )とルートデバイスタイプ( gp2 )をフィルタに含めて検索すると分かりやすいかなと思います。

例えば下記のような感じです。

aws ec2 describe-images \
--owners amazon \
--filters \
"Name=name,Values=amzn-ami-hvm*x86_64-gp2" \
--query 'reverse(sort_by(Images, &CreationDate))[].[Name,ImageId]' \
--output table
-------------------------------------------------------------------------------------
| DescribeImages |
+---------------------------------------------------------+-------------------------+
| amzn-ami-hvm-2018.03.0.20181129-x86_64-gp2 | ami-00a5245b4816c38e6 |
| amzn-ami-hvm-2018.03.0.20181116-x86_64-gp2 | ami-063fa8762cdc9a5a6 |
:
| amzn-ami-hvm-2014.09.0.x86_64-gp2 | ami-45072844 |
| amzn-ami-hvm-2014.03.2.x86_64-gp2 | ami-df470ede |
+---------------------------------------------------------+-------------------------+

2014年まで遡ることができますね! Windows と違い古いものから削除される、というわけではなさそうです。

ちなみに、仮想化タイプ PV、デバイスタイプ EBS を指定して検索すると、 2012年まで遡ることができました。

aws ec2 describe-images \
--owners amazon \
--filters \
"Name=name,Values=amzn-ami-pv*x86_64-ebs" \
--query 'reverse(sort_by(Images, &CreationDate))[].[Name,ImageId]' \
--output table
------------------------------------------------------------------------------------
| DescribeImages |
+--------------------------------------------------------+-------------------------+
| amzn-ami-pv-2018.03.0.20181129-x86_64-ebs | ami-078d6da9eeeeb9c1c |
| amzn-ami-pv-2018.03.0.20181116-x86_64-ebs | ami-0b4de5a0bd1946dc7 |
:
| amzn-ami-pv-2012.03.2.x86_64-ebs | ami-903d8e91 |
| amzn-ami-pv-2012.03.1.x86_64-ebs | ami-e47acbe5 |
+--------------------------------------------------------+-------------------------+

Amazon Linux 2 (AL2) の場合

プレフィクスが amzn に代わり amzn2 になります。あとは Amazon Linux (AL1) と同じでいいでしょう。AL1 のときよりいろいろとシンプルになっているので AMI の総量も少ないです。

aws ec2 describe-images \
--owners amazon \
--filters \
"Name=name,Values=amzn2-ami-hvm*x86_64-gp2" \
--query 'reverse(sort_by(Images, &CreationDate))[].[Name,ImageId]' \
--output table
----------------------------------------------------------------------------
| DescribeImages |
+------------------------------------------------+-------------------------+
| amzn2-ami-hvm-2.0.20190115-x86_64-gp2 | ami-0d7ed3ddb85b521a6 |
| amzn2-ami-hvm-2.0.20190110-x86_64-gp2 | ami-0bab560bf1ee352f5 |
| amzn2-ami-hvm-2.0.20181114-x86_64-gp2 | ami-0a2de1c3b415889d2 |
| amzn2-ami-hvm-2.0.20181024-x86_64-gp2 | ami-00f9d04b3b3092052 |
| amzn2-ami-hvm-2.0.20181008-x86_64-gp2 | ami-04d3eb2e1993f679b |
| amzn2-ami-hvm-2.0.20180924-x86_64-gp2 | ami-06962fe7164c1fe7b |
| amzn2-ami-hvm-2.0.20180810-x86_64-gp2 | ami-08847abae18baa040 |
| amzn2-ami-hvm-2.0.20180622.1-x86_64-gp2 | ami-e99f4896 |
| amzn2-ami-hvm-2017.12.0.20180509-x86_64-gp2 | ami-2724cf58 |
| amzn2-ami-hvm-2017.12.0.20180328.1-x86_64-gp2 | ami-8fbab2f3 |
| amzn2-ami-hvm-2017.12.0.20180115-x86_64-gp2 | ami-c2680fa4 |
| amzn2-ami-hvm-2017.12.0.20180109-x86_64-gp2 | ami-6be57d0d |
| amzn2-ami-hvm-2017.12.0.20171212.2-x86_64-gp2 | ami-2a34b64c |
+------------------------------------------------+-------------------------+

途中で命名規則が変わっているのは、 RC から LTS に変わったからですかね。

[速報]5年長期サポートのAmazon Linux 2が一般公開されました

Ubuntu Server

Ubuntu Linux も非常に種類がおおいので、バージョンまで含めて検索した方がいいと思いました。AMI のオーナーは Canonical 社( OwnerId : 099720109477 )を指定します。

例えば この春( '19/04 )に EOL が来る 14.04 (Trusty) の AMI を調べる場合は、下記のような指定がお勧めです。

aws ec2 describe-images \
--owners 099720109477 \
--filters \
"Name=name,Values=ubuntu/images/hvm-ssd*-14.04-*" \
--query 'reverse(sort_by(Images, &CreationDate))[].[Name,ImageId]' \
--output table
------------------------------------------------------------------------------------------------
| DescribeImages |
+--------------------------------------------------------------------+-------------------------+
| ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-20190122.1 | ami-09a19edcb709d7a77 |
| ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-20190110 | ami-0864ee74b4ea9d002 |
:
| ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-20140724 | ami-0589d404 |
| ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-20140607.1 | ami-a1124fa0 |
+--------------------------------------------------------------------+-------------------------+

ちなみに、 10.04 (Lucid) まで残っていることが確認できました。

:
| ubuntu/images/ebs/ubuntu-lucid-10.04-amd64-server-20120110 | ami-36e65037 |
| ubuntu/images/ebs/ubuntu-lucid-10.04-i386-server-20120110 | ami-1ae6501b |
+--------------------------------------------------------------------+---------------+

Red Hat Enterprise Linux

RHEL の場合は Red Hat 社( OwnerId : 309956199498 )がオーナーのものを検索します。フィルタは無しでも今のところそこまで数が多くないようですが、ノイズよけに行頭 RHEL- で始まり GP2 で終わるるものと指定しておきましょう。

aws ec2 describe-images \
--owners 309956199498 \
--filters \
"Name=name,Values=RHEL-*GP2" \
--query 'reverse(sort_by(Images, &CreationDate))[].[Name,ImageId]' \
--output table
-------------------------------------------------------------------------------
| DescribeImages |
+---------------------------------------------------+-------------------------+
| RHEL-8.0_HVM_BETA-20181113-x86_64-1-Hourly2-GP2 | ami-0d938ac9c11076133 |
| RHEL-7.6_HVM_GA-20181017-x86_64-0-Hourly2-GP2 | ami-08419d23bf91152e4 |
:
| RHEL-5.11_Beta-i386-3-Hourly2-GP2 | ami-8bc79f8a |
| RHEL-5.11_Beta-x86_64-3-Hourly2-GP2 | ami-29c59d28 |
+---------------------------------------------------+-------------------------+

ちなみに、これはどの OS でも同じですが「AMI の有無とサポートの有無は無関係」であることにご注意ください。基本的には余所で使うときと同じ EOL が適用されます。

その他の OS を検索する場合(SUSE、 Deep Learning ...)

このような感じで、下記の情報で結果を絞っていくのがよいと思います。

  • オーナー( OwnerId or ImageOwnerAlias
  • 名前( Name )に含まれるキーワード
  • (場合によって)アーキテクチャや仮想化タイプ、ENAサポートなど

具体的には、探したい OS の最新の AMI ID をパラメータストアや EC2 マネジメントコンソールの「インスタンスの作成」から表示される「手順 1: Amazon マシンイメージ」等から取得し、

その AMI ID を元に describe-images して情報を集めるのがよいと思います。

そうして見つけたキーワードを、--filters の後ろに「Name=<キー>,Values=<パターン>」の形式で指定します。Nameに指定するのは describe-images で見つけたキーになりますが、出力された JSON そのままではないので注意が必要です。

下記ドキュメントの「--filters」のところをみて、どのキーを指定すれば良いか確認して下さい。

おまけ : CentOS

CentOS は AWS オフィシャルの AMI ではなくコミュニティ AMI になるため、オーナーはマーケットプレースになります。ただそれだけだと膨大な数がリストアップされてしまうので、適切に filter しましょう。

aws ec2 describe-images \
--owners aws-marketplace \
--filters \
"Name=name,Values=CentOS Linux*HVM EBS*" \
--query 'reverse(sort_by(Images, &CreationDate))[].[Name,ImageId]' \
--output table
-------------------------------------------------------------------------------------------------------------------------------------
| DescribeImages |
+----------------------------------------------------------------------------------------------------------+------------------------+
| CentOS Linux 7 x86_64 HVM EBS ENA 1901_01-b7ee8a69-ee97-4a49-9e68-afaee216db2e-ami-05713873c6794f575.4 | ami-045f38c93733dd48d |
| CentOS Linux 6 x86_64 HVM EBS ENA 1901_01-74e73035-3435-48d6-88e0-89cc02ad83ee-ami-079f4a7926b6b99ab.4 | ami-02eb8e0986956e8d6 |
:
| CentOS Linux 6 x86_64 HVM EBS 1704_01-74e73035-3435-48d6-88e0-89cc02ad83ee-ami-23285c35.4 | ami-d4d0e2b3 |
| CentOS Linux 6 x86_64 HVM EBS 1602-74e73035-3435-48d6-88e0-89cc02ad83ee-ami-21e6d54b.3 | ami-fa3d3f94 |
+----------------------------------------------------------------------------------------------------------+------------------------+

なおパラメータを調べる際の最新の AMI ID はマネジメントコンソールでは分かりづらいのですが、公式 Wiki に情報がありますのでこちらを参照して下さい。

まとめ

運用をやっていると常に最新の AMI だけ使えていればいいわけではなく、検証や試験目的で昔の AMI が欲しくなります。そんなときにお役に立てれば幸いです。

脚注


  1. こういう用途の場合、AMI の CreationDate を使いたくなるところなのですが、例えば ami-025158ca2047e8a24 のno CreationDate2019-02-09T04:43:32.000Z だったりしてちゃんと並ぶのかどうか微妙だったので、名前でソートしています。Linuxの場合はそこまで名前と差異がなかったので使っています。