【小ネタ】AWS SDK for RubyでCloudFormationの最新AMI Mappingを作るスクリプトを書いてみた

2015.11.11

はじめに

こんにちは植木和樹@上越妙高オフィスです。

社内で利用している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という妙な変換処理をかけています。

主に社内の特定の人向け便利スクリプトですが、お役にたてば幸いです。