5秒でAmazon Linuxを起動して1日で殺すRubyスクリプトを書いた

2014.11.08

こんにちは。望月です。
以前、CLIから簡単にAmazon Linuxを起動するための方法を紹介した、以下のようなブログを書きました。

少し思うところがあり、そのスクリプトを改造しました。小ネタです。

問題点

コマンド一発で最新のAmazon Linuxが起動するので自分自身大変重宝しているのですが、一つ問題がありました。それは「あまりに簡単に起動できるので消し忘れる」という点です。消し忘れると当然EC2の課金が発生するのでお財布にダメージがあります。

もともとこのスクリプトを書いたのは「検証したいことが合った時に、さっと確かめるための方法がほしい」という要望が発端でした。そのため、あまり長期間運用することを想定していませんでした。であれば、一定期間経ったら勝手にStopしてくれれば都合が良さそうです。というわけでその要望を満たすために少し改造しました。

実装

コードはGistに置いておきました。使い方は前回からほとんど変わっていないので、動作方法については冒頭のブログを参照して下さい。変更点は2点です。

18行目から24行目の部分で、EC2インスタンス起動時に実行されるuserdataを記述しています。atコマンドを利用して一定時間後にshutdown -h nowを実行するようにしています。デフォルトでは起動時から24時間後、つまり1日後にshutdownコマンドが走ります。stop_afterの値を書き換えれば停止までの時間は自由に調整できます。

stop_after = 60 * 24
 
userdata =<<EOF
#!/bin/sh
# stop after a day
echo "shutdown -h now" | at now + #{stop_after}minutes
EOF
[/ruby]
<p>35行目〜41行目の、実際にEC2を起動する部分でuserdataを渡すのとともに、<tt> instance_initiated_shutdown_behavior</tt>をTerminateに変更しています。これにより、OS上のshutdownコマンドによって自動的にEC2がTerminateされることになります。</p>

resp = ec2.instances.create(image_id: image_id,
                     security_group_ids: [secgroup_id],
                     key_pair: ec2.key_pairs[keypair_name],
                     user_data: userdata,
                     instance_initiated_shutdown_behavior: "terminate",
                     instance_type: "t2.micro",
                     associate_public_ip_address: true)

このスクリプトを利用すると、自動的に1日でTerminateされるので消し忘れでの課金を最小限に抑止することが出来ます。
起動後に気が変わってTerminateされたくなくなったら、SSHでログインした後にsudo at -l 1コマンドを実行すればshutdownコマンドの予定を削除することができます。消し忘れで痛い目を見たことがある(私のような)方はぜひご利用下さい。