【AWS】月額300円以下で、毎時10分間実行するバッチサーバを作る方法

インフラ

こんにちは。趣味グラマの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のリージョンとインスタンスを見つけ出す

今回はバッチ処理のため、レスポンスタイム等を考慮する必要がなく、単純に最も安いリージョンを見つけ出せば良いという事になります。

オンデマンドインスタンスの料金 - Amazon EC2 (仮想サーバー) | AWS
オンデマンドインスタンスについては、お客様が使用された EC2 インスタンスの料金のみのお支払いとなります。オンデマンドインスタンスを使用することにより、ハードウェアのプランニング、購入、維持に伴うコストや手間が省け、高額な固定費となりがち...

早速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は変化が早い…)

Amazon EventBridge (サーバーレスイベントバスでアプリ同士を簡単に接続) | AWS
Amazon EventBridge は、独自のアプリケーション、SaaS アプリケーションや AWS のサービスからデータを取り込み、そのデータをターゲットにルーティングする、サーバーレスイベントバスです。

実際の設定は大して難しくないのですが、具体的な設定方法は手抜きして他サイトにお任せしたいと思います。

EC2 自動起動停止 - Qiita
EC2 自動起動停止概要EC2のインスタンスをcronで自動で起動、停止するように設定する。備忘録としてAWSのコンソールの新UIで設定する方法を残すもの。EC2のインスタンスを必要ないとき…
[AWS] CloudWatchでEC2の自動起動・停止をスケジュールする
CloudWatch Events の設定だけで、スケジュールされた日時に EC2 インスタンスを自動で起動・停止する方法。 テストで使っている EC2 インスタンスを終業時に自...

ちなみに、cronの設定を行った際に、まさにこの事例にハマりました。

EventBridge のスケジュールパターンで「CRON 式が無効です」が発生したときの対処方法 | DevelopersIO
困っていた内容 毎朝同じ時間にイベントを実行するため EventBridge ルールを構築しています。Cron式を選択して、パターンを入力しましたが「CRON 式が無効です」が表示されてルールが作成できません。対処方法を …

少しでも課金額を減らすために、実際の起動〜終了までの時間について少しずつ調整を行っていたのですが、EventBridgeの設定をブラウザのコンソールから行うのは非常に面倒なため、ターミナルから使えるaws cliの導入をお勧めします。

AWS コマンドラインインターフェイス(CLI: AWSサービスを管理する統合ツール)| AWS
AWS コマンドラインインターフェイス (CLI) は、AWS サービスを管理するための統合ツールです。ダウンロードおよび設定用の単一のツールのみを使用して、コマンドラインから複数の AWS サービスを制御し、スクリプトを使用してこれらを自...
events — AWS CLI 1.32.63 Command Reference

EBSの料金に注意

EventBridgeを使ってEC2の起動時間は節約出来ますが、バッチプログラムを置いているEBSについては、別途料金が発生します。

とは言え、大量データを溜め込むとかでなければ、ほぼ気にする事はありません。

私の場合は、誤差の範囲に収まる予定です。

まとめ

まだ使い始めて1ヶ月経っていないので、実際の1ヶ月分の課金額は分かっていないのですが、日々の課金状況を見ると、1日あたり約0.06ドル(8.1円)で済んでおり、先の見積もりでいけば、8.1円 x 24日分 = 194.64で済む想定です。

多少誤差が出たとしても、月に300円を超える事は無いと思うので、とんでもなく格安でバッチサーバを手に入れる事が出来ました。

AWSに大感謝です。

コメント

タイトルとURLをコピーしました