Cloud Automation as Codeを実現するツール「Catlass」を作りました

記事タイトルとURLをコピーする

こんばんは。てるい@氷点下の札幌です。

この記事は、Cloud Automator Advent Calendar 2017の12日目の記事です。

Cloud Automatorは使いやすいが、使いづらい

突然ですが、Cloud Automatorのジョブをアカウントを跨いでコピーしたり、ジョブをテンプレートから一括で定義したかったり、ジョブのバージョン管理をしたくなることはありませんか?私はあります。

Cloud Automatorは分かりやすい機能設計とユーザフレンドリーなナビゲーションUIで非常に簡単に使い始めることができます。それはとても素晴らしいことではあるのですが、AWSなんかでもよくあるように複数アカウントで大量のリソースを扱いたいと思った時にはGUIだけでは管理が難しくなってきます。

我々はどうしてきたのか

例えばAWSだと、私たちはCloudFormationやterraform、またはAPIを駆使したcodenize.toolsのようなツールによって定義をコード化し、管理を自動化してきました。

では、Cloud Automatorはどうでしょうか?Cloud AutomatorもAPIが公開されています。ということは、コード化できるということです。

ということで

作りました。

名前に特に深い意味はありません。「CA」という文字を入れたかったので「カ」とか「キャ」から始まるカッコイイ単語でカトラス(Cutlass)というのが浮かんだので、それをもじった感じです。なので、「カトラス」とか「キャトラス」とか読んでもらえれば(ちなみにこれを聞いて「ソード・カトラス」が浮かんだ人とは仲良くなれそうな気がしますが、ここは会社のブログなのでこれ以上は自重しておきます)

使い方など

細かい使い方はREADMEを読んでもらうとして、ざっくり流れや特徴を説明していきたいと思います。

インストール&設定

Gemなのでこれだけです(要Ruby環境)

$ gem install catlass

そして、Cloud AutomatorのAPIキーを発行して CA_API_KEY という環境変数にセットします。

$ export CA_API_KEY=$YOUR_API_EKY

現在の定義を書き出す

以下のコマンドで CAfile というファイルに現在の定義が書き出されます。

$ catlass export --write

定義を反映する

手元で CAfile に追加/変更/削除した定義をCloud Automatorに反映するのは以下のコマンドになります。なお、恒例?の --dry-run オプションをつけると反映せずに手元とCloud Automator側との差分だけ見られます。

$ catlass apply

設定ファイル例

こんな感じです。特徴としては、Cloud Automatorの内部的なIDを意識せずに使えるように ジョブ名でマッチングする仕様 になっています。つまり、ジョブ名は一意であることが求められ、ジョブ名を変えると別の定義として扱われることに注意が必要です。また、Rubyの内部DSLとなっているため、冗長な記述をループやメソッドで簡略化したり、 aws-sdkAws::EC2::Client.describe_instaces などを実行した結果を利用することでCA単体ではできないタグ以外の要素でフィルタリングした結果を使って定義を組み立てたりもできます。

#! /usr/bin/env ruby

Job "Auto Stop" do
  type "trigger_jobs"
  attributes do
    aws_account_id 999
    rule_type "cron"
    rule_value do
      hour "19"
      minutes "0"
      time_zone "Tokyo"
      schedule_type "weekly"
      weekly_schedule "", "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"
      national_holiday_schedule "false"
    end
    action_type "stop_instances"
    action_value do
      region "ap-northeast-1"
      tag_key "auto-stop"
      tag_value "on"
      trace_status "false"
      specify_instance "tag"
    end
    active false
  end

end

最後に

Cloud Automatorのジョブが増えてきて管理にお困りの方、ジョブのコピーや一括定義をやりたい方は是非試してみてください。ただし、まだβクオリティで私の個人プロジェクトなので、いずれ会社としての管理に移行できればと思っていますが、ご利用は自己責任でお願い致します。