EC2を複数起動、停止させるGem「multi_ec2_kiq」を作りました

2015.04.06

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

複数のEC2を起動し、停止させるGemを作りました。恐らくは同じ様な機能を持つGemや、または別の仕組みもあるとは思いますが、作りたいものを作ったという感じです。

RubyGems.org
Github

multi_ec2_kiqの概要

先にも書いたように、複数のEC2を起動させる機能を持ちます。対象とするEC2はymlにて定義することが可能です。EC2を起動時、起動したEC2のインスタンスIDと(起動したという)ステータスをDynamoDB上のテーブルに保持します。EC2を停止させたい時はDynamoDB上のステータスを変更することで、本GemがEC2を停止させます。

図にすると、下の様になります。 スクリーンショット 2015-04-05 15.09.47

想定する使用例

バッチ処理などで複数のEC2を起動し、各EC2内での処理終了後にDynamoDBのステータスを変える → multi_ec2_kiqがEC2を停止する、というような用途を想定しています。

使用方法

事前準備

~/.aws/credentialsファイルに、AWSへの接続情報を定義しておく必要があります。

インストール

Gemfileにmulti_ec2_kiqを指定してbundle installすることで、インストールされます。

Gemfile
gem 'multi_ec2_kiq'

ymlファイル

先にも書きましたが、ymlファイルに起動したいEC2などの定義を記述します。ymlのファイル名、配置パスは指定できるので、好きな名前にして構いません。インストール時には「lib/settings.yml」にサンプルが入っているので、これを参考にして記述してください。

lib/settings.yml
aws:
  profile: your_aws_credencial_profile #~/.aws/credentialsのプロファイル名
  dynamodb:
    region: your_dynamodb_region #DynamoDBのリージョン
    status_table_name: your_ec2_statuses_table_mmae #DynamoDBにてEC2のステータスを保持するテーブルの名称
wait_to_stop: #EC2を起動後、停止を実行するまで待機するポーリング処理
  max_attempts: 10 #ポーリング回数
  delay: 10 #ポーリング間隔(秒)
instances:
  - id: your_ec2_instance_id_1 #起動対象のEC2インスタンスID(先頭に-をつけること)
    region: your_ec2_instance_id_1_region #起動対象のEC2インスタンスのリージョン
  - id: your_ec2_instance_id_2
    region: your_ec2_instance_id_2_region

テーブルの作成

※この手順は、EC2を起動するのみの(停止はしない)場合は不要です。

EC2のステータスを保持するテーブルを、DynamoDB上に作成する必要があります。テーブル名は上記のymlに定義した名称となります。テーブルを作成するには、multi_ec2_kiqが用意している「create_status_table」メソッドをirbやRails Consoleなどから呼び出してください。

require "multi_ec2_kiq"

include MultiEc2Kiq

MultiEc2Kiq.config_path = File.expand_path("ymlのパス", __FILE__)
MultiEc2Kiq.create_status_table

実行すると、以下の様な定義でテーブルが作成されます。

カラム名
instance_id 文字列 起動したEC2のインスタンスID
status 文字列 起動したEC2のステータス("started":起動完了,"stopped":停止完了,"to_stop":停止実行)

EC2の起動(停止なし)

EC2を起動するのみで停止しない場合は、multi_ec2_kiqが用意している「start」メソッドを呼び出します。

require "multi_ec2_kiq"

include MultiEc2Kiq

MultiEc2Kiq.config_path = File.expand_path("ymlのパス", __FILE__)
MultiEc2Kiq.start

EC2の起動〜停止

EC2を起動して停止させるためには、multi_ec2_kiqが用意している「start_wait_until_stop」メソッドを呼び出します。

require "multi_ec2_kiq"

include MultiEc2Kiq

MultiEc2Kiq.config_path = File.expand_path("ymlのパス", __FILE__)
MultiEc2Kiq.start_wait_until_stop

起動するとDynamoDBのテーブルは以下の様なレコードが作成されます(2つEC2を起動した場合)。

instance_id | status
i-000aa01   | started
i-000aa02   | started

EC2を停止させたい場合は、DynamoDBのレコードを以下のように変更します(i-000aa01を停止させる場合)。

instance_id | status
i-000aa01   | to_stop
i-000aa02   | started

statusが"to_stop"のレコードが出来た場合、multi_ec2_kiqは対象のEc2を停止します。停止後はDynamoDBのレコードを更新し、以下のようになります。

instance_id | status
i-000aa01   | stopped
i-000aa02   | started

まとめ

multi_ec2_kiqは実案件で使っている訳ではないので不便な点や不具合等もあるかもしれません。その場合、もしくは似た様なことを行いたい場合は、ソースは公開しているので参考にしてみてください。何かの時の一助になれば幸いです。