kakakakakku blog

Weekly Tech Blog: Keep on Learning!

Redash のメトリクスをモニタリングする

今日は「Redash Advent Calendar 2017」21日目の記事として,小ネタだけど,Redash で提供されているモニタリング用のメトリクスを紹介したいと思う.会社で Redash の活用が普及してくると,Redash の障害がビジネス的な影響に繋がる場合もあったりして(依存度が高すぎるのかもしれないけど),ツールとは言え,適切にモニタリングをしてあげる必要があると感じることが多い.Redash Ops も重要.

qiita.com

プロビジョニング

会社で運用中の Redash は AWS の AMI から起動しているけど,以下の3点だけは Chef でプロビジョニングを行っている.今回紹介するモニタリングの話に関係するのは Zabbix Agent の部分となる.

/status.json とは

Redash で提供されているモニタリング用のメトリクスは /status.json というエンドポイントになっていて,公式ドキュメントにも記載されている.1点注意点があり,メトリクスを取得できるのは管理者権限(管理者ユーザーもしくは admin グループに所属したユーザー)に限られる.よって,管理者権限を持っていればブラウザでも確認することができるけど,Zabbix などのツールと連携する場合は Get パラメータに api_key を付与する必要があり /status.json?api_key=xxx のようになる.

取得できるメトリクスの一覧は以下となっている(公式ドキュメントから抜粋).正直言ってメトリクスは充実してなく,Redash / Python / PostgreSQL / Redis など,もっとメトリクスが増えると良さそう.他にどんなメトリクスがあれば良いだろうか.

{
    "dashboards_count": 30,
    "manager": {
        "last_refresh_at": "1465392784.433638",
        "outdated_queries_count": 1,
        "query_ids": "[34]",
        "queues": {
            "queries": {
                "data_sources": "Redshift data, redash metadata, MySQL data, MySQL read-only, Redshift read-only",
                "size": 1
            },
            "scheduled_queries": {
                "data_sources": "Redshift data, redash metadata, MySQL data, MySQL read-only, Redshift read-only",
                "size": 0
            }
        }
    },
    "queries_count": 204,
    "query_results_count": 11161,
    "redis_used_memory": "6.09M",
    "unused_query_results_count": 32,
    "version": "0.10.0+b1774",
    "widgets_count": 176,
    "workers": []
}

Zabbix でメトリクスを取得する

Zabbix の userparams を活用すれば,簡単にメトリクスを取得できる.具体的には以下のようなファイルを作成している.

UserParameter=redash.dashboards_count,           curl -s http://localhost/status.json?api_key=xxx | jq '.dashboards_count'
UserParameter=redash.queries_count,              curl -s http://localhost/status.json?api_key=xxx | jq '.queries_count'
UserParameter=redash.query_results_count,        curl -s http://localhost/status.json?api_key=xxx | jq '.query_results_count'
UserParameter=redash.unused_query_results_count, curl -s http://localhost/status.json?api_key=xxx | jq '.unused_query_results_count'
UserParameter=redash.redis_used_memory,          curl -s http://localhost/status.json?api_key=xxx | jq '.redis_used_memory'

すると,モニタリングできるようになるので,例えば,ダッシュボード数とクエリ数の推移から活用されている状況を把握することができる.query_results_count もクエリ実行の状況を把握するときに確認している.

f:id:kakku22:20171221025333p:plain

f:id:kakku22:20171221025345p:plain

System Status 画面

管理者権限(管理者ユーザーもしくは admin グループに所属したユーザー)を持っている場合,ヘッダー右側のメニューから「System Status」画面に遷移することができる.URL は /admin/status になる.ここに表示される値は,紹介した /status.json から取得されているため,最新データを確認するだけなら,この画面で十分と言える.

f:id:kakku22:20171221023502p:plain

(ハンズオン画面)

EBS BurstBalance

モニタリングの観点(AWS で Redash を動かす場合)だと,EBS タイプを気にする必要がある場合もある.既に Redash の知見をブログに多く書かれている id:ariarijp にお話を聞いたところ「クエリ結果を大量に書くようなユースケースだと gp2 の BurstBalance を使い切る場合がある」とのことだった.

