【小ネタ】AWS SDK for RubyでCloudFormationの最新AMI Mappingを作るスクリプトを書いてみた
はじめに
こんにちは植木和樹@上越妙高オフィスです。
社内で利用しているOTRSサービス環境はCloudFormation + Chef + Ansibleで構築されています。昨年2014年の夏頃に構築した環境ですが、OTRSのバージョンアップや最新AMIへのアップデートのため今回再構築することにしました。Immutable Infrastructureに従ってVPCごと丸っと置き換え、Route53のDNSレコード変更で切り替えたいと思います。
さて、いざCloudFormationのテンプレートをみてみるとAMIの指定を行うマッピングに記載されたImage IDが古いことに気づきました。今回利用するのはTokyoリージョンだけですし、Amazon Linuxも2015.09を利用するのでハードコーディングしてもいいのですが・・・せっかくなのでAMIマッピングを出力するスクリプトをRubyで書いてみました。
CloudFormationのマッピングって何?という方は下記ブログをご参照ください。
コードと実行結果
コードはいつも通りgistで公開しています。
抽出条件
- Amazon LinuxのAMIのみが対象です
- 仮想化タイプはHVMのみ
- アーキテクチャはx86_64のみ
- minimal や NAT用 イメージは対象外にしています
ご希望に応じてfilter部分を適当に修正してお使いください。
実行方法
AWS SDK for Rubyの version 2を使っているので、Bundlerで実行環境限定でgemを入れています。(普段は使い慣れたv1を利用しているためです)
Gemfileを作成したらbundle install → bundle exec で実行します。
Gemfile
# A sample Gemfile source "https://rubygems.org" gem 'aws-sdk', '~> 2'
実行方法
$ bundle install --path bundler $ bundle exec ./describe-amazon-linux-images.rb | jq "."
実行結果
{ "AWSAmazonLinuxAMI": { "eu-west-1": { "201403": "ami-dd925baa", "201409": "ami-8723aef0", "201503": "ami-e4d18e93", "201509": "ami-bff32ccc" }, "ap-southeast-1": { "201403": "ami-82d78bd0", "201409": "ami-94bb90c6", "201503": "ami-d44b4286", "201509": "ami-c9b572aa" }, "ap-southeast-2": { "201403": "ami-91d9bcab", "201409": "ami-d70773ed", "201503": "ami-db7b39e1", "201509": "ami-48d38c2b" }, "eu-central-1": { "201403": "ami-224c7a3f", "201409": "ami-0a003317", "201503": "ami-a6b0b7bb", "201509": "ami-bc5b48d0" }, "ap-northeast-1": { "201403": "ami-df470ede", "201409": "ami-1e86981f", "201503": "ami-1c1b9f1c", "201509": "ami-383c1956" }, "us-east-1": { "201403": "ami-aaf408c2", "201409": "ami-ee6e2a86", "201503": "ami-0d4cfd66", "201509": "ami-60b6c60a" }, "sa-east-1": { "201403": "ami-09cf6014", "201409": "ami-a59925b8", "201503": "ami-55098148", "201509": "ami-6817af04" }, "us-west-1": { "201403": "ami-e48b8ca1", "201409": "ami-5a90891f", "201503": "ami-87ea13c3", "201509": "ami-d5ea86b5" }, "us-west-2": { "201403": "ami-8f6815bf", "201409": "ami-c1c39af1", "201503": "ami-d5c5d1e5", "201509": "ami-f0091d91" } } }
できあがったJSONをCloudFormationテンプレートに貼り付けて、インデント等を適当に整形してください。
AWS SDK for Ruby version1用スクリプト
先にv1用を作ったのですが、今後はv2が主流になるということで勉強がてらv2で作りなおしたのが今回のスクリプトです。 せっかくなのでv1用スクリプトもgistに貼っておきます。v1とv2の書き方の違いをご堪能ください。
まとめ
同じAmazon Linuxバージョン(2015.09)でもマイナーバージョン毎にImage IDが異なるため、最新のバージョンが出力されるようゴニョゴニョしてます。あとバージョンごとにちゃんとソートされた状態で表示したかったのでHash → Array → Hashという妙な変換処理をかけています。
主に社内の特定の人向け便利スクリプトですが、お役にたてば幸いです。