よく使うOSの最新AMI IDを一撃で取得する

よく使うOSの最新AMI IDを一撃で取得する方法をご紹介します。AWS CLIのALIAS機能を利用して実現しています。
2020.02.29

AWS事業本部の森田です。

いざインスタンスを構築するときになって最新のAMI IDを調べるのですが、毎回コマンド履歴を探してきては実行ということを繰り返していたため、一撃で取得できるようにしました。

AMI IDは命名規則の変更などにより、うまく取得できなくなる可能性がありますので、その点ご注意していただければと思います。

設定

まずAWS CLIでaliasが使用できるようにしておく必要があります。下記の記事が参考になります。

aliasが使用できる状態になったら下記の設定を ~/.aws/cli/aliasファイルに追加します。コマンド名や必要なOSについてはカスタマイズしてお使いください。

設定は以上で完了です。個人的に必要なものだけ追加しています。その他のOSについては後述します。

設定の内容ですが見たままの通り普通のAWS CLIコマンドです。特に説明の必要はないかと思います。

~/.aws/cli/alias

amis =
  !f() {
  	# Amazon Linux, Windows
    aws ssm get-parameters --names \
      /aws/service/ami-amazon-linux-latest/amzn-ami-hvm-x86_64-gp2 \
      /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 \
      /aws/service/ami-windows-latest/Windows_Server-2019-Japanese-Full-Base \
      /aws/service/ami-windows-latest/Windows_Server-2016-Japanese-Full-Base \
      --query "Parameters[].[Value, LastModifiedDate, Name]" \
      --output text

	# CentOS7
    aws ec2 describe-images --owners aws-marketplace \
      --filters "Name=product-code,Values=aw0evgkw8e5c1q413zgy5pjce" \
      --query "reverse(sort_by(Images, &CreationDate))[0].[ImageId,CreationDate,Description]" \
      --output text

	# Ubuntu Server 20.04 LTS (x86_64)
    aws ec2 describe-images --owners 099720109477 \
      --filters "Name=name,Values=ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64*" \
      --query "reverse(sort_by(Images, &CreationDate))[0].[ImageId,CreationDate,Name]" \
      --output text

	# Ubuntu Server 18.04 LTS (x86_64)
    aws ec2 describe-images --owners 099720109477 \
      --filters "Name=name,Values=ubuntu/images/hvm-ssd/ubuntu-bionic-18.04-amd64*" \
      --query "reverse(sort_by(Images, &CreationDate))[0].[ImageId,CreationDate,Name]" \
      --output text
  }; f

実行してみる

下記で実行できます。執筆時点(2020/04/27更新)の結果です。

$ aws amis
ami-0318ecd6d05daa212   2020-04-09T10:18:12.528000+09:00        /aws/service/ami-amazon-linux-latest/amzn-ami-hvm-x86_64-gp2
ami-0f310fced6141e627   2020-04-09T10:18:13.473000+09:00        /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2
ami-01577fa45c2d60eaf   2020-04-18T08:10:51.947000+09:00        /aws/service/ami-windows-latest/Windows_Server-2016-Japanese-Full-Base
ami-092bd66a9b5bcf165   2020-04-18T08:18:34.066000+09:00        /aws/service/ami-windows-latest/Windows_Server-2019-Japanese-Full-Base
ami-0c1ac8728ef7f87a4   2020-04-23T11:35:12.000Z        ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-20200423
ami-0278fe6949f6b1a06   2020-04-09T16:44:23.000Z        ubuntu/images/hvm-ssd/ubuntu-bionic-18.04-amd64-server-20200408

その他のOSについて

最新のAMIが判別しにくいものがあったため、最新だけではなく一覧で出力されるようになっているものもあります。

Amazon Linux2 (arm64)

aws ssm get-parameters
  --names /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-arm64-gp2 \
  --query "Parameters[].[Value, LastModifiedDate, Name]" \
  --output text