とは言え,Magnetic を残しておきたくもなく,会社で運用中の環境では gp2 ( 30GiB で 100 IOPS ) を使っているけど,今のところ問題になったことはなく,未来のためにモニタリングをしているという感じ.Redash ガチ勢のユースケースだと gp2 では無理なのかも?

f:id:kakku22:20171221022614p:plain

Redis のメトリクスには注意する

現在 Redis のメトリクスで redis_used_memory が取得できるけど,これは redis-cli info から取得できる used_memory_human の値になっていて,単位付きの値になってしまっている.よって,メトリクスをグラフ化しにくく,困ってしまうので注意する必要がある.

そんな背景もあり,今年3月に redis_used_memoryredis_used_memory_human にメトリクスを分割したプルリクを出しているんだけど,今のところ取り込んでもらえていなく,どうしようー?という感じ.そこそこ多くリアクションももらえているのになー.あくまで暫定だけど,会社で運用中の Redash では,直接 redash/monitor.py を修正してモニタリングできるように対応している.

追記 : 2018/02/12 に Merge してもらった!

github.com

まとめ

  • Redash にはモニタリング用のエンドポイントが用意されている
  • ただし,現時点だとメトリクスが足りなく,もっと増えると良さそう
  • 最新データを確認するだけなら System Status 画面も使える
  • redis_used_memory メトリクスを修正するプルリクを3月頃に出したけど,そのままになっている

mackerel-plugin-redash

あったんだ!知らなかったー!(今度試してみよう)

既に書いたアドベントカレンダー記事

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

「AWS re:Invent 2017 Serverless re:Cap」に参加した

月曜日は「AWS re:Invent 2017 Serverless re:Cap」に参加してきた.日本だと完全に深夜帯だったキーノートは全て見たし,Black Belt「re:Invent 2017 速報」も見たけど,アップデートが多いので繰り返し学びたいなと思っていたのと,今回は Serverless 関連に特化したイベントだったので,より深く話が聞けるかなというのを期待していた.すぐに資料が公開されると嬉しいんだけども🙏

aws-serverless.connpass.com

Serverless Updates

  • Lambda
    • CPU をより使えるように,メモリを最大 3GB まで設定できるようになった
    • Lambda の Go 対応は,あくまでまだ「プリアナウンス」段階
    • Lambda の同時実行可能数を関数ごとに設定できるようになった
    • Lambda のコードエディタが Cloud9 ベースになった
    • AWS Serverless Application Repository もリリースされた
  • API Gateway
    • API Gateway の VPC の統合サポート
  • AWS Step Functions
    • State Machine の Update ができるようになった

Lambda は実際にサービスで運用していることもあって,早めにキャッチアップをしていたので,認識と大きな差はなかった.Go 対応は個人的に嬉しくて,すぐにリプレイスできる機能があるので,正式リリースを楽しみに待っている.あと AWS Serverless Application Repository はまだあまりイメージが湧いてないけど,公開されているサーバレスアプリケーションのスタックをサクッと動かせる感じ?「Deploy to Heroku」ボタンのような?API Gateway のリリースは VPC の中で起動できるという意味ではなく,VPC の中に起動した NLB にバックエンドの処理を流せるようになったという意味で,これも嬉しい機能だ.

AWS AppSync

  • 現在はまだパブリックプレビュー中
  • データソースとして,DynamoDB / Amazon ES / Lambda 関数をサポートしている
  • Cognito で認証をすれば,認証系のエンドポイントを叩くこともできる
  • GraphQL の特徴はクライアント側で呼び出すスキーマを定義できること
  • AppSync ではサブスクリプションもできるので,リアルタイムにデータを更新することができる
  • サブスクリプションは,内部的には WebSocket で通信をしている

まだパブリックプレビュー中で,申し込んでもまだ試せない人もいるようだった.AppSync 良さそうだなと感じたのと同時に,そもそも GraphQL が良さそう.僕自身がフロントもネイティブも書く機会がほとんどないけど,GraphQL の勉強がてら,試してみたくなった.GraphQL で言うと,Rebuild.fm #193 で導入事例の話があって,すごく参考になるので合わせて聞いてみると良いかと.

rebuild.fm

