
非本番環境をクラウドで動かすのは便利です。必要なときにいつでも使えるのは魅力ですが、その手軽さにはコストという代償がついて回ることもあります。非本番インスタンスは日中に使うことがほとんどで、忙しさにかまけて夜間や週末に停止し忘れることもよくあります。1インスタンスの料金は1時間あたり数十セント程度でも、1か月積み重なれば数千ドル規模になることも珍しくありません。
GoogleのPremier兼MSPパートナーである DoiT International では、Google Cloud Platform、とりわけGoogle Compute Engine上でworkloadsを運用する数百社のスタートアップやエンタープライズを支援しています。私たちが常に目指しているのは、よりスマートで賢く、コスト効率の高いシステム設計によって、お客様の月々のクラウド支出を抑えることです。
そうした思いから、本日 Zorya をオープンソースとして公開します。スラブ神話に登場するZoryaは、2人の守護女神。Zoryas は明けの明星と宵の明星を象徴する姉妹で、Neil Gaimanの American Gods を読まれた方や観られた方なら、きっとご記憶でしょう。
では、Zoryaとは何か。ご自身のGoogle Cloud Platformアカウントで動かせる小さなソフトウェアで、Google Compute Engineインスタンスのスケジュールを設定し、組織内のすべてのプロジェクトを横断するポリシーを定義できるツールです。
Zoryaはインストールも運用も極力シンプルにしたかったため、次のような設計目標を掲げました:
- サーバーレスで動作させ、運用負荷を最小化する
- 複数のスケジュールとポリシーを設定できる
- 1つのZoryaインスタンスから複数プロジェクトを扱える
- Zorya自体の運用コストを低く抑える
そこで、ZoryaはGoogle App EngineのStandard Environment上に構築・運用することにしました。これだけで、要件のうち2つを満たせます:
- App Engineを使うことでサーバーレス運用が実現。サーバー管理が不要になり、高可用性とスケーラビリティを標準で得られます。
- 運用コストの低さ ― Google App Engineの料金体系に加え、Zoryaは1時間に1度しか「目を覚まさず」、それ以外の時間はリソースを消費しないため、コストを抑えられます。
ZoryaはバックエンドをPython、フロントエンドをReactで実装しています。設定データの保存にはGoogle Cloud Datastoreを採用しました。
バックエンド
バックエンドは、schedules と policies の取得・設定を行うシンプルなRESTful APIを提供します。
Schedule エンティティは、名前、タイムゾーン、そして1週間の各曜日・各時間を表す7×24のマトリックスから構成されます。値が0ならインスタンスは停止状態、1ならオンライン状態であるべきことを表します。
Policy エンティティは、名前、プロジェクトのリスト、紐付けるスケジュール名、そしてGoogle Compute Engineラベル(名前と値のペア)のリストから構成されます。
{ "name": "My policy", "tags": [\ {\ "dev": "sleeper",\ "staging": "resting"\ }\ ], "projetcs": [\ "project-x",\ "y-project"\ ], "schedulename": "my schedule name"}APIは非常にシンプルで、エンドポイントは次の8つだけです:
- add_policy
- list_schedules
- del_schedule
- get_schedule
- add_policy
- list_policies
- get_policy
- del_policy
APIドキュメントと、いくつかの言語によるサンプルコードは こちら でご覧いただけます。
Google App Engine組み込みのスケジューラを使い、ポリシーをチェックしてインスタンスの状態を変更すべきかを判定するタスクが動いています。
変更が必要な場合、Zoryaは対象プロジェクトを巡回し、指定されたラベルペアを持つインスタンスの状態を切り替えます。
https://gist.github.com/avivl/ee9e7c11c254e25b890d48c1a873fdc1
認証
Zoryaが組織内の任意のプロジェクトでインスタンスを管理できるようにするには、組織のIAMに新しいエントリを作成し、Zoryaのサービスアカウントに「Compute Admin」ロールを付与する必要があります。
まず https://console.cloud.google.com にアクセスし、メニューから「IAM & Admin」を選択。ページ上部のドロップダウンから(特定のプロジェクトではなく)組織名を選びます:

権限を付与すべきサービスアカウントの名前は次のとおりです: [email protected]。project-id の部分は、Zoryaをデプロイする実際のプロジェクトIDに置き換えてください。
フロントエンド
大半の方はZoryaのAPIをお使いになると想定し、スケジュールとポリシーを作成できる比較的シンプルなUIを用意しました。フロントエンドはReactJSベースで、App Engineアプリケーションのデフォルトモジュールに公開しています。
アプリへのサインインには Cloud Identity-Aware Proxy を使用しています。Cloud IAPはユーザーのIDを検証し、そのユーザーにアプリケーションへのアクセス権があるかを判定します。セットアップは GCPコンソール でApp EngineアプリにIAPを有効化し、Zoryaにアクセスさせたいユーザーやグループを追加するだけと、ごくシンプルです。
UIを使い始めるには、ブラウザで project-id.appspot.com を開き、project-id をご自身のGoogle Cloud PlatformプロジェクトIDに置き換えてください。
UIを使えば、新しいスケジュール設定も簡単です。たとえば米国東部時間で月曜〜金曜の午前8時〜午後7時を指定すれば、その時間帯はインスタンスが稼働し、それ以外の時間帯はZoryaがインスタンスを停止し、翌日に再び起動します。
Zorya スケジュールエディター
スケジュールを作成したら、それを一部のインスタンスに適用するためのポリシーを設定します。たとえばプロジェクト doit-playground で、env:dev、role:frontend、app:reoptimize のラベルを付けたインスタンスにスケジュールを適用したい場合、この3つのラベルペアをすべて備えたインスタンスだけが対象になります。
Zorya ポリシーの設定
コスト削減
Google Cloud Platformのコスト把握には DoiT Cloud Intelligence™ を使っています。DoiT Cloud Intelligenceなら、対象のGCP組織でラベルごとにコストを分解し、見やすく可視化できます。
社内では2017年12月からZoryaを使い始めました。当時のGoogle Compute Engineのコストは平均で1日あたり約780ドル。開発・テスト環境にZoryaを導入した結果、現在のGCEコストは平均で1日あたり320ドル ― 約60%の削減を実現しています。
DoiT Cloud Intelligence ダッシュボード
おわりに
Google Cloud Platformの月額料金を最適化するために Zorya を使ってみたいと思われたら、ぜひGitHubでスターをお願いします! ;-) プルリクエストも大歓迎なので、Zoryaを一緒に育てていただけると嬉しいです!
もっと記事を読みたい方は、ブログ をどうぞ。あるいは AvivのTwitterをフォロー してみてください。