フレクトのクラウドblog re:newal

http://blog.flect.co.jp/cloud/からさらに引っ越しています

Heroku Metrics について

Heroku Adevent Calendar 2018 の18日目の記事です。17日目はsilverskyvicto さんの「Heroku のアドオンを自作する方法を見てみた」でした。

なお、15日目は弊社代表取締役 黒川 幸治 による寄稿でした。 Re:Invent から帰ってきてすぐにHerokuの記事書いて…となかなか精力的なエンジニアっぽい感じですが、肩書は社長です。

Heroku の強み

Heroku を使いはじめてから気づく魅力の一つに、標準で用意されている機能の豊富さが挙げられます。たとえば Postgres/Redisアドオンや Github とのインテグレーション、Pipelines/Heroku CIでのCI/CD、CLIAPIなどなど…

マネージドという言葉でIaaSプラットフォームもたくさんの機能を複雑な設定なく利用できるようになりましたが、開発者がプログラミングに集中する、それを実現するための万全な体制をプラットフォームが引き受ける。言うなれば引き算の美学は、まさしく Heroku が作り上げてきたものです。Heroku Metrics も同じ考え方の元で用意された標準機能の一つと考えられます。

今回紹介するHeroku Metrics は、ほとんど導入コストなしに、アプリケーションのパフォーマンス監視ないし必要に応じた通知を行える機能です。DynoやAddonのPlanを柔軟に変えられるためか、Metrics自体の機能をそのまま使わずにカットオーバーを目指しているプロジェクトを見かけることがあったので、どういうことができるんだろう・ひとまず使ってみましょうという思いから今回の記事を作成しました。

Heroku Metrics でできること

1. メトリクス監視

f:id:shns:20181216161802p:plain

アプリケーションの 「Overview」の左上部にある「Metrics」が Heroku Metrics によるモニタリングレポート。イメージとしては Zabbix なり CloudWatchのダッシュボードに近いと思いますが、エージェントを設定したりダッシュボード自体を作る必要はなし。いくつかの手順を踏むだけで使えるようになります。

以下は、いくつかのダッシュボードの例です。管理者用サイト、マイページのデモサイト、ショッピングサイトと用途はそれぞれ。develop, staging, production の違いだったり、JVM , PHP, Ruby など言語の違いによってもある程度これらの数値は変わってきます。いずれにしても、アプリケーション開発者はほとんど何も実装や設定をせずに使い始めることができます。

f:id:shns:20181217105422p:plain f:id:shns:20181217105438p:plain f:id:shns:20181217105452p:plain

メトリクス

以下のメトリクスが見られます。はじめは Events あたりで Platform のイベントと、Dyno restart などを見ながら、それ以外のメトリクスの動き方をじっくり眺めるのが良いんじゃないかと思います。

  • Events
  • Memory Usage
  • Response Time
  • Throughput
  • Dyno Load

JVMメトリクス

アプリケーションのRuntime によって追加のメトリクスも用意されていて、JVM だと以下も追加で閲覧可能。

  • Heap Memory Usage
  • Non-Heap Memory Usage
  • Aggregate Time Spent in Garbage Collection
  • Aggregate Garbage Collections

設定の仕方

前述の通り、設定自体はほとんどすることがなく、 Dynoが動いていればダッシュボードに Metrics の情報が表示されるようになります。

対象のDynoの選択

f:id:shns:20181216170741p:plain

上の選択リストで対象のDynoを選択。

メトリクス期間の選択

f:id:shns:20181216170730p:plain

こちらの選択リストでメトリクスの期間を選択します。選べるのは「過去2時間/過去24時間/24~48時間前/48時間前〜72時間前/過去3日間/過去7日間」のいずれか。Cloud Watch が15ヶ月くらいだったと思いますが、稼働中だったりサービス稼動目標があるアプリなんかだとよほど遡及せざるを得ない理由が無い限り、そこまでの期間は必要ないですね。

メトリクスの設定

f:id:shns:20181216170327p:plain

歯車アイコンからメトリクスの設定が可能で、ダッシュボードの見た目だったりRuntimeごとのメトリクスをここで有効化します。GAになっているJVM以外にも、2018/12時点で Public Beta の Ruby / Node.js。Dev Center の Getting Started 通り、適宜 push して様子を見ていればいつの間にかメトリクスに上がってくるようになります。

アラート(閾値・通知方法)の設定

「Configure Alerts」 から、Response Time と Failed Requestsについてはしきい値を設定して、超えた場合にメール通知を行うことも可能です。

f:id:shns:20181216170313p:plain