AWS Fargate

  • Fargate
    • 「Fargate は計算リソースの使い方を根本的に変える」という表現がカッコ良かった
    • リソースベースの課金になるので,コスト効率も上がる
    • awsvpc ネットワークモードでは,タスク(コンテナ)ごとに ENI を持つことができる
    • リソースの組み合わせを選択する(全部で50種類ぐらいある)
    • 秒単位の課金になる
    • 99.99% SLA も発表された
    • Fargate に対応したタスク定義が必要
  • EKS
    • Kubernetes のワークロードの 63% は AWS の上で動いている
  • Fargate と Lambda の使い分けは西谷さんのツイートが参考になる
  • コンテナ関連の re:Invent セッション動画もある(記事の一番下に載せておく)

既に本番環境のワークロードに ECS を導入してるけど,コンテナインスタンスを意識する必要があるので,オートスケーリングとサービスオートスケーリングを調整するあたりが少し難しかった.そういう背景を考えると,Fargate は最高という気がするし,より気軽にコンテナをスケールできるので,運用も楽になる.コスト面はもう少し検討が必要で,リソースベースになることにより,コンテナインスタンスを上げっぱなしにしていたときよりも高くなってしまうケースはありそうだけど,ほとんどのケースでは下がりそう.re:Invent のセッション動画もオススメされていたので,これは見てみる.

AWS Cloud9

  • 30分間使わないと,自動的に落ちるので,コスト削減ができる
  • AWS Cloud9 で Lambda Function を選択すると,リモートからインポートすることができる
  • SAM Local も入っているので,開発も簡単に行える
  • Shared With You のメニューから,他人の AWS Cloud9 にアクセスすることもできる

通常の Cloud9 は約1年ほど Rails 開発で使っていて慣れていたので,AWS Cloud9 の I/F や,Lambda コンソールのリニューアルは特にハマる点はなかったけど,AWS Cloud9 を使うために EC2 を起動しないといけないというのは改善の余地がありそうな気がした.そこもフルマネージドにして欲しい気がする.あと,プログラミング初学者が Cloud9 を使って勉強するというシチュエーションが少なからずあり,そういう人たちが Cloud9 のために AWS アカウントを取得するというプロセスは,重いなぁ...という感覚もある.Cloud9 は東京リージョンじゃなくても大丈夫とのことで,Lambda の開発環境として導入してみたいと思う.

ML Services

  • Amazon Comprehend
    • 日本語はまだ未対応
    • エンティティとキーフレーズを自動抽出できる
    • 感情分析(ポジネガ)もできる
    • API だけじゃなくて S3 のファイルも解析できる
  • Amazon Translate
    • 文章の翻訳に特化したサービス
  • Amazon Rekognition Video
    • 今まであった Rekognition の動画版
    • 動画を分析して,登場人物にタグ付けなどができる
  • Amazon Transcribe
    • 音声をテキストに変換するサービス
    • コールセンターなどで活用できる

最近の機械学習関連のトレンドを全然キャッチアップできてなく,SageMaker も含めて概要レベルの理解しかできていない(ヤバイ!).ただ個人的には大学院時代に自然言語処理 (NLP) の研究をしていたので,Amazon Comprehend はすごく気になるし,日本語対応したらすぐ試してみたいと思う.当時はニュース記事をデータソースとして,MeCab と ChaSen を活用してポジネガ判定や意味推論などをしていて,夜間バッチでガリガリ動かしていたので,最近は本当に便利になったなぁーという気持ちもある.

参考

re:Invent で発表されたアップデートで Launch Templates は既に試して記事を書いた.結構便利で,検証用のインスタンスをサクッと立てるときにも使っている.参考になれば!

kakakakakku.hatenablog.com

関連レポート

dev.classmethod.jp

muziyoshiz.hatenablog.com

コンテナ関連の re:Invent セッション動画

全部見ないと!

www.youtube.com

www.youtube.com

www.youtube.com

www.youtube.com

www.youtube.com

実は便利な Redash の「アラート機能」

今日は「Redash Advent Calendar 2017」11日目の記事として,初心者向けに,Redash のアラート機能を紹介したいと思う.

qiita.com

Redash Advent Calendar は既に7日目にも記事を書いた.ハンズオン資料には今回紹介するアラート機能も含めているので,是非合わせて見てもらえると!

