こんにちは、エンジニアリンググループ AI・機械学習チームの榎田(@niflh)です。就活のときに「バイトでプログラムは書いてますが、それより数学してるほうが好きです!」と言ったらエムスリーさんからお声がかかって、インターンを経て新卒入社しました。最近は仕事でプログラミング、プライベートで数学する楽しい日々を送っています。
今回、インフラを監視するための Datadog dashboard を Terraform でつくったので、その話をします。
ちなみに私は入社まで Terraform も Datadog も未経験だったのですが、エムスリーに入った2ヶ月でだいたいキャッチアップできました。色々な技術に触れて勉強できる、刺激的でいい環境です。
なお、本記事は Terraform および Datadog に触れたことがあることを想定して著しています。
背景
社内で、ある機械学習システムの一部を切り離して運用することになり、その切り離したシステムのためのインフラ構築が必要になりました。
新卒で入り、特にインフラ技術にも詳しくなかった私がキャッチアップするのにちょうど良さそうだということで、そのインフラと監視系を作ることにチャレンジしました。
インフラの構成は切り離し前のものと同様にすることにしました。とは言ってもコピペで終わらせたわけではなくて、インフラ側は tf ファイルをリファクタリングするなど、色々しています。
一方、チームではこれまで、監視用の Datadog を GUI 上でポチポチして作っていました。それを踏襲するなら、切り離し前からある既存の Datadog Dashboard と非常によく似たものを GUI 上でもう一度ポチポチして作ることになります。チーム内でも、同じことを何度もやることになってつらいね、という話はあがっていました。
今ある Dashboard とだいたい同じものをつくるんですから、簡単に自動化できるなら自動化したいものです。今後の業務効率化と幸せな人生に繋がります。
自動化に向けて
Terraform には Datadog provider が提供されています。これを使えば、Dashboard がコード管理されるので、Dashboard の作成が自動化でき、再利用が容易になりそうだと思いました。社内で Datadog provider を使っているひとはまだいなかったので、技術調査を兼ねて使ってみることにしました。
やったことは大きく2段階に分かれています。Dashboard から tf ファイルを生成する第一段と、生成した tf ファイルを編集する第二段です。
第一段:OSS を使って tf ファイルを生成
実は、Datadog Dashboard の tf ファイルを直接書くのはけっこう苦しいです。例えば AWS クラスタでの5分間ロードアベレージの推移を表示するグラフを表示したければ、tf ファイルに次のようなブロックを書く必要があります。 ざっと眺めるだけでも、表示位置の x 座標や y 座標、グラフタイトルおよびそのサイズなどをハードコードしているのがわかります。思っていたようなサイズが出なかったらそのたびに terraform apply する必要があります。めんどうです。
widget { type = "timeseries" x = "0" y = "32" title = "Frontend load ave 5" title_align = "left" title_size = "16" height = "13" width = "47" time { live_span = "<nil>" } tile_def { viz = "timeseries" autoscale = "true" request { q = "avg:system.load.5{name:archimedes-dev-frontend-ecs-cluster} by {host}" type = "line" aggregator = "avg" style { palette = "dog_classic" type = "solid" width = "normal" } //style } //request } //tile_def legend = "false" legend_size = "0" } //widget
それは流石にやりたくないな、みんなどうしているのだろう、と思って簡単に調べてみると、次のような OSS が見つかりました。
Datadog の api key と app key があれば、既にある Dashboard を tf ファイルにエクスポートしてくれます。Go 言語の環境が必要だと書いてあって、私は Go 言語について何も知らなかったのですが、Go 言語本家のサイトと併せてドキュメントをよく読んでセットアップすればビルドできました。OSS ありがたやと言いながら使わせていただきました。
ところでこの OSS にはいまでも open issue があるみたいで、実際一部の Dashboard のエクスポートでコケたのですが、ほしい Dashboard はとりあえずエクスポートできたので良しとしました。
この OSS 以外にも、調べると次のような記事がヒットします。
terraform import で tfstate ファイルが書き換わるので、その tfstate ファイルから tf ファイルを生成するという方法のようです。けっこう力技です。
第二段:タグの張替え
先程引用した Dashboard の tf ファイルは、実はこの OSS を用いたエクスポート結果です。なのでこれを少し書き換えて terraform apply するだけで、すでにあるダッシュボードのクローンが生成できます。
実際には監視したい対象は別にいるので、タグを張り替えてあげる必要があります。
q = "avg:system.load.5{name:archimedes-dev-frontend-ecs-cluster} by {host}"
この行が、どのメトリクスを監視するかをタグで指定している部分です。Datadog では手でポチポチしていた部分です。 私はここを変数宣言に置き換えて、別の変数ファイルで監視対象を指定しました。これで再利用がしやすくなりました。こういう工夫をすることができるのが Terraform 管理下に置く利点と言えるでしょう。
q = "avg:system.load.5{project:${var.project_name},env:${var.environment_name},name:${var.project_name}-${var.environment_name}-ecs-api} by {host}"
まとめ
Terraform を使って Datadog Dashboard を作るまでの道程を述べました。以下、この方法についての良い点・悪い点と、それらを踏まえて現時点で私が考える多分一番早い方法を述べます。
良い点:複製は簡単
多数のプロダクトがある状況で、それぞれから似たようなメトリクスをとって監視したいという状況は多いのではないでしょうか。
そのような、すでにある Datadog Dashboard とほぼ同様のものを生成したい場合は、本稿で述べたような方法が非常に有効に機能すると思います。
勿論、AWSリソースにタグを適切につける必要はありますが、Datadog での AWS 監視系が構築できているならば、タグはちゃんとついているはずなので、この点は問題にならないでしょう。
悪い点:オリジナルを作るのは大変
逆に、イチから Dashboard を生成するには、かゆいところに微妙に手が届いていないというのが2019年6月現在の所感です。
Dashboard 内での x 座標や y 座標をコード上できちんと指定する作業を手でやるよりも、GUI 上でポチポチするほうが圧倒的に早いです。
まとめのまとめ:Terraform で Datadog Dashboard を作るには
多分これが一番早いと思います。
- とりあえず1枚 Datadog GUI 上でポチポチして Dashboard をつくる
- 適当な OSS を使って、作った Dashboard を tf ファイルに変換する
- Dashboard の設定のうち、必要なところを書き換えて terraform apply
We are hiring!!
エムスリーはエンジニアを絶賛募集中です!
自分の知らない技術があっても、刺激的な課題にたくさん取り組む過程で技術の幅を広げられるので、勉強が好きな人には大変楽しい職場だと思います。
また、新卒採用も行っています。私のような数学寄りの、技術から少し遠いバックグラウンドの人でも、技術を学びながら大変楽しく仕事ができる環境です。興味があればぜひカジュアル面談、そのまま試しにインターン、そして正社員としてエムスリーに来てください!