エムスリーエンジニアリンググループ AI・機械学習チームの丸尾 (@snowhork) です。この記事は、エムスリー Advent Calendar 2021 の15日目の記事です。
エムスリーではAI・機械学習チームをはじめとして、ElasticsearchのマネージドサービスであるElastic Cloudを活用しています。Elastic Cloudを含め、クラウドサービスはスケールアップ・スケールアウトが簡単にできるのは便利ですが、一時的に手動で作ったリソースを消し忘れてしまうということをついやってしまいます。この記事では、Elastic Cloudのリソースの設定がずれていることを通知するツールを紹介したいと思います。
背景
弊チームではElastic Cloudを活用して検索基盤を構築しています。積極的に新規データ追加や設定変更などを行い、インデックスの改善を試行錯誤し続けています。そのため、以下のようなインフラのスペック変更をアドホックに行うことがあります。
- 負荷試験を行うために、新規デプロイメントを立てる
- QA環境で本番相当のデータで検索性能を検証したいため、デプロイメントを一時的に本番相当のスペックにする
こういった新規デプロイメントの追加・スケールアップをコンソールでクリックするだけで行えるのがとても便利ですが、元の状態に戻し忘れてしまうことがあります。例えば、以下のようなことが実際にありました。
- 新規デプロイメントを削除し忘れる
- 既存デプロイメントのスペックを戻す時に、Elasticsearchの再起動が失敗していて、スケールダウンが完了されていなかった
こういったことがあると不要な請求が発生してしまいます(実際には月末の請求金額で消し忘れが発覚します)。
メンバーが気をつけましょうでは根本的な解決ではないので、プログラムでこういったミスを減らしたい、気づけるようにしたいというのがエンジニアの常ですよね。
必要なものは次の2点です。
- 理想状態と差分を比較するプログラム
- 定期的実行し、差分があれば通知する仕組み
前者は今回作成したツールで、 ecmonit
と名付けました。後者の定期実行の仕組みは、弊チームではGitLabのPipeline Schedule *1 を利用して、毎朝Slackに差分を通知するようにしました。
ecmonit
ツールの実装方針としては、設定ファイル(今回はyaml形式で記述することにしました)を配置し、実際のElastic Cloudの設定との差分をとるという仕組みで実装しました。
既存のツールでできるものとしてはやはりterraformが最初に思いつくかと思います。 terraform plan
で差分を取るということも考えられますが、
- 現状、Elastic Cloud のデプロイメントをterraformで管理しておらず、
terraform import
の実行が必要になり煩雑(デプロイメントを建てた当初、 Elastic Cloudの terraform provider *2 は開発中でした) - 新規作成したデプロイメントは terraform には認識されない
という点からterraformでは実現できなさそうと考え、新しくツールを作成しました。
Elastic CloudにはデプロイメントのCRUDのAPIを提供しているので、これを活用できそうです。
実際の動作例
今回はterraformとは違って、Elastic Cloudのインフラ構成は既にあることが前提なので、設定ファイルを現在の状態と同じになるようにゼロから記述するのは大変です。ですので、現在の状態を設定ファイルに吐き出す機能があると便利そうです。具体的には以下のようなコマンドで設定ファイルを吐き出せます。
ecmonit deployment load > deployments.yml
このコマンドによってElastic Cloudの理想状態を設定ファイルに記述しておきます。一旦その設定ファイルを記述しておいたら、差分を以下のようなコマンドでチェックできます。
ecmonit deployment diff deployments.yml
実際には以下のスクリーンショットのように、差分の通知がされます。
まとめ
この記事では、Elastic Cloudのデプロイメントの設定の差分を通知するツールを紹介しました。他にも利用料金を通知する機能を追加を考えています。機能がある程度まとまったらOSSで公開したいと思います!
AI・機械学習チームではクラウドサービスを最大限活用して機能開発をしています。多くのマイクロサービスの機能が増えていく分、今回のような痒いところにも手がとどく監視ツールも自作しています。
We're hiring!
マイクロサービスのクラウド基盤を支えてくれるメンバーを募集中です! 興味がある方は是非下のリンクからカジュアル面談しましょう!