kakakakakku.hatenablog.com

アラート機能

「データ可視化ツールとして」 Redash を活用している人は多いと思うけど,アラート機能はそこまで普及してないように感じる.データを可視化するだけではなく,値が異常値に達した場合にアラートを通知することもできるので,「業務データのモニタリングツールとしても」 Redash を活用できる.さぁ,今すぐ試してみよう!

公式ドキュメント

仕様などは,公式ドキュメント(最近ドメインが変わった)に詳しくまとまっている.

help.redash.io

ポイントとなる部分を箇条書きにしてみた.

  • パラメータ付きクエリはアラート機能で使えない(特定のクエリを定期的に実行してモニタリングをするため)
  • アラートの通知先は全部で4種類ある
    • Email
    • Slack
    • HipChat
    • Webhook
      • IFFFT など,好きなように連携することもできる
  • アラートの状態は全部で3種類ある
    • TRIGGERED ... アラートに設定した閾値を超えた状態
    • OK ... アラートに設定した閾値を超えていない状態
    • UNKNOWN ... まだクエリの実行ができていない状態
  • 再通知のハンドリングは Rearm に設定する
    • ブランク ... ステータスに変化があったときに1度だけ通知する
    • 秒数 ... ステータスが TRIGGERED になっているときに,指定した秒数ごとに再通知を行う

Slack Incoming WebHooks

今回は Slack を通知先にして紹介する.まずは,Slack で Incoming WebHooks の設定画面を開く.基本的には Webhook URL が取得できれば良いけど,以下も合わせて設定しておくと便利.

  • Customize Name を「Redash Alerts」など,すぐわかる名前にしておく
  • Customize Icon に Redash のアイコンなどを設定しておく

f:id:kakku22:20171210035230p:plain

Alert Destination

次は,Redash の設定画面から通知先を登録する.右上にある設定アイコンをクリックし,Alert Destination の登録画面に遷移する.既に Slack Incoming WebHooks 側に設定をしているため,ここでは Slack Webhook URL を設定するだけで良い.設定を上書きすることもできる.

f:id:kakku22:20171210035249p:plain

クエリに定期実行の設定をする

詳しくはハンズオン資料を見てもらうとして,アラート機能を使う場合は,モニタリング対象にするクエリを定期実行する必要がある.よって,クエリの設定で Refresh Schedule を設定する.

アラートを設定する

最後はアラートを設定する.設定項目は大体見ればわかると思うけど,Op は以下の3種類から選ぶ必要がある.あと,右側にある Notifications で,通知先を選択する.複数の通知先に通知することもできる.

  • Op = Operator
    • greater than ... 閾値より大きい場合
    • less than ... 閾値より小さい場合
    • equals ... 閾値と一致する場合

f:id:kakku22:20171210035302p:plain

すると,Slack に通知ができる.

f:id:kakku22:20171210035313p:plain

複数の閾値を考慮する

もし,複数の閾値を考慮してアラートを通知したい場合は,クエリ側で閾値のチェックを用意し,もし 1 が返ってきたらアラートを通知するという工夫で回避することができる.これは公式ドキュメントにも書かれている.もしくは Python Datasource などを活用して,カスタムクエリを作ってしまう方法もあると思う.

help.redash.io

残念なところ

現状だと,Slack に通知される情報が少ないため,実際にクエリ結果を見に行く必要がある.例えば「閾値」と「トリガーした値」も通知するなど,Slack を見るだけで,最低限の状況がわかるようになれば,より便利に使えるとは思う.

まとめ

  • Redash は「データ可視化ツールとして」だけではなく「業務データのモニタリングツールとしても」活用できる
  • Email / Slack / HipChat / Webhook に通知できる
  • Rearm を設定すれば,再通知のハンドリングもできる

引き続き Redash Advent Calendar 2017 を盛り上げていきましょ!

GitHub 新作パーカー : Reflective Hoodie を安く購入した

11月に発売された GitHub 新作パーカー : Reflective Hoodie が欲しくて,3年振りに GitHub Shop で購入してみた.予想以上に安く,スムーズに購入できて驚いたので,紹介も兼ねて整理しておこう.