Ubuntu Server 20.04 LTS (arm64)

aws ec2 describe-images --owners 099720109477 \
  --filters "Name=name,Values=ubuntu/images/hvm-ssd/ubuntu-focal-20.04-arm64*" \
  --query 'reverse(sort_by(Images, &CreationDate))[0].[ImageId,CreationDate,Name]' \
  --output text

Ubuntu Server 18.04 LTS (arm64)

aws ec2 describe-images --owners 099720109477 \
  --filters "Name=name,Values=ubuntu/images/hvm-ssd/ubuntu-bionic-18.04-arm64*" \
  --query 'reverse(sort_by(Images, &CreationDate))[0].[ImageId,CreationDate,Name]' \
  --output text

SUSE Linux Enterprise Server 15

x86_64

aws ec2 describe-images --owners amazon \
  --filters "Name=name,Values=suse-sles-15-sp?-v????????-hvm-ssd-x86_64" \
  --query "reverse(sort_by(Images, &CreationDate))[0].[ImageId,CreationDate,Name]" \
  --output text

arm64

aws ec2 describe-images --owners amazon \
  --filters "Name=name,Values=suse-sles-15-sp?-v????????-hvm-ssd-arm64" \
  --query "reverse(sort_by(Images, &CreationDate))[0].[ImageId,CreationDate,Name]" \
  --output text

Red Hat Enterprise Linux 8

こちらは一覧表示になっています。

x86_64

aws ec2 describe-images --owners 309956199498 \
  --filters "Name=name,Values=RHEL-8.*x86_64*" \
  --query "reverse(sort_by(Images, &CreationDate))[*].[ImageId,CreationDate,Name]" \
  --output text | sed '/BETA/d'

arm64

aws ec2 describe-images --owners 309956199498 \
  --filters "Name=name,Values=RHEL-8.*arm64*" \
  --query "reverse(sort_by(Images, &CreationDate))[*].[ImageId,CreationDate,Name]" \
  --output text | sed '/BETA/d'

コマンドが遅い場合

コマンドの最後に&を付けることで非同期実行させることができます。関数の最後にwaitを入れておくことで待つことができます。ただし、結果の出力順がランダムになります。

amis =
  !f() {
    # Amazon Linux, Windows
    aws ssm get-parameters --names \
      /aws/service/ami-amazon-linux-latest/amzn-ami-hvm-x86_64-gp2 \
      /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 \
      /aws/service/ami-windows-latest/Windows_Server-2019-Japanese-Full-Base \
      /aws/service/ami-windows-latest/Windows_Server-2016-Japanese-Full-Base \
      --query "Parameters[].[Value, LastModifiedDate, Name]" \
      --output text &

    # CentOS7
    aws ec2 describe-images --owners aws-marketplace \
      --filters "Name=product-code,Values=aw0evgkw8e5c1q413zgy5pjce" \
      --query "reverse(sort_by(Images, &CreationDate))[0].[ImageId,CreationDate,Description]" \
      --output text &

    # Ubuntu Server 20.04 LTS (x86_64)
    aws ec2 describe-images --owners 099720109477 \
      --filters "Name=name,Values=ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64*" \
      --query "reverse(sort_by(Images, &CreationDate))[0].[ImageId,CreationDate,Name]" \
      --output text
      
    # Ubuntu Server 18.04 LTS (x86_64)
    aws ec2 describe-images --owners 099720109477 \
      --filters "Name=name,Values=ubuntu/images/hvm-ssd/ubuntu-bionic-18.04-amd64*" \
      --query "reverse(sort_by(Images, &CreationDate))[0].[ImageId,CreationDate,Name]" \
      --output text &
    
    wait
  }; f

さいごに

今回はすべてのOSを一つのコマンドで取得していますが、OSごとに分けてもいいでしょう。使いやすいようにカスタマイズして使ってみてください。

どなたかのご参考になれば幸いです。