読者です 読者をやめる 読者になる 読者になる

双六工場日誌

平凡な日常を淡々と綴ります。

AWS CLIで最新のAmazon LinuxのAMI IDを取得する

アニメを消化しつつ、コマンドラインから最新のAMI IDを取得を試して、Amazon Linuxの分はできたのでメモ。

ID取得からインスタンスの作成まで一発でやってしまおうと思ったけど、describe-imagesはAPIのレスポンスが遅かったので、とりあえず、一覧だけ出力するところまで作成。APIのレスポンスが遅いのは、キャッシュファイルを入れて緩和。

最後に載せているスクリプトは、キャッシュファイル対応のために長くなっていますが、本質的なポイントは以下の2つ。

自分とamazonがオーナーになっているAMIのうち、以下に該当するものを取得

  • 仮想化方式 → HVM(完全仮想化)
  • 起動ディスク → EBS
  • アーキテクチャ → x86-64
  • ボリュームタイプ → 磁気ディスク(standard)
aws ec2 describe-images \
    --owners self amazon \
    --filters \
      Name=virtualization-type,Values=hvm \
      Name=root-device-type,Values=ebs \
      Name=architecture,Values=x86_64 \
      Name=block-device-mapping.volume-type,Values=standard

取得したJSONをjqで以下のように整形

  • Imageのリストを名前順にソート
  • Platformが"windows"となっているものを除外(Platformは値が"windows"のみしかない属性)
  • NameとImageId(AMI ID)を文字列結合して出力
jq -r '.Images | sort_by(.Name)| .[] | select(.Platform != "windows") | .Name + ": " + .ImageId'

これらをまとめて一つのスクリプトにしたのが以下。ほかの条件でAMI IDを取得したい場合は、最後に参考文献に載せたドキュメントを見つつ改変してください。

  • get-aws-ec2-image.sh
#!/bin/bash
set -ue

prefix=`basename $0`
timestamp_file=/tmp/$prefix.timestamp
cache_file=/tmp/$prefix.cache
timestamp=`date '+%s'`
cache_time=300

describe_images(){
    echo $timestamp > $timestamp_file
    aws ec2 describe-images \
        --owners self amazon \
        --filters \
          Name=virtualization-type,Values=hvm \
          Name=root-device-type,Values=ebs \
          Name=architecture,Values=x86_64 \
          Name=block-device-mapping.volume-type,Values=standard
}

# 出力を括弧でまとめる
(
if [ -e $timestamp_file ];then
    cache_timestamp=`cat $timestamp_file`
----
    # キャッシュファイルが有効期間を過ぎている場合はAWSから読み出してキャッシュファイルにも書く
    if [ $timestamp -gt `expr $cache_timestamp + $cache_time` ];then
        describe_images | tee $cache_file
    else
    # キャッシュファイルが有効期間内の場合はキャッシュファイルを読み出すだけ
        cat $cache_file
    fi
# キャッシュファイルがない場合
else
    describe_images | tee $cache_file
fi
) | jq -r '.Images | sort_by(.Name)| .[] | select(.Platform != "windows") | .Name + ": " + .ImageId'
  • 実行例
    • Amazon LinuxはAMIイメージに名前に一定の規則で日付とリリース番号が入っており、名前でソートすると一番下のAMIが最新のAMIとなる。
    • 関係ないものも取得されてしまうので、"amzn-ami-hvm"でフィルタ
$ bash get-aws-ec2-images.sh | grep amzn-ami-hvm
amzn-ami-hvm-2012.09.0.x86_64-ebs: ami-426cd343
amzn-ami-hvm-2012.09.1.x86_64-ebs: ami-fd7ef9fc
amzn-ami-hvm-2013.03.0.x86_64-ebs: ami-833ebe82
amzn-ami-hvm-2013.03.1.x86_64-ebs: ami-2db33c2c
amzn-ami-hvm-2013.09.0.x86_64-ebs: ami-0961fe08
amzn-ami-hvm-2013.09.1.x86_64-ebs: ami-1b1a7e1a
amzn-ami-hvm-2013.09.2.x86_64-ebs: ami-eb0c6fea
amzn-ami-hvm-2014.03.0.x86_64-ebs: ami-ebbfc2ea
amzn-ami-hvm-2014.03.1.x86_64-ebs: ami-bb562fba
amzn-ami-hvm-2014.03.2.x86_64-ebs: ami-29dc9228
amzn-ami-hvm-2014.09.0.x86_64-ebs: ami-35072834

参考リンク

[Amazon EBS ボリュームのみ] gp2(General Purpose (SSD) ボリューム)、standard(マグネティック ボリューム)、または io1(Provisioned IOPS (SSD) ボリューム)のいずれかのボリュームタイプ。デフォルト値は standard(マグネティック ボリューム)

今日はこんなところで。Gのレコンギスタを観たら寝ます。


追記

Ubuntuのイメージ一覧を取りたいこともあるのでメモを追記。Ubuntuの公式イメージを取る場合は、ownerに"099720109477"を指定してください。ソースは以下のURL。

cloud - How do I know what Ubuntu AMI to launch on EC2? - Ask Ubuntu

Verify the Owner is 099720109477!

Any user can register an AMI under any name. Nothing prevents a malicious user from registering an AMI that would match the search above. So, in order to be safe, you need to verify that the owner of the ami is '099720109477'.

GUIから選択する場合は以下から。

Ubuntu Amazon EC2 AMI Finder

Ubuntuの一覧も出力するスクリプトはGistに載せました。

Amazon公式、Canonical公式と自分のAMIの一覧を出力するスクリプト(出力を300秒キャッシュ)