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

ちなみに

最新の 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の場合はそこまで名前と差異がなかったので使っています。