AWS あたりだと、一度 SNS に渡してから LambdaなりSQSなりに繋げることが多いと思いますが、こちらは「アプリのMember全員に送信」「5通までの任意のメールアドレス」あとは PagerDuty に一度渡してポリシー適用というのが可能です。投げ先としては運用チームのメーリングリストなり、SlackのEmailAppを設定済みの監視Channelなりを選ぶのがシンプルだと思います。

ちょっとだけ注意したいのは、Addonをいくつか使っていると通知系が渋滞気味になるので、ちゃんと通知系の設定の粒を揃えておくべきということです。たとえばNewRelic/PagerDuty/Bugsnag/PapertrailとHerokuMetricsでそれぞれ通知の系があるのであれば、通知やサマリー送付などの頻度・条件を揃えておくか、ひと目でわかるように一覧化しておきましょう。時間差があると障害対応時に錯綜することがあるので。

ユースケース

1. 本番の稼動監視

アプリケーションの運用保守用途に使います。 PagerDutyやPingdom、Bugsnagと組み合わせることもありますが、基本的には Alert 設定までは必須で。設定先としては、上に挙げたような、監視用MLへの通知、Slackへの通知。

Alert の時間間隔は「1分/5分/10分」から選べますが、連携システムがある場合はそちらに合わせることが多いです。AWS側が詳細モニタリングを有効化しているなら、1分に合わせたり、など。

上に書いたメトリクス一覧のうち、見ることが圧倒的に多いのは Events と Throughput 。 Memory Usage とかは本番稼働後というよりは設計/実装時のサイジングの検証時に見ることが多いです。まず Events で事象や時系列を確認したら、 Throughput をみながら、問題箇所を特定していきます。

ポイントとしては、プラットフォーム/アーキテクチャレイヤーでの解決が可能かどうかの切り分けをすること。

もしDynoやAddonのPlanを変えてもエラーが出続ける場合は、ソースコードのロジックに何か問題がある場合があります。コードレベルの問題特定だったら、 NewRelic に任せましょう。…というと敷居が上がりそうなのですが、Heroku標準でここまでできている部分がほとんどで学習コストがほぼほぼゼロと言って良いものなのと、Heroku Metrics と NewRelic で役割分担ができるので、そこまで大変ではないと思います。RailsだとScout使うと良いって話もあるのですが、HerokuMetricsとNewRelicで慣れてしまっているならそれでも良いし、bullet とか特定用途で結構Gem入れちゃってたりすることもあると思うので、うまい棲み分けが正直知りたいところ。

2. 非機能系テスト用

パフォーマンステストと監視テスト、障害復旧テストあたりで使います。stagingまたはtest用環境を用意して、本番想定の状態でテストを行い、しきい値が適切か、きちんとアラートが飛ぶか、または通知後の復旧手順が正しく踏めたかを検証する際に利用します。

なお、必須ではないと思います。ミニマムプロジェクトや検証用途では必ずしも非機能周りはスコープになるとは限らないし、Heroku の拡張性や柔軟性の高さから、順次考えていけばよい、その時に設定すれば良い、という考え方もできるので。ただ、Dynoのコレクションについてはメモリやネットワーク、GPUなり特化型のインスタンスが用意されているというよりは事前定義済みのプランからの選択になるので、スケールアップ/ダウンの勘どころは IaaS と比べて少し変わってくるかなと思ってます。

最後に

cloud.flect.co.jp

  • 早く容易に導入ができる(インフラ基盤、ミドルウェアまで提供されているため)
  • 柔軟かつ早いスケーラビリティが実現できる
  • 運用が容易にできる
  • Salesforceとの親和性がよい 等々

Heroku Metrics は縁の下の力持ちな存在として、Herokuでのアプリケーション運用を支える重要なサービスであり、黒川が書いたようにHerokuを使う価値をわかりやすく体現した存在であると思います。簡単に使い始められるので、ぜひ使ってみてください。

Herokuのビジネス的な利用価値

Herok Adevent Calendar 2018 の15日目の記事です。

はじめに

はじめまして、フレクト代表取締役の黒川です。

フレクトはHeroku、SalesforceAWSのパートナーとして、IoTやAIなどデジタルサービスの構築をご支援しているマルチクラウド・インテグレーターです。 そしてB2Bのリアルタイム車両管理「Cariot」をSaaSで提供していてます。

Herokuは2012年から利用していて、当時、TV番組連動のWEB・モバイルサイトを3週間の短期間で、かつ高い性能要件を満たしてリリースできたのは、Herokuだからこそ成せる業として社内で語り継いでいます。(語り継がれているわけではありません。)