3年前を振り返る

3年前に GitHub Shop で購入したときに「送料と税金が高すぎたり」「二重決済になって揉めたり」して,ツラかった過去があり,その後は GitHub Shop で購入しないようにしていた.詳しくはブログ記事に書いてある.ただし,購入した GitHub グッツは今もずっと愛用していて,本当にカッコイイ!

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

購入

今回は計3点を購入した.GitHub パーカーは本当に暖かくて冬には重宝するからオススメ!(黒もよく着てる)

金額

まず,GitHub Shop では Free shipping (over $75) になるため,購入する場合は $75 を超えるように購入するのをオススメする.さらに今回は期間限定のクーポンコードも適用して 30% 割引になった!ちなみに GitHub 公式 Twitter を見るとクーポンコードを公開している場合があるため,定期的に見ておくと良いかと.

結果的に3点を購入して $94.5 となり,非常に安く購入できた.

f:id:kakku22:20171210015711p:plain

配送

予定より1日早く,たった8日間で配送された.3年前も9日間で配送されていて,海外輸送も安定していると思う.

  • 2017/11/26 (日) 購入
  • 2017/12/04 (月) 配送完了

まとめ

  • 3年振りに GitHub Shop で購入をした
  • $75 を超えるように購入すると配送料が無料になる
  • 公式 Twitter に出るクーポンコードを使うと安く購入できる
  • Reflective Hoodie を着て最高のエンジニアリングをするぞ!

関連記事

The GitHub Blog には技術情報だけじゃなく GitHub Shop の新発売情報も流れてくるから最高に便利!

github.com

re:Invent 2017 で発表された Launch Templates を使って簡単にインスタンスを起動する

re:Invent 2017 で発表されたアップデートの中で,比較的地味ながら,個人的に嬉しかった機能が「Launch Templates」だった.簡単に言うと「インスタンスの起動オプションをテンプレート化して管理することができる機能」と表現できる.対象はオンデマンドインスタンスだけではなく,オートスケーリングでも使えるらしく,さっそく試してみた!

なぜ嬉しいか

正直言って,インスタンスの作成で管理コンソールをポチポチする場面がまだあって,CloudFormation / AWS CLI などに移行できないような環境もある.そういうときに,管理コンソールをポチポチする手順書を作ったり,CLI のオプションを Wiki にまとめたりするんだけど,属人化する感覚があるし,オペレーションミスが起きる可能性もあるので,そのリスクを軽減できる「Launch Templates」は非常に助かるなーと思っている.そういう需要が多いってことなのかも.

公式ドキュメントを読んだ

試す前に公式ドキュメントをザッと読んで,ポイントを洗い出した.

  • 起動テンプレートにバージョンを付与することができる
    • 自動的にバージョンが割り当てられる
    • デフォルトバージョンという概念がある
  • 起動テンプレートに制限がある
    • リージョンごとに最大1000個まで作れる
    • 起動テンプレートあたり,作れるバージョンは10000個まで
  • 起動テンプレートに設定するオプションは任意で,設定しても良いし,起動時に設定しても良いし,起動時に上書きしても良い
    • ただし,起動時に起動オプションを無効化することはできないため,その場合は起動テンプレートで設定しないでおく
  • 起動テンプレートを保存するときにバリデーションは行わないため,起動時にエラーになる場合がある
  • IAM ポリシーで,操作できる起動テンプレートを詳細に制限することもできる

docs.aws.amazon.com

テンプレートを作る

管理コンソールから「EC2 → Launch Templates」で,設定画面を開くことができる.設定画面としては,あまり凝った感じではなく,項目がズラリと並んでいる感じだった.テンプレートとして設定できる項目はドキュメントに載っている通りでかなり多く,例えば以下などがある.重要なのは「テンプレート名以外は必須ではない」という点で,共通化が必要な部分だけを設定しておくことができる.

  • Launch template contents
    • AMI ID
    • Instance type
  • Network interfaces
  • Storage (Volumes)
  • Tags
  • Security groups
  • Advanced Details
    • IAM instance profile
    • User data

f:id:kakku22:20171208004602p:plain

