CloudWatchダッシュボードでカスタムウィジェットが作成可能になったので試してみた

みんな大好き ojichat を使ったウィジェットを作ってみました
2021.08.29

しばたです。

先日Amazon CloudWatchのダッシュボードに自作Lambda関数の実行結果を表示させるカスタムウィジェットがサポートされました。

とりあえず簡単なサンプルでも作って解説ブログを書こうとしていたところ先を越された(上記リンク参照)ので本記事では実際に作ってみた立場で感じた点を書いていこうと思います。

カスタムウィジェットの概要については上記リンクをご覧ください。

作ったウィジェット

弊社の一部界隈ではojichatに根強い人気があるため「あたかもおじさんが語りかけてくれるような」簡単なウィジェットを作ってみました。
ソースはGitHubで公開ずみです。

このウィジェットは下図の様にテキストメッセージで語りかけてくれるだけのシンプルなものです。

ダッシュボードを更新するたびにメッセージの内容が変わります。

導入方法についてはGitHubに記載してますのでそちらをご覧ください。
Go言語の開発環境とSAM CLIが必要となりますが、シンプルなものですので最悪SAM CLIが無くてもなんとかなるでしょう。

ちなみにこちらは弊社もこが以前作成したAPIの実装をパク参考にしています。

所感

ここからは実際にカスタムウィジェットを作ってみた所感を思うがままに書いていきます。

1. Lambdaラインタイム

AWS提供のサンプルではNode.jsとPythonが提供されていますがLambdaランタイムの言語は制限されていません。
今回作ったウィジェットもGo言語製ですしみなさんが使い慣れている言語を使うと良いでしょう。

2. Lambda関数の入力

ドキュメントをちゃんと読めばわかるのですが、初見ではLambda関数の入力値がどういう仕様か非常にわかりにくかったです。
ユーザー定義のパラメーターに加え自動でwidgetContext要素が追加される点やヘルプドキュメントを表示する際は{"describe" = true}となる点は理解するの時間がかかりました。

これらの理解にはAWS提供のCustom widget debuggerサンプルが非常に役にたちました。
このサンプルをデモ用ダッシュボード付きで構築すると下図の様にLambda関数の入力値の詳細やContextの内容、設定済み環境変数の一覧をリストアップしてくれます。

加えて入力フォームやボタンの実装例にもなっているためこれらの機能を実装する際の参考にもなるでしょう。

3. Lambda関数の出力

Lambda関数の出力はHTMLテキスト、JSON、Markdown({"markdown":"markdown content"}形式)のいずれかで良く、逆に言うとそれしかできないため非常にプリミティブです。
プリミティブな分自由度は非常に高いですが、画像などのテキスト以外のデータを生成するにはあまり向いていません。
(一応GetMetricWidgetImage APIを使いBASE64エンコードした画像を返すサンプルはある)

このためカスタムウィジェットはユーザー独自のグラフを作るものというよりは、既存のグラフ表示を補完したりグラフ形式以外でデータを可視化するものと考えるのが良さそうに思えました。

なお、セキュリティ上の理由によりJavaScript(<Script>タグ)や<iframe>等の一部タグは使用できません。
Lambda関数の出力後にAWS基盤により当該タグが除去されます。

4. CSS

HTML表示のスタイルについてはウィジェットの親要素(AWS側)のスタイルがデフォルト適用されるそうです。
<style>タグを出力させると親要素のCSSにタグの内容が追記される形となっていました。

私はCSSがぜんぜんわからないためあまり良い感じのことが言えません...すいません。
ちなみにcwdb-no-default-stylesクラスを与えると親要素のスタイル継承を無効にできるとのことでした。

5. Lambda関数のリージョン

カスタムウィジェットでは他リージョンの関数も呼び出せます。
たとえば東京リージョンのダッシュボードでバージニア北部の関数を呼ぶウィジェットも作れます。

初見ではLambda関数のリージョンとダッシュボードのリージョンを合わせないとダメと誤解しており、思い込みは良くないなと思った次第です。

6. AWS提供サンプルのGitHubリポジトリ

AWSのドキュメントで紹介されるサンプルは全てCloudFormation Templateへのリンクとなっているのですが、サンプルコードを収めたGitHubリポジトリも存在してます。

Lambda関数の中身だけ見たい場合はGitHubを使うほうが圧倒的に楽ですので適宜両者を使い分けると良いです。

最後に

つらつらと書いてきましたが以上となります。

カスタムウィジェットは自由度が非常に高いためその用途も千差万別になりそうです。
みなさんが普段CloudWatchダッシュボードを使っているなかで「ここに〇〇があればなぁ...」といったスキマを埋めてくれるものになると感じました。

シンプルなものであれば作成は非常に楽ですので是非試してみてください。