またオフィシャルな「Heroku実践入門」のトレーニングカリキュラムの作成や講師も担当していました。(途中からSalesforce社にバトンタッチして今はやっていません。)

もちろん現在でもHerokuを広く活用している会社がフレクトになります。

  

HerokuとAWS

さてそんなフレクトでも現場においてHerokuとAWSの選定は議論になるところです。 案件においてSalesforceのインテグレーションがあればHeroku、顧客の指定があればそちらのクラウド、またHerokuもAWSも適材適所で使い別けてマルチクラウド環境で組み合わせをするといったことも多々あることです。

そこでHerokuを使うビジネス的な価値について、AWS re:invent 2018の「How Modern Dev Teams Build on Salesforce Heroku and AWS」セッション資料を引用しながらご紹介します。

まず言わずもがなではありますが、HerokuはAWS上で提供されているPaaSです。多くのAWSサービスをHerokuも利用しています。

f:id:flect_kurokawa:20181214191607p:plain

f:id:flect_kurokawa:20181214191623p:plain

ちなみにAWS re:invent 2018の期間中だけでもAWSのサービスリリースは100以上もありアップデートがすこぶる早いです。 もちろん全てのサービスを抑えることは困難ですが、部分的でも最新のサービスをキャッチアップし続けることは、それはそれで大変です。 そもそもAWSを利用する際は、インフラ設計・実装ができるリソースが必要になります。

ではHerokuを使う価値は、

f:id:flect_kurokawa:20181214235240p:plain

  • 早く容易に導入ができる(インフラ基盤、ミドルウェアまで提供されているため)
  • 柔軟かつ早いスケーラビリティが実現できる
  • 運用が容易にできる
  • Salesforceとの親和性がよい 等々

Herokuは開発・運用におけるエンジニアのリソースをアプリケーション開発に注力することができる、また生産性を高めることができる環境と言えます。エンジニアにとっても顧客にとっても価値があるので、要件見合いとはいえ、これからも広く利用していきたいと思います!

  

最後に

Dreamforce 2018期間中に、縁(訳?)あってBiz側の人間ながら記事投稿させていただくことになりました。 Tech内容ではありませんが、ご容赦ください。 またこのような機会をいただけたことに社員、Herokuのみなさまに感謝!

フレクトが行くAWS re:Invent 2018 Day. 2

はじめまして、CI事業部の山本です。
初めての投稿です。
簡単に自己紹介いたしますと、エンジニアとしてフロントエンドとバックエンド両方書いています。
最近だとVue + Ruby on Railsで開発し、AWS ECSをFargate上で動かしています。
そのため、今回のreInventではコンテナ技術、特に来るべきTokyoリージョンでのEKSに備えてKubernates関連のセッションを中心に聞いています。

続きを読む

フレクトが行くAWS re:Invent 2018 Day. 1 〜黄金の風〜

こんにちは。 Cariot事業部の遠藤です。

ブログでは2回目の登場になります。ちなみに前回の記事はこちら(↓)

Jenkins × AWS CodeBuild × GitHubで複数コンテナを利用したビルドを試してみた - フレクトのクラウドblog re:newal

さて!
絶賛賑わいを見せている、ラスベガスで開催中のre:Invent 2018ですが、フレクトからは今年は4名、参加しています。

初日が終わったので、感想を書いていきますね(現地時間23:00)。

続きを読む

Ubuntu 18コンテナイメージにmanページがインストールされなくて困ったという話

エンジニアの佐藤です。こんにちは。今回は自分の作業上のメモみたいな話です。

筆者は日常の開発作業をクラウドインスタンスで行うことがあります。開発環境はDockerコンテナで実装した仮想デスクトップサーバーです。

blog.flect.co.jp

この開発環境、少し前にUbuntu 18.04のコンテナイメージから作り直したのですが、、、なんとmanページが一切使えません。

$ man git
No manual entry for git

調べていくと、なんとmanページのインストールが、以下の設定によって全部スキップされていました。

$ cat /etc/dpkg/dpkg.cfg.d/excludes
# Drop all man pages
path-exclude=/usr/share/man/*

このpath-exclude指定している行をコメントアウトし、git, git-manを再インストールすると、問題は解決しました。

Ubuntu 18のコンテナは初期イメージサイズを大幅に削減したと言われていましたが、こういう過激な方法が取られていたとは知りませんでした。まぁ、Dockerは通常サーバーとして使われ、筆者のようにクライアントとして使っている人はあまりいないということなのでしょう。