こんにちは。趣味グラマのNobu(@nm_aru)です。
Node.jsのライブラリを使った処理があり、その処理の結果データをFirebaseのHostingにアップすると言う一連の流れをシェルスクリプトでバッチ処理として作っていました。
この一連のバッチ処理は、手元のM1 Macで動かすと問題なく動き、処理時間も数分で済みます。
これをcronで定期実行したいと思い、私が借りているさくらインターネットのVPS(メモリ1GB、仮想CPU2コア)環境で実行してみると、Node.jsの処理がタイムアウトしたり、Load Averageが高くなりすぎて、同居しているWebサーバのレスポンスが返らなくなったりと、散々な状況になってしまい、なかなか自動化が出来ずに困っていました。
バッチ処理のためだけに、更に上のスペックのVPSを借りるのも勿体ないし、クラウドも高いしなと悩んでいたのですが、そう言えばAWSはEC2の自動起動・停止が出来たなと思い出し、改めてチャレンジしてみると、とても幸せな結果に。
備忘録兼ねて残しておこうと思います。
バッチ実行に必要な時間を見積もってみる
今回のバッチ処理の要件は以下になります。
- 1回辺りの実行時間・・・10分以内
- 1日辺りの実行回数・・・24回(毎時1回)
- 1週間辺りの実行日数・・・6日
- 1ヶ月辺りの実行日数・・・1ヶ月4週間として、上記から24日
ここから、1ヶ月辺りの実行時間を計算すると、こうなります。
10分 x 24回 x 24日間 = 5,760分 = 96時間
つまり、月に約96時間ほどの実行時間が発生する事になります。
最適なAWSのリージョンとインスタンスを見つけ出す
今回はバッチ処理のため、レスポンスタイム等を考慮する必要がなく、単純に最も安いリージョンを見つけ出せば良いという事になります。
早速AWSのEC2の価格を見てみると、バージニア北部(us-east-1)が最も安い事が分かりました。
そして、インスタンスをどれにしようかと迷ったのですが、今回はt3a.microを選択しています。
インスタンスを選択するまでには、実際に何種類かのインスタンスを起動して、バッチ処理を実行し、実行時間を計測した上で、許容範囲内の物として最終的にt3a.microを選択しています。
バージニア北部のt3a.microの料金は、この記事執筆時点で0.0094 USD/時になるので、先の96時間から計算すると
96時間 x 0.0094ドル = 0.9024ドル
になり、記事執筆時点のUSDJPY=135円で計算すると
0.9024ドル x 135円 = 約121円
になります。
ちなみに、リージョンについて東京(ap-northeast-1)と比較すると、こんな感じで東京の方が約30%ほど割高になります。
バージニア北部
東京
余談ですが、インスタンスにはCPUの種別でARM系とIntel系があり、ARM系の方が更に安いので、最初はARM系を検討しました。しかし、残念な事に使用しているNode.jsのライブラリがARM系では動かず、仕方なくIntel系を選択しました。
M1 MacもARM系のはずで、そこでは問題なく動いているのですが、なぜ…という疑問もあったり。
AWS EventBridgeを使ってEC2の自動起動・終了を行う
以前の知識では、Cloud Watchを使うはずだったのですが、どうやら今同じことをするには、AWS EventBridgeというサービスを使う必要があるようです。(AWSは変化が早い…)
実際の設定は大して難しくないのですが、具体的な設定方法は手抜きして他サイトにお任せしたいと思います。
ちなみに、cronの設定を行った際に、まさにこの事例にハマりました。
少しでも課金額を減らすために、実際の起動〜終了までの時間について少しずつ調整を行っていたのですが、EventBridgeの設定をブラウザのコンソールから行うのは非常に面倒なため、ターミナルから使えるaws cliの導入をお勧めします。
EBSの料金に注意
EventBridgeを使ってEC2の起動時間は節約出来ますが、バッチプログラムを置いているEBSについては、別途料金が発生します。
とは言え、大量データを溜め込むとかでなければ、ほぼ気にする事はありません。
私の場合は、誤差の範囲に収まる予定です。
まとめ
まだ使い始めて1ヶ月経っていないので、実際の1ヶ月分の課金額は分かっていないのですが、日々の課金状況を見ると、1日あたり約0.06ドル(8.1円)で済んでおり、先の見積もりでいけば、8.1円 x 24日分 = 194.64で済む想定です。
多少誤差が出たとしても、月に300円を超える事は無いと思うので、とんでもなく格安でバッチサーバを手に入れる事が出来ました。
AWSに大感謝です。
コメント