ただし,設定画面がシンプルすぎて,入力補完などもなかったため,このあたりは改善できそうな気がする.例えば「Key pair name」や「セキュリティグループ」は,存在する候補の中から選べるようになっていないと間違える可能性があるけど,ドキュメントにも以下のように書いてあるので,間違えないように,意識的に正しく設定をする必要がある.とは言え,最低限のバリデーションはして欲しいかなー.

Launch template parameters are not validated when you create the launch template. Ensure that you specify the correct values for the parameters and that you use supported parameter combinations.

f:id:kakku22:20171208004617p:plain

テンプレートから起動する

あとは,インスタンスを作成するときに「テンプレートからインスタンスを起動する」ボタンを押して,テンプレートを修正しながら最終的な項目を決めていく.なお,ここでテンプレートを修正しても,テンプレートには反映されないため,注意すること.このままインスタンスを起動することができるため,ポチポチする量が圧倒的に減った!

f:id:kakku22:20171208004638p:plain

ただし,インスタンスを起動しようとしたら,以下のようなエラーが出ることがあったので,テンプレートの修正と,インスタンスの起動を何度も繰り返す必要があった.

  • The parameter iops is not supported for gp2 volumes.
  • Parameter encrypted is invalid. You cannot specify the encrypted flag if specifying a snapshot id in a block device mapping.

AWS CLI からテンプレートを使って起動する

起動テンプレートがあれば,CLI で簡単にインスタンスを起動することができる.CLI を最新版にすると --launch-template オプションが使えるようになるため,ここに LaunchTemplateId を指定するだけで良い.もしデフォルトバージョン以外で起動する場合は Version も指定する.圧倒的に簡単になった!

$ aws --version
aws-cli/1.14.5 Python/2.7.13 Darwin/15.6.0 botocore/1.8.9
$ aws ec2 run-instances --launch-template '{ "LaunchTemplateId": "lt-11111111111111111" }'

http://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html

バージョンを消す

起動テンプレートを実際に作ってみるとわかるけど,バリデーションが行われないため,インスタンスを起動しようとしてテンプレートがエラーになることが非常に多かった.なので,エラーになるバージョンが大量にできることになり,これは消さないと事故に繋がってしまう.管理コンソールからバージョンを選んで消すことができる.

また,珍しく便利だなと思ったのは「AWS CLI ならこうやって実行すれば良いよ」という「コマンドサンプル」が管理コンソールに表示されている点だった.今までこんな画面あったっけ?実際に試してみたら,問題なく表示されているコマンドでバージョンを消すことができた.

f:id:kakku22:20171208004909p:plain

オートスケーリングで使う

起動テンプレートは,オートスケーリングでも使えるとのことだったので,Auto Scaling Group の作成時に起動テンプレートを指定してみたけど,うまく動かなかった.詳しくはドキュメントに載っているけど,オートスケーリングで起動テンプレートを使う場合は「テンプレートを完全に作っておく」必要がある.設定を上書きする自由度がないとも言える.

You must ensure that your template includes all parameters required to launch an EC2 instance.

docs.aws.amazon.com

それは仕様として良いとは思うけど,Auto Scaling Group の保存時に出るエラーが完全に固定で,起動テンプレートのどこにミスがあるのか判断できず,かなり厳しかった.エラー内容を詳細に表示するようになると嬉しい.

f:id:kakku22:20171208005034p:plain

まとめ

  • re:Invent 2017 で「起動テンプレート (Launch Templates)」が発表された
  • 起動テンプレートを使うと,インスタンスの起動オプションをテンプレート化して管理することができる
  • 管理コンソールでも,CLI でも,簡単にインスタンスを起動できるため,オペレーションの負荷軽減だけではなく,ミスの削減にも繋がる
  • 起動テンプレートを保存するときに設定のバリデーションが行われないため,起動時にエラーになる場合がある
    • 実際に試してみて,かなりエラーが出たので,最初の試行錯誤はそこそこハマりそう

参考「re:Invent 2017 速報」

re:Invent 2017 で発表されたアップデートをキャッチアップするなら Black Belt の資料が1番良いと思う.12/1 の Black Belt にも参加したけど,その後も何度も見直してるし,非常にまとまっていて素晴らしかった.Launch Templates も P.64 に載っている.

www.slideshare.net