よく使うOSの最新AMI IDを一撃で取得する
AWS事業本部の森田です。
いざインスタンスを構築するときになって最新のAMI IDを調べるのですが、毎回コマンド履歴を探してきては実行ということを繰り返していたため、一撃で取得できるようにしました。
AMI IDは命名規則の変更などにより、うまく取得できなくなる可能性がありますので、その点ご注意していただければと思います。
設定
まずAWS CLIでaliasが使用できるようにしておく必要があります。下記の記事が参考になります。
aliasが使用できる状態になったら下記の設定を ~/.aws/cli/alias
ファイルに追加します。コマンド名や必要なOSについてはカスタマイズしてお使いください。
設定は以上で完了です。個人的に必要なものだけ追加しています。その他のOSについては後述します。
設定の内容ですが見たままの通り普通のAWS CLIコマンドです。特に説明の必要はないかと思います。
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ごとに分けてもいいでしょう。使いやすいようにカスタマイズして使ってみてください。
どなたかのご参考になれば幸いです。