​ ​
ダウンロード.png

ブラウザのキャプチャ画像をアップロードする定期バッチをec2で!

AWSばっかりいじってるYTです。

業務上、定期的に実行したい処理とかありませんか?ありますよね?

スカイアークでも「1時間毎にとあるWEBページをキャプチャして、そのキャプチャから一部分を切り出してpng形式にして特定サーバにアップロードする」というタスクがあったりします。
これまで札幌オフィス内でMacMiniを常時稼働させてその処理をさせていたのですが、
スカイアークは社内サーバ禁止!のルールがあるのでec2に移行してみました。

IMG_1927.JPG
ありがとうMacMini。今までよく頑張ってくれた。

参考にしたサイト

  • 基本的な考え方はコチラから。よくまとまっていて大変助かります。
  • suz-lab 様。僕のやりたい事は大体書かれていて非常に非常に参考になりました。

準備

createinstance.png

適当にインスタンスを起動します。
今回はCommunityAMIの、64bitCentOS6としては老舗である、RightScaleさんのRightImage_CentOS_6.5_x64_v14.0_EBS にしました。

CentOS6ならMarketPlaceからCentOS本家のAMIを使えばいいじゃない

ええ。その通りです。
しかしMarketPlaceAMIで作成したインスタンスのEBSは、デタッチして別のインスタンスのセカンダリEBSとしてアタッチしたりができないのです。
今回ボクは、何度も失敗してインスタンスを作りなおしたりするだろうとの予想から、最初から自由の効くAMIを選びました。

インスタンス内にバッチ処理の為の環境を構築

javaのインストールとか

まず今回はjavaが必要だったのでjavaをインストールしました。
まぁこれはそんなに詳細書く必要ないですよね。

yum -y install java-1.7.0-openjdk とかで入ります。

seleniumのダウンロードとか

で、今回の要件は「ブラウザで特定URL開いてキャプチャ取得」なので、selenium を使います。
公式サイトから selenium-server の最新版をダウンロードしてインスタンス内の適当な場所に保存しました。

スクリプトの準備とか

selenium を動かすためのスクリプトは以前に社内のハイパーエンジニアに書いてもらったのでそれを使います。
もちろん依存モジュールは適当にインストールします。

selenium-script.png
わずか40行の美麗なソースコード!

ああ、そういえばブラウザ必要ですね・・。

linux ですし、firefoxをインストールしておきましょう。
yum -y install firefox っと。

GUIないけどブラウザって起動するのかな。

Xvfb!?

色々と調べたところ、GUI無しでブラウザを起動しようと思ったら、Xvfb なるものが必要なようで。
ためらうことなく yum -y install Xvfb ですよね。いやーyum便利。

なんだか環境変数DISPLAYを設定しないといけないとかXvfbさんが割と面倒です。

どうせインスタンス起動時にバッチ処理するようにしないといけないしスクリプト化しておきます

batch.png
こんな感じで。selenium-server を java で起動したりとかの雑務もしつつ、sleep 3s が物悲しい。

自動インスタンス停止(削除)スクリプトを仕込む

suz-lab さんを参考に、バッチ処理が終了したらインスタンスを削除するようにスクリプトを組みます。

suz-lab さんではPHPスクリプトで処理していたので、少しでも suz-lab さんと違う部分を作る為にNodeスクリプトで処理する事にします。

こんな感じでやっつけスクリプトを書いてみました。

インスタンス起動時にこれらのスクリプトを実行するように

/etc/rc.local に、バッチ処理用スクリプトと、自動インスタンス停止スクリプトを実行するように記載します。
ただこの際、rc.local に直接 node /path/to/nodescript/app.js とか書くと全く動作しなかったので、
環境変数を設定しつつ node を実行する為の bash スクリプト(リポジトリ内のrun.sh)を用意して、そちらを rc.local で実行するようにしました。

rclocal.png

ここまでできたらひとやすみ

インスタンスを起動したり停止したりして、バッチが動いてるかを確認したりします。

インスタンスのスケジュール起動設定

Auto Scaling Group の作成

まずはこのインスタンスのAMIを作ります。
VolumeSnapshot取ってSnapshotからCreateImageですね。
そして、AUTO SCALINGLaunch Configurations から、Auto Scaling Group を作成します。
文章がまるで呪文のようだ。

autoscaling.png

先程作成したAMIを指定してAutoScalingGroupを作成します。
インスタンス作成する時と同じようなUIが表示されますので、これは普段通りに処理します。

その後、下図のような画面になります。
Group Name に適切に命名し、Group Size0 にします。
つまり、自動的に起動する事はない設定です。

autoscaling2.png

自動起動スケジュール設定

ManagementConsoleから設定できるのかよくわかりませんが、こちらもNodeスクリプトで処理します。

こんな感じでこちらもやっつけなスクリプトを書いてみました。

credentials.json に適切に諸々の設定を書くか、$ENVに設定値を入れておくかで設定できます。

その後、npm install ってやってから、node index.js で動きますね多分。
あ、ちゃんと実行環境にNode本体は入れておかないといけないです。

これは事前に作ったインスタンス上じゃなくとも、このスクリプトが動作する環境であればどこで実行しても構いません。

以上で、指定したスケジュールに従ってインスタンスが自動で作成され、起動直後にバッチが実行され、
バッチの終了後に自動でインスタンスが削除されるようになりました。

仕組みは参考サイトをご参照ください!

これを応用するとすごく安くいろんな事ができるようになる気がしますね!

このエントリーをはてなブックマークに追加