SREサイトリライアビリティエンジニアリングを読もう

セクションナイン吉田真吾@yoshidashingo)です。

SRE本の原書が出てから早1年半が経ちました。原書はすでにオンラインで無料で読めるようになっています。

Google - Site Reliability Engineering

前回このブログでSREについて書いたのが、原書の出る1ヶ月くらい前ですね。

yoshidashingo.hatenablog.com

国内でもSRE部署の設置が急速に進んでますが、運用部門をSREと看板を掛け替えただけの劣化コピーが大量生産されていることも否めなかったりなかったり。

そもそもSREは、従来のシスアドではなくソフトウェアエンジニアです。そして、開発/運用の分断による必然的な対立関係をインセンティブ設計で統合し、サービスの成長と運用コストが比例しないように切り離すための組織設計であり、そのための技術ノウハウです。

今日は今週末発売される翻訳版SRE本「SRE サイトリライアビリティエンジニアリング」が発売されるにあたり、サーバーレスSPA本のつながりでオライリー様より一足早くご恵贈いただきましたので、夏休みの読書感想文にさせていただきます。休んでないけどね。

ちなみにこの本、原書を読んだとき(2016/3)にこりゃスゴい良い本だと思い、オライリーさんに翻訳させて欲しいとお願いしようと思い玉川さん(この本の翻訳者)に相談してみたんですね。

その際すでに玉川さんが翻訳することが決まっていたのですが、そのつながりがあった流れでサーバーレスSPA本の監訳につながったというエピソードがありました。

なので、この本が翻訳されるのを本当に今か今かと楽しみに待っていました。(まぁ後で玉川さんに色々エピソード聞いたらやっぱやらなくて良かったなと思ったんですけどね、超大変だったそうで...)

全体的な感想

  • 比較的ボリュームは多いが、Google SREのさまざまな原則とそこに行き着いた思考プロセスやエピソードが真摯な文章で書かれており、一文ごとに学びと共感があるため、つまづきポイントがありません。
  • 概要から各テーマにブレイクダウンしていく形式は取っているが、基本的には34編がそれぞれ独立したエッセイにもなっているため、いったん9章の原則まで読んだら、そこから中盤〜後半は自分が好きな順番で読める感じです。
  • よほど英語に慣れている人を除けば翻訳版で読むほうが明らかにいろいろと機微が理解できます。
  • 実践編ではGoogleの内部ツールもたくさん出てきて、かつそれらは別名のOSSとなって発展していっているものも多いので、自分たちのシステムでも実践がしやすいです。

特に翻訳版を買う意味として推したいのは、原書だと理解しにくい原則やポリシーに対する思考プロセスなど機微な情報が翻訳版だとしっかり読めるという点です。

原書を何回か通読しているにも関わらず、Google SREでよく紹介される「50%ルール」や「エラーバジェット」「徹底的な自動化」というようなキャッチーな原則の裏にある思考プロセスについてほとんど忘れているという反省からもこれは熟読したうえで実践しないとなという気持ちになりました。

いわゆる「文化」というのは組織において共通認識になっている思考プロセスによって形成されるものなので、これを正しく把握することで、「文化」というなんとなく曖昧な表現で終わらず、自分や自分のいる組織ではどういう前提を置いてITサービスマネジメントをするべきか、そのためにSREから学び実践できることはどの項目なのかということが決定できるはずです。

各章の概要

第Ⅰ部イントロダクションから第Ⅱ部原則の9章までが基本部分で、それ以降が各トピックごとのエッセーになっているので、いったんこのエントリーでは9章まで紹介してみます。

1章 イントロダクション

ここではSREが必要とされる背景とGoogle内での歴史、また「SREの信条」として、その要求プロセスごとの概要が記載されています。

上でも記載しましたがそもそもSREはシスアドではなくソフトウェアエンジニアであり、対立しがちな開発スピードとSLO達成の両立を実現するために組織として実践するのが「50%ルール」「エラーバジェット」「アラート通知を最小化するレジリエント指向な運用」「ロールアウトな変更管理」などです。

また、運用作業が50%を上回らないように「保証する」点や、SREがそもそもソフトウェアエンジニアとして採用されているということで、社内のキャリアパスとしてプロダクトのエンジニアと行き来ができるという点は人材戦略上としても非常に有益です。

運用作業が50%を超えない範囲にとどめ、運用作業の自動化や信頼性の高いフェイルオーバー方式の設計や実装に注力できるようにすることで、基本的にSREが面倒を見るシステムは定常作業のない、内部トラブルが発生した場合も自動的に素早くフェイルオーバーや切り離しが行われるようになり、実際に人による判断や作業を伴う作業を最小化することで、サービスの成長と運用作業量が比例しないように切り離されたチーム体制が構築できるように目指すのです。

また、そもそもそういった設計や実装ができるエンジニアが必要なので、採用プロセスはプロダクトのエンジニアと同様にソフトウェアエンジニアの採用をする必要があり、これはキャリアパスとして双方が比較的簡単に行き来できるということです。

つまりSRE本はエンジニアのための大規模システムを高速で開発してかつ安定的に運用するためのノウハウ本であると同時に、現代のマネージャーがどういう課題認識とそれに対する思考プロセスでIT組織運営をすべきかを示している本でもあることを示しています。

また、ポストモーテムについても概要説明がありますが、この障害報告書は巻末にサンプルも掲載されており、これを使うことで何が起きたか正確に記録し、どう対応したか、今の状況はどうか、根本原因はなにか、どう取り組むかを記録するようにしています。

重要なのは原因を探って改善していくことに関して非難をすることは無意味なのでいっさいしないことが約束されていること。また、ページャーが使われたか(アラートが鳴ったか)どうかに関わらず、むしろならなかったインシデントのほうが、モニタリングできてなかった根本的ななにかが潜んでいるはずなので大事であるとされている点です。

2章 SREの観点から見た Googleのプロダクション環境

2章ではGoogleのデータセンター群上にBorgという分散クラスタオペレーティングシステムでサービスのリソーススケジューリングを行っていることや、DC内のスイッチとしてJupiterという独自の仮想スイッチを実装し1.3Pbpsの帯域を実現している話、Colossusという分散ストレージ管理サービス、モニタリングシステムBorgmonなど、Google独自のソフトウェアの紹介がされています。

また、こういったソフトウェアを使ったサービスがどうデプロイされて運用されるかを知るためのサンプルサービスとしてシェークスピアというサンプルのサービスが用意されていることも記載されています。これを例にしてGoogleにおけるDNSやロードバランサ、バックエンドサーバーの動きが理解でき、本章以降でのこれらのソフトウェアの説明の理解の助けになります。

3章 リスクの受容

ITサービスマネジメントにおいては一般的ですが、リスクはすべてを取り除けば良いというものではなく、正しく把握したうえで管理するこtが大事です。でなければコストが無限に必要になるからです。

ここではコンシューマサービス/インフラサービスそれぞれにおいて、サービスリスクを計測し、その許容度を明らかにし可用性のターゲットレベルを定める方法を示しています。そのうえで、可用性の許容度をエラーバジェットとして扱います、これにより開発者とSREが同一のインセンティブのもとで活動できるようになるため、それぞれの相反する思惑を都度調整する必要がなくなるという仕組みです。

4章 サービスレベル目標

前の章ですでにSLOについての話が出ていますが、ここではその設定方法が記載されています。

基本的な考えとしては、SLOはエラーバジェット以上に達成しないようにすることも大事だということが大事と書かれています。利用者はSLOより実際の印象を優先してしまうので、常にSLO以上の稼働に安心してこのシステムに密に依存した連携システムができてしまったりすると、実際にダウンした場合の対応が大変なので、むしろそういった場合は定期的にダウンさせて依存関係を明らかにする必要があるとも。

SLOあるあるとして、SLOを決めるぞと気合を入れてしまって大量の項目を設定しまって辛くなるなどがありますが、SLOは最小にとどめようねと書いてあったり、SLOと違ってSLAには関係部署含めたペナルティがあるのでSLAは採用しない、あるいはSLOよりも緩い値を採用しようなどといったノウハウも記載されています。

5章 トイルの撲滅

自分が少し自分用に翻訳した際は「苦痛」と翻訳した「トイル」ですが、SREの文脈での定義はサービスの稼働に直接関係ない以下のような仕事を指します。「手作業」「繰り返される」「自動化できる」「戦術的(≠戦略的)」「長期的な価値を持たない」「サービスの成長に対して正比例している」

50%ルールのサービスの運用業務とエンジニアを切り離す話と同じで、結局このトイルはキャリアを停滞させたりモラルを低下させるなどという点でSREチームにとって悪であり、そのためのエンジニアリングとしてソフトウェアエンジニアを主体として自動化を行っていくべきということです。

6章 分散システムのモニタリング

6章にはモニタリングとアラートに関する原則がまとめられています。アラートはよく考えずに設定すると1つの事象に対して大量に通知がきてしまったり、ほぼ同じ通知内容なのにこちらは対応が必要でこちらは無視をしてよいというような非常に非効率的なものになりがちですよね。ここでの原則はそういったことを避けて効果的に対応ができるようにするための原則であり、非常に役に立ちそうです。

また、6.11.1には、BigTableのパフォーマンスイシューで大量のアラートによって真の対策に着手できなかった担当チームがSLOのターゲットを引き下げ短期的なパフォーマンス改善に加えて長期的な対策を取れるようにしたというエピソードが掲載してあり、文脈はそれますが、こういった内部事情を誠実に紹介してくれるのは非常に誠実だなと思いました。

7章 Googleにおける自動化の進化

7章はみんなだいすき自動化の章です。第Ⅱ部でも特に重要な章でしょう。この章の前までですでにサービスの成長と運用作業量を切り離す意味での自動化の必要性については何度も出てきてますが、この章ではそもそもの自動化の価値と、Google SREにおける自動化に対する姿勢の進化についてなどが書かれています。

まず自動化の価値は、手動と違った品質担保・再現性という意味での「一貫性」、対象を複数に拡張可能な「プラットフォーム」という点、手動では間に合わないような障害リカバリ時間を達成する「高速な修復」、フェイルオーバーやトラフィックのスイッチングといったもはや自動化があたり前である「素早いアクション」、そして自分だけでなくそのコードで関係者全員が労力を削減できる「時間の節約」です。

そして、自動化のためにグルーコードを持たなければならないシステムよりも、そもそもそれを保つ必要がないシステム、つまりシステム自身が自動的された機能を内包している状態を指向するのが進化です。それはたとえばデータベースにおいてロケーション間でのフェイルオーバーが手動で行われる状態から、SREがスクリプトを実行する段階、誰もがそのスクリプトを実行できるようになっている段階、データベースにスクリプトが内包されている段階、データベース自身が問題を検出して自動的にフェールオーバーする段階まで進化させる経過をたどります。

そしてこの章ではいくつかの自動化の実例を掲載しています。

Google Adsでは2008年にMySQLのインスタンスをBorg(分散クラスタオペレーティングシステム)上にデプロイできるようにし、2009年にはDeciderという自動F/Oデーモンを利用することで95%のF/Oを30秒以内に完了できるようにして、なんと運用タスクに費やす時間を95%削減でき、ハードウェアの利用率を60%も改善できたとのことです。

インフラストラクチャSREチームのクラスタのターンアップタスクについては、上記の自動化の進化の示すとおりのよい例です。クラスタが増えるごとに人手が必要だった状態から、クラスタ作成時の設定検証ツールProdTestという内部ソリューションを利用することで、設定ミスを見つけ出すユニットテストを実行する段階から、設定ミスをテストしNGなら自動で修復し再度テストするという状態になり、サーバーのデーモンプログラムでそれが自動実行される段階まで進化したそうで、1日に1000以上の変更が入り、1年でサービスなどが2倍に増える環境でも破綻しないターンアップタスクが実現できたそうです。

8章 リリースエンジニアリング

これもエンジニアリングで自動化されることの多い領域ですが、インシデントの7割が変更管理プロセスによって引き起こされるので、自動化によりビルド・デプロイの一貫性を保つことは有益です。

この章では、すでに広く一般的になったセルフサービスでデプロイできる仕組みから、ビルドプロセス内で利用されているコンパイラなどのツールのライブラリバージョンまで履歴管理することでいつでも過去のバージョンがビルドできるようにする密封ビルド方式でチェリーピックの管理をしている話や、変更〜デプロイまでの継続的ビルドや継続的テストのワークフローはRapidというシステムで一元的にパイプライン管理されているそうです。

また、リリースエンジニアリングのためのリソースは、後から改善しなければなるのは大変なので、プラットフォームやサービスの初期段階から優れたプラクティスやプロセスを適用しておくほうがトータルでコスト節約になるそうです。

9章 単純さ

さて、第Ⅱ部の最後9章は、ソフトウェアを単純に保つことが、信頼性を持たせるための前提条件であるという原則について完結に示しています。

1章にもあったとおり、開発者が得たいアジリティは安定性という観点で見れば不安定さを供給する原因になるため、つまりSREのアプローチは「アジリティと安定性のバランスを取る」ことです。実際には開発者のアジリティを上げることでバグが生じても素早く修正が反映できることで信頼性が高まります。

そしてソフトウェアを単純に保つためには不要なソースコードを削除し、APIを小さく単純に保ち、機能のモジュラー性を上げ、リリースを単純に保つ必要があると述べています。単純がゆえに非常に強力な指針だと思います。

第Ⅲ部、第Ⅳ部について

第Ⅲ部実践では、Borgmonを使った実践的なアラートの設計(10章)から、トラブルシューティングのケーススタディ(12章)や、過負荷に対するスロットリングやエラー/リトライ対策(21章)、分散合意を実装するためのアーキテクチャパターン(23章)など、エンジニアとして非常に有益な情報がたくさん載っています。

また、第Ⅳ部管理では、SREというチームを運営していくうえで有益な心がけ(29章)やミーティングの運営方法(31章)や、新たにサービスを受け持つときに上手にオンボードするためのエンゲージメントモデル(32章)などが示されています。管理職の人などはこちらを読むだけでもだいぶたくさんの知見が得られるはずです。

ここらへんはもう少しじっくり呼んで感想上げたいのでまた別の機会に細かい章単位で色々参考文献とかも調べながらやりたいと思ってます。

最後に

ということで、原書もいいけど翻訳版は機微まで追えてさらに超オススメですという感じです。

www.oreilly.co.jp

目次

目次を読むだけでもどんなことが書かれているか分かるようになっているため、かなり長いですが最後に目次を載せておきます。

1章 イントロダクション
    1.1 サービス管理へのシステム管理者のアプローチ
    1.2 サービス管理への Googleのアプローチ:サイトリライアビリティエンジニアリング
    1.3 SREの信条
        1.3.1 エンジニアリングへの継続的な注力の保証
        1.3.2 サービスの SLOを下回ることなく、変更の速度の最大化を追求する
        1.3.3 モニタリング
        1.3.4 緊急対応
        1.3.5 変更管理
        1.3.6 需要の予測とキャパシティプランニング
        1.3.7 プロビジョニング
        1.3.8 効率とパフォーマンス
    1.4 始まりの終わり

2章 SREの観点から見た Googleのプロダクション環境
    2.1 ハードウェア
    2.2 ハードウェアを「組織化」するシステムソフトウェア
        2.2.1 マシン群の管理
        2.2.2 ストレージ
        2.2.3 ネットワーク
    2.3 他のシステムソフトウェア
        2.3.1 ロックサービス
        2.3.2 モニタリングとアラート
    2.4 Googleのソフトウェアインフラストラクチャ
    2.5 Googleの開発環境
    2.6 シェークスピア:サンプルのサービス
        2.6.1 リクエストのライフサイクル
        2.6.2 ジョブとデータの編成

第Ⅱ部 原則
    Ⅱ.1 Google SREが推奨する参考文献

3章 リスクの受容
    3.1 リスクの管理
    3.2 サービスリスクの計測
    3.3 サービスのリスク許容度
        3.3.1 コンシューマサービスにおけるリスク許容度の明確化
        3.3.2 インフラストラクチャサービスのリスク許容度の明確化
    3.4 エラーバジェットの活用
        3.4.1 エラーバジェットの形成
        3.4.2 メリット

4章 サービスレベル目標
    4.1 サービスレベルに関する用語
        4.1.1 指標
        4.1.2 目標
        4.1.3 アグリーメント
    4.2 指標の実際
        4.2.1 サービスの提供者とユーザーの関心事
        4.2.2 指標の収集
        4.2.3 集計
        4.2.4 指標の標準化
    4.3 目標の実際
        4.3.1 目標の定義
        4.3.2 ターゲットの選択
        4.3.3 計測値のコントロール
        4.3.4 SLOによる期待の設定
    4.4 アグリーメントの実際

5章 トイルの撲滅
    5.1 トイルの定義
    5.2 トイルは少ない方が良い理由
    5.3 エンジニアリングであるための条件
    5.4 トイルは常に悪なのか?
    5.5 まとめ

6章 分散システムのモニタリング
    6.1 定義
    6.2 モニタリングの必要性
    6.3 モニタリングにおける妥当な期待値の設定
    6.4 症状と原因
    6.5 ブラックボックスとホワイトボックス
    6.6 4大シグナル
    6.7 テイルレイテンシに関する懸念(あるいはインスツルメンテーションとパフォーマンス)
    6.8 適切な計測の粒度の選択
    6.9 可能な限りシンプルに、ただしやり過ぎないこと
    6.10 原則のとりまとめ
    6.11 長期間にわたるモニタリング
        6.11.1 Bigtableの SRE:過剰なアラートの物語
        6.11.2 Gmail:スクリプト化された予測可能なレスポンスの手動送信
        6.11.3 長期的な視点
    6.12 まとめ

7章 Googleにおける自動化の進化
    7.1 自動化の価値
        7.1.1 一貫性
        7.1.2 プラットフォーム
        7.1.3 高速な修復
        7.1.4 素早いアクション
        7.1.5 時間の節約
    7.2 Google SREにとっての価値
    7.3 自動化のユースケース
        7.3.1 Google SREによる自動化のユースケース
        7.3.2 自動化のクラスの階層
    7.4 自分の仕事の自動化:何もかも自動化する
    7.5 苦痛の緩和:クラスタのターンアップへの自動化の適用
        7.5.1 Prodtestでの不整合の検出
        7.5.2 不整合の冪等な解消
        7.5.3 特化する傾向
        7.5.4 サービス指向のクラスタのターンアップ
    7.6 Borg:ウェアハウススケールコンピュータの誕生
    7.7 基本的機能としての信頼性
    7.8 自動化のすすめ

8章 リリースエンジニアリング
    8.1 リリースエンジニアの役割
    8.2 哲学
        8.2.1 セルフサービスモデル
        8.2.2 高速性
        8.2.3 密封ビルド
        8.2.4 ポリシーと手順の強制
    8.3 継続的ビルドとデプロイメント
        8.3.1 ビルド
        8.3.2 ブランチ
        8.3.3 テスト
        8.3.4 パッケージ化
        8.3.5 Rapid
        8.3.6 デプロイメント
    8.4 設定管理
    8.5 まとめ
        8.5.1 Googleだけに限った話ではない
        8.5.2 リリースエンジニアリングは初期の段階から始めよう

9章 単純さ
    9.1 システムの安定性とアジリティ
    9.2 退屈の美徳
    9.3 自分のコードはあきらめないぞ!
    9.4 削除した行の計測
    9.5 最小限の API
    9.6 モジュラー性
    9.7 リリースの単純さ
    9.8 単純な結論

第Ⅲ部 実践
    Ⅲ.1 モニタリング
    Ⅲ.2 インシデント対応
    Ⅲ.3 ポストモーテムと根本原因分析
    Ⅲ.4 テスト
    Ⅲ.4.1 キャパシティプランニング
    Ⅲ.5 開発
    Ⅲ.6 プロダクト
    Ⅲ.7 Google SREが推奨する参考文献

10章 時系列データからの実践的なアラート
    10.1 Borgmonの誕生
    10.2 アプリケーションのインスツルメンテーション
    10.3 エクスポートされたデータの収集
    10.4 時系列のアリーナにおけるストレージ
        10.4.1 ラベルとベクタ
    10.5 ルールの評価
    10.6 アラート
    10.7 モニタリングのトポロジーのシャーディング
    10.8 ブラックボックスモニタリング
    10.9 設定のメンテナンス
    10.10 10年が経過して

11章 オンコール対応
    11.1 イントロダクション
    11.2 オンコールエンジニアの日常生活
    11.3 バランスの取れたオンコール
        11.3.1 量におけるバランス
        11.3.2 質におけるバランス
        11.3.3 補償
    11.4 安心感
    11.5 不適切な運用負荷の回避
        11.5.1 運用の過負荷
        11.5.2 油断ならない敵:低すぎる運用負荷
    11.6 まとめ

12章 効果的なトラブルシューティング
    12.1 理論
    12.2 実践
        12.2.1 問題のレポート
        12.2.2 トリアージ
        12.2.3 検証
        12.2.4 診断
        12.2.5 テストと対応
    12.3 否定的な結果の素晴らしさ
        12.3.1 対策
    12.4 ケーススタディ
    12.5 トラブルシューティングを容易にするために
    12.6 まとめ

13章 緊急対応
    13.1 システムが壊れた際に行うこと
    13.2 テストによって引き起こされた緊急事態
        13.2.1 詳細
        13.2.2 レスポンス
        13.2.3 障害から分かったこと
    13.3 変更が引き起こした緊急事態
        13.3.1 詳細
        13.3.2 対応
        13.3.3 障害から分かったこと
    13.4 プロセスが引き起こした緊急事態
        13.4.1 詳細
        13.4.2 対応
        13.4.3 障害から分かったこと
    13.5 解決できない問題は存在しない
    13.6 過去から学び、繰り返さない
        13.6.1 サービス障害の歴史を残す
        13.6.2 大きな、むしろありそうもない問いかけをしてみよう
        13.6.3 予防的なテストのすすめ
    13.7 まとめ

14章 インシデント管理
    14.1 管理されていないインシデント
    14.2 管理されていないインシデントの詳細分析
        14.2.1 技術的な問題への極端な集中
        14.2.2 貧弱なコミュニケーション
        14.2.3 勝手な動き
    14.3 インシデント管理のプロセスの構成要素
        14.3.1 責任の再帰的な分離
        14.3.2 明確な司令所
        14.3.3 ライブインシデント状況ドキュメント
        14.3.4 はっきりとした引き継ぎ
    14.4 管理されたインシデント
    14.5 インシデントと宣言すべき場合
    14.6 まとめ

15章 ポストモーテムの文化:失敗からの学び
    15.1 Googleにおけるポストモーテムの哲学
    15.2 コラボレーションと知識の共有
    15.3 ポストモーテムの文化の導入
    15.4 まとめと改善の継続

16章 サービス障害の追跡
    16.1 Escalator
    16.2 Outalator
        16.2.1 集計
        16.2.2 タグ付け
        16.2.3 分析
        16.2.4 予想外のメリット

17章 信頼性のためのテスト
    17.1 ソフトウェアテストの種類
        17.1.1 伝統的なテスト
        17.1.2 プロダクションテスト
    17.2 テストの作成と環境の構築
    17.3 大規模なテスト
        17.3.1 スケーラブルなツールのテスト
        17.3.2 ディザスタのテスト
        17.3.3 速度の重要性
        17.3.4 プロダクションへのプッシュ
        17.3.5 予想されるテストの失敗
        17.3.6 結合
        17.3.7 プロダクション環境におけるプローブ
    17.4 まとめ

18章 SREにおけるソフトウェアエンジニアリング
    18.1 SRE内でのソフトウェアエンジニアリングの重要性
    18.2 Auxonのケーススタディ:プロジェクトの背景と問題の領域
        18.2.1 旧来のキャパシティプランニング
        18.2.2 Googleにおけるソリューション:インテントベースのキャパシティプランニング
    18.3 インテントベースのキャパシティプランニング
        18.3.1 インテントを示すもの
        18.3.2 Auxonの紹介
        18.3.3 要求と実装:成功と学んだこと
        18.3.4 認知の向上と採用の推進
        18.3.5 チームの力学
    18.4 SREにおけるソフトウェアエンジニアリングの推進
        18.4.1 SREにおけるソフトウェアエンジニアリング文化の構築の成功:採用と開発期間
        18.4.2 達成
    18.5 まとめ

19章 フロントエンドにおけるロードバランシング
    19.1 パワーは解答にあらず
    19.2 DNSを使ったロードバランシング
    19.3 仮想 IPアドレスでのロードバランシング

20章 データセンターでのロードバランシング
    20.1 理想的なケース
    20.2 不良タスクの特定:フロー制御とレイムダック
        20.2.1 健全ではないタスクに対するシンプルなアプローチ:フロー制御
        20.2.2 不健全なタスクへの確実なアプローチ:レイムダック状態
    20.3 サブセットの設定によるコネクションプールの制限
        20.3.1 適切なサブセットの選択
        20.3.2 サブセットの選択アルゴリズム:ランダムなサブセットの選択
        20.3.3 サブセット選択のアルゴリズム:決定的なサブセット選択
    20.4 ロードバランシングのポリシー
        20.4.1 シンプルなラウンドロビン
        20.4.2 最小負荷ラウンドロビン
        20.4.3 重み付きラウンドロビン

21章 過負荷への対応
    21.1 「クエリ /秒」の落とし穴
    21.2 顧客単位での制限
    21.3 クライアント側でのスロットリング
    21.4 重要度
    21.5 利用率のシグナル
    21.6 過負荷によるエラーへの対応
        21.6.1 リトライの判断
    21.7 接続によって生じる負荷
    21.8 まとめ

22章 カスケード障害への対応
    22.1 カスケード障害の原因及び回避のための設計
        22.1.1 サーバーの過負荷
        22.1.2 リソースの枯渇
        22.1.3 利用できないサービス
    22.2 サーバーの過負荷の回避
        22.2.1 キューの管理
        22.2.2 ロードシェディングとグレースフルデグラデーション
        22.2.3 リトライ
        22.2.4 レイテンシとタイムアウト
    22.3 起動直後の低パフォーマンスとコールドキャッシュ
        22.3.1 スタックは常に下っていくようにすること
    22.4 カスケード障害を引き起こす条件
        22.4.1 プロセスの停止
        22.4.2 プロセスのアップデート
        22.4.3 ロールアウト
        22.4.4 自然な利用の増大
        22.4.5 計画済みの変更、ドレイン、ターンダウン
    22.5 カスケード障害に備えるためのテスト
        22.5.1 テストによる障害の発生とその後の観察
        22.5.2 一般的なクライアントのテスト
        22.5.3 重要度の低いバックエンドのテスト
    22.6 カスケード障害に対応するためにすぐに行うべき手順
        22.6.1 リソースの追加
        22.6.2 ヘルスチェックが障害を引き起こさないようにする
        22.6.3 サーバーの再起動
        22.6.4 トラフィックのドロップ
        22.6.5 デグレーデッドモードへの移行
        22.6.6 バッチの負荷の排除
        22.6.7 問題のあるトラフィックの排除
    22.7 まとめ

23章 クリティカルな状態の管理 :信頼性のための分散合意
    23.1 合意を利用する目的:分散システムの協調障害
        23.1.1 ケーススタディ 1:スプリットブレイン問題
        23.1.2 ケーススタディ 2:人間の介入を必要とするフェイルオーバー
        23.1.3 ケーススタディ 3:問題のあるグループメンバーシップアルゴリズム
    23.2 分散合意の動作
        23.2.1 Paxosの概要:サンプルのプロトコル
    23.3 分散合意のためのシステムアーキテクチャパターン
        23.3.1 信頼性を持つ複製ステートマシン
        23.3.2 信頼性を持つ複製データストア及び設定ストア
        23.3.3 リーダー選出を利用する高可用性を持つ処理
        23.3.4 分散協調及びロックサービス
        23.3.5 信頼性を持つ分散キュー及びメッセージング
    23.4 分散合意のパフォーマンス
        23.4.1 Multi-Paxos:詳細なメッセージフロー
        23.4.2 読み取り負荷が大きいワークロードのスケーリング
        23.4.3 クォーラムのリース
        23.4.4 分散合意のパフォーマンスとネットワークのレイテンシ
        23.4.5 パフォーマンスに関する考察:Fast Paxos
        23.4.6 安定したリーダー
        23.4.7 バッチ処理
        23.4.8 ディスクアクセス
    23.5 分散合意ベースのシステムのデプロイ
        23.5.1 レプリカ数
        23.5.2 レプリカの配置
        23.5.3 キャパシティとロードバランシング
    23.6 分散合意システムのモニタリング
    23.7 まとめ

24章 cronによる分散定期スケジューリング
    24.1 cron
        24.1.1 イントロダクション
        24.1.2 信頼性という観点
    24.2 cronジョブと冪等性
    24.3 大規模環境における cron
        24.3.1 拡張されたインフラストラクチャ
        24.3.2 拡張された要求
    24.4 Googleにおける cronの構築
        24.4.1 cronジョブの状態の追跡
        24.4.2 Paxosの利用
        24.4.3 リーダーとフォロワーの役割
        24.4.4 状態の保存
        24.4.5 大規模な cronの実行
    24.5 まとめ

25章 データ処理のパイプライン
    25.1 パイプラインのデザインパターンの起源
    25.2 シンプルなパイプラインパターンでのビッグデータの初期の効果
    25.3 定期的なパイプラインパターンでの課題
    25.4 不均衡な負荷の配分によるトラブル
    25.5 分散環境における定期パイプラインの欠点
        25.5.1 定期パイプラインにおけるモニタリングの問題
        25.5.2 “Thundering Herd”問題
        25.5.3 モアレ負荷パターン
    25.6 Google Workflowの紹介
        25.6.1 Model-View-Controllerパターンとしての Workflow
    25.7 Workflowにおける実行のステージ
        25.7.1 Workflowの正しさの保証
    25.8 ビジネスの継続性の保証
    25.9 まとめ、そして終わりに

26章 データの完全性:What You Read Is What You Wrote
    26.1 データの完全性への厳格な要求
        26.1.1 データ完全性をきわめて高くするための戦略の選択
        26.1.2 バックアップとアーカイブ
        26.1.3 大局的な視点から見たクラウド環境の要件
    26.2 データの完全性及び可用性の管理における Google SREの目標
        26.2.1 データの完全性は手段であり、目標とするのはデータの可用性である
        26.2.2 バックアップシステムよりもリカバリのシステムを提供しよう
        26.2.3 データの損失につながる障害の種類
        26.2.4 深く、そして広くデータの完全性を管理することの難しさ
    26.3 データ完全性の課題への Google SREの対処
        26.3.1 データ完全性の障害の形態の 24種の組み合わせ
        26.3.2 第 1のレイヤー:論理削除
        26.3.3 第 2のレイヤー:バックアップと関連するリカバリの方法
        26.3.4 包括的な階層:レプリケーション
        26.3.5 テラバイト対エクサバイト:大きい「だけ」ではなくなるバックアップ
        26.3.6 第 3のレイヤー:早期の検出
        26.3.7 データリカバリがうまくいくことの確認
    26.4 ケーススタディ
        26.4.1 Gmail - 2011年 2月:GTapeからのリストア
        26.4.2 Google Music - 2012年 3月:暴走した削除の検出
    26.5 データの完全性に対する SREの一般原則の適用
        26.5.1 初心者の心構えを忘れないこと
        26.5.2 信頼しつつも検証を
        26.5.3 願望は戦略にあらず
        26.5.4 多層防御
    26.6 まとめ

27章 大規模なプロダクトのローンチにおける信頼性
    27.1 ローンチ調整エンジニアリング
        27.1.1 ローンチ調整エンジニアの役割
    27.2 ローンチプロセスのセットアップ
        27.2.1 ローンチチェックリスト
        27.2.2 収束と単純化の推進
        27.2.3 予想外のローンチ
    27.3 ローンチチェックリストの開発
        27.3.1 アーキテクチャと依存関係
        27.3.2 統合
        27.3.3 キャパシティプランニング
        27.3.4 障害の形態
        27.3.5 クライアントの動作
        27.3.6 プロセスと自動化
        27.3.7 開発のプロセス
        27.3.8 外部の依存対象
        27.3.9 ロールアウトの計画
    27.4 信頼性のあるローンチのためのテクニック
        27.4.1 逐次的かつ段階的なロールアウト
        27.4.2 機能フラグフレームワーク
        27.4.3 攻撃的なクライアントの挙動への対処
        27.4.4 過負荷時の挙動とロードテスト
    27.5 LCEの発展
        27.5.1 LCEチェックリストの進化
        27.5.2 LCEが解決しなかった問題
    27.6 まとめ

第Ⅳ部 管理
    Ⅳ.1 Google SREが推奨する参考文献

28章 SREの成長を加速する方法:新人からオンコール担当、   そしてその先へ
    28.1 自分の後継 SRE(たち)を雇用した後にすべきことは?
    28.2 初期の学習経験:混沌ではなく構造を提供する
        28.2.1 順序立てて積み重ねる学習の道筋
        28.2.2 単純作業ではなく、目的のはっきりしたプロジェクトの作業を受け持ってもらうこと
    28.3 優れたリバースエンジニアリングと柔軟な思考の育成
        28.3.1 リバースエンジニアリング:システムの動作を理解する
        28.3.2 統計的及び比較的思考:プレッシャーの下での科学的手法の活用
        28.3.3 即興の芸術家:予想外の事態への対応
        28.3.4 総合的なトレーニング:プロダクションサービスのリバースエンジニアリング
    28.4 上を目指すオンコール担当者の 5つのプラクティス
        28.4.1 障害への渇望:ポストモーテムの読み込みと共有
        28.4.2 ディザスタロールプレイング
        28.4.3 本物の破壊と修復
        28.4.4 徒弟関係としてのドキュメンテーション
        28.4.5 早期からの頻繁なオンコールのシャドウイング
    28.5 オンコールの担当、そしてその先:通過儀礼と継続的な教育の実践
    28.6 まとめ

29章 割り込みへの対処
    29.1 運用負荷の管理
    29.2 割り込みへの対処を決定する要素
    29.3 不完全なマシン
        29.3.1 認知的フロー状態
        29.3.2 1つのことをうまく行う
        29.3.3 真剣な解決策
        29.3.4 割り込みの削減

30章 SREの投入による運用過負荷からのリカバリ
    30.1 フェーズ 1:サービスの学習と状況の把握
        30.1.1 最大のストレス発生源の特定
        30.1.2 発火点の特定
    30.2 フェーズ 2:状況の共有
        30.2.1 チームのために良いポストモーテムを書く
        30.2.2 火事を種類別に並べる
    30.3 フェーズ 3:変化の推進
        30.3.1 基本からのスタート
        30.3.2 発火点の掃除の手助けを求める
        30.3.3 根拠を説明すること
        30.3.4 導く質問を投げかけること
    30.4 まとめ

31章 SREにおけるコミュニケーションとコラボレーション
    31.1 コミュニケーション:プロダクションミーティング
        31.1.1 アジェンダ
        31.1.2 出席者
    31.2 SRE内でのコラボレーション
        31.2.1 チームの構成
        31.2.2 効率的な作業のための手法
    31.3 SRE内でのコラボレーションのケーススタディ:Viceroy
        31.3.1 Viceroy登場
        31.3.2 課題
        31.3.3 推奨事項
    31.4 SRE外でのコラボレーション
    31.5 ケーススタディ:DFPにおける F1へのマイグレーション
    31.6 まとめ

32章 進化する SREのエンゲージメントモデル
    32.1 SREのエンゲージメント:その対象、方法、理由
    32.2 PRRモデル
    32.3 SREのエンゲージメントモデル
        32.3.1 代替サポート
    32.4 プロダクションレディネスレビュー:単純 PRRモデル
        32.4.1 エンゲージメント
        32.4.2 分析
        32.4.3 改善とリファクタリング
        32.4.4 トレーニング
        32.4.5 オンボーディング
        32.4.6 継続的な改善
    32.5 単純 PRRモデルの進化形:早期エンゲージメント
        32.5.1 早期エンゲージメントの候補
        32.5.2 早期エンゲージメントモデルのメリット
    32.6 進化するサービス開発:フレームワークと SREプラットフォーム
        32.6.1 学んだ教訓
        32.6.2 SREに影響を及ぼす外部要因
        32.6.3 構造的なソリューション:フレームワーク化に向かって
        32.6.4 サービスや管理に関する新たなメリット
    32.7 まとめ

第V部 まとめ

33章 他の業界からの教訓
    33.1 業界のベテランたち
    33.2 準備とディザスタテスト
        33.2.1 安全への徹底した組織的集中
        33.2.2 細部への注意
        33.2.3 余剰キャパシティ
        33.2.4 シミュレーションと実地訓練
        33.2.5 トレーニングと認定
        33.2.6 詳細な要求の収集と設計への集中
        33.2.7 広範囲にわたる多層防御
    33.3 ポストモーテムの文化
    33.4 反復業務と運用のオーバーヘッドの自動化
    33.5 構造化された合理的判断
    33.6 まとめ

34章 まとめ

付録A 可用性の一覧

付録B プロダクションサービスのためのベストプラクティス
    B.1 処理の適切な中止
    B.2 段階的なロールアウト
    B.3 SLOの定義はユーザーの観点で
    B.4 エラーバジェット
    B.5 モニタリング
    B.6 ポストモーテム
    B.7 キャパシティプランニング
    B.8 過負荷と障害
    B.9 SREチーム

付録C インシデント状況ドキュメントの例

付録D ポストモーテムの例

付録E ローンチ調整チェックリスト

付録F プロダクションミーティングの議事録の例

参考文献
訳者あとがき
索引

Shifterはどう生まれたのか?WCEU 2016からの1年間のお話

セクションナイン吉田真吾@yoshidashingo)です。

サーバーレスなWordPressホスティングサービスであるShifterを、そのプロジェクトの立ち上がりからエージェンシーとして支え、最近正式にデジタルキューブのメンバーにジョインした Daniel Olson にShifterの開発裏話なんかを聞いたのでここに掲載します。

f:id:yoshidashingo:20170803171623j:plain

位置づけとしては、以下のエントリーに対するアンサー的な感じで読んでもらえればよいかなと思います。

yoshidashingo.hatenablog.com

Shifterプロジェクト前夜

--- やぁダン。今日は小賀さんに誘われて参加した去年のWCEUの話から始めたいんだけど。

WordCamp Europe 2016 だね?

--- うん。AMIMOTOブースで終日接客していたんだけど、AMIMOTOはAMIベースのセルフホスティングもあるし、シングルインスタンスから負荷分散して大規模にスケールするマネージドホスティングサービスまであって、お客さんのニーズに合わせてユースケースやプランを説明をするのが難しかったんだよね。

ja.amimoto-ami.com

たしかに、EUにはたくさんのホスティングプロバイダーがあるけど、構成がこんなにたくさんはないよね。これだけ広く顧客ターゲットをカバーできるのもAWS上でサービスを展開しているからならではなんだけど、AWSに馴染みのないお客さんにとっては「そもそも"AMI"ってなんだろう?」とかなるよね。でも、他のプロバイダーが提供しているWordPressのホスティングサービスはリソースの割に価格が高かったりするから、リーズナブルなマネージドホスティングとして使っても自分でAMIからホストしてもコスパはいいはずなんだけど、ちょっとわかりにくかったかもしれないね。

--- そうなんだよね。あとはドメスティックのVPSを借りてるケースが多かったので、それで満足している人にはササりにくいなって。

数百万PV以上のスケーラビリティが必要な大企業向けに訴求しても良かったかも。安価なVPSにホスティングしている人だと、こっちでもDigitalOceanとかにホストしてるって話をよく聞くんだ。でもDOとAWSだと運用方法がまったく違うからね。

--- たしかに。それでね、ここからShifter誕生の話なんだけど、そのときにすでに僕らはサーバーレスの概念がこのWordPressの世界でも十分役立つんじゃないかって考えていたんだ。すでに僕らはWordPressのプラグインであるStaticPressで静的なHTMLを生成してS3やCDNから配信することに慣れているし、それ以外のAWSのノウハウにも精通しているから、これをサービス化したらいいんじゃないかって話をしていたんだ。それでイベントが終わってから君に色々オーダーが行ったはずなんだけど。

それが Shifterプロジェクト だね。

getshifter.io

Shifterができるまで

--- そうそう。それで、その後に何が起きてたのかなーって。

AMIMOTOのリブランディング

オッケー。まず、WCEUの次のWordCamp USに西川さんと小賀さんが来たときに、直接会話してみたんだ。僕自身もAWSにはよく慣れていて、AnsibleのPlaybookでサーバーを管理したりしていたから、AMIMOTOブースの説明を見て、彼らがAWS上でホスティングしているサービスが他のホスティングサービスとはちょっと違うものだなとわかったんだ。

それで、そのリーズナブルな価格設定や、内部で利用している技術を聞いて感動したんだ。PHP7やHHVMなどモダンな実行環境も割と普通に実現していたよ。

で、さらに聞いてみたら、非常に小さくて優秀なチームでそのホスティングサービスを実現しているんだ。ただし、彼らにはそれ以上の余計な人的リソースがないことにも気づいたんだ。

それで彼らと何か組めないかと思って、その夜彼らと一緒に呑んだんだ。そのとき、小賀さんや西川さんから「サードウェーブ(第3の波)=サーバーレス」について話してくれたんだ。

そのときは何を言ってるかよく分からなかったから、「いいねー、いいねー」って言って調子を合わせてただけなんだけど。

--- はっはっは(笑)

それで、まずは彼らのAMIMOTOのリ・ブランディングから手伝い始めたんだ。

AMIMOTOが次世代のWordPressホスティングであることは間違いないんだけど、顧客に製品を見つけてもらうためのブランディングってとても難しくて、良い製品があっても顧客が理解してくれないと売れないんだよね。それって問題だよね。だからまずはグラフィックを削ぎ落とすことから始めたんだ。すべてのグラフィックをわかりやすく統一して、ブースを見ただけでこの製品が何であるのか理解してもらえるようにしたんだ。Webにもそれを反映していって、AMIMOTOブランドが理解されやすくできたところで1つめのプロジェクトは無事に終わったんだ。

Shifterのブランド構築

その後に小賀さんから、次のプロジェクトの依頼があったんだ。それがShifter。そのときはまだShifterとは呼ばれてなかったけどね。

--- そのときのプロジェクト名ってなんだったの?

んー、単にStaticPressって呼んでたかな。それで彼らからStaticPressがどういうもので、どう動作するかじっくり聞いたんだ。それでも僕にはそのときその全貌は理解できなくて。

でも彼らのことは信じていたから、彼らがShifterの開発を始めるのと並行してブランドの構築を開始したんだ。彼らがWordCamp NYCの出展でフィラデルフィアにきたときに、また呑みながらじっくりと重要なコンセプトについて会話したよ。

そのとき誰かが「これはWordPressをStaticにShiftするやつだよね」って言ったんだ。そこから僕らはこのサービスをShifterという開発コードネームで呼び始めたんだ。その後100個くらい別の名前の候補をデジタルキューブのみんなで考えたし、それに合うコンセプトやイメージも作ってみたんだけど、結局最初のヤツが一番いいねってことになって Shifterに最終決定したんだ。

世の中にはさまざまなStatic Site Generatorがあるんだけど、StaticPressみたいに〇〇Pressって名前だとWordsPressのエコシステムの中から出られないと思うし、すべてのWordPressデベロッパーがStaticにするメリットを理解しているわけではないので、WordPress界隈以外でもユーザーを育てていけるという意味でこの名前で良かったんじゃないかな。

--- たしかにShifterはCMSとしてWordPressを使いつつもそのジェネレートのプロセスまで含めて完全にサーバーレスなサービスだよね。

f:id:yoshidashingo:20170809112036j:plain

そう、だから僕らはShifterをサーバーレスでホストするWordPressという独自のカテゴリに位置づけることにしたんだ。

--- ところで顧客ターゲットはどういった人たちを狙ってるの?WordPress界隈だけじゃないとするとサーバーレス界隈の開発者とかも?

すでにStatic Site Generatorに馴染みがある開発者たちであれば、Staticであるメリットや使い所をよく理解してくれるんじゃないかと考えているんだ。Shifterは技術的に言えばStatic Site Generatorだからね。

実際、今年のWordCamp EuropeではServerlessというメッセージよりStaticというワードでセッションをしたんだ。Static Site GeneratorとしてのShifterという話であれば、Serverlessなサービスというより簡単に理解してもらえるかなって。サーバーレスの文脈から始めるとその概念やメリットなどもう少し話さなくてはいけないトピックが増えてしまうからね。今はまだちょっと早いかなって。

ナレッジとサポートから

--- 見込みユーザーや使い始めのユーザーの育て方ってどう考えてる?たとえばMeetupをやるとか顧客ミーティングして回るとか

今はまず分かりやすく使ってもらえるようにサポートドキュメントを整備するのが先決かな。それでたくさん役に立つブログ記事を書くんだ。そうすれば Shifter とか Serverless WordPress とかで検索するたくさんの見込みユーザーにピンポイントに情報を提供することができるからね。で、それを続けていけばGoogle上のランクもどんどん上がっていくし、そうすればもっとたくさんの人に見つけてもらってしっかり記事を読んでもらえるからね。

もう1つの方法は Intercom という顧客管理やドキュメント管理もできるチャットツールを使ってサイトに来た人たちと直接チャットしたりサポートドキュメントを提供したりしようと思ってるんだ。これならつねにデジタルキューブでオンラインの人がいるから、すぐにサポート対応できるんだ。サイトに来る人の中には、たとえば「ShifterでWooCommerceは使える?」とか「なぜサーバーレスなの?」とか簡単な質問がしたい人もいるからね。そういう人に誰かがすぐ反応してあげれば次の段階に進む機会を得やすいんだよね。

www.intercom.com

--- 素晴らしいサポート体制だね

サーバーレス → Less Security Ops

ところで、次回のワシントンでやるWordCamp DC 2017で自分が話すトピックは「セキュリティ」なんだ。※収録日は7/7

--- セキュリティ?

そう、セキュリティ。WordPressでハックされてしまうポイントの多くがサーバー管理に関わる部分なので、サーバーやハードウェアの防衛を頑張る従来の手法もいいんだけど、サーバーレスにすることでサーバー管理上のセキュリティ懸念から解放されようって文脈なんだ。

--- 単純にすべてのセキュリティ懸念が解放されるわけではないけど、たしかにそれもサーバーレスのよい一面だね

それに、たとえばあなたがバイラルマーケターで企画が大ヒットした場合にも、サーバーレスにすればサーバーのキャパシティ管理のことは気にしなくていいんだよって話もね。

Danがデジタルキューブにジョインした経緯

--- ここまでShifterの誕生秘話を話してもらったけど、Danは外部メンバーとしてプロジェクトに入っていたんだよね。最近デジタルキューブに本格的にジョインしたって聞いたけど、それはどういった経緯だったの?

小賀さんとは2015年に初めてのWordCamp USで知り合ってから3年くらいの付き合いになるんだけど、その頃僕がいた制作スタジオがデジタルキューブの仕事を請けていて、会話自体はよくしていたんだ。

チームやサービスへの愛着

で、ShifterをローンチしてAWS re:Invent 2016で再会したときに、こうやってプロジェクトの立ち上がりから作り上げたプロダクトの行く末のことがすごく気になっていて。たとえばどうやってこの先改善して良くしていくのかとかね。それで小賀さんに伝えたんだ。「僕はあなた達との仕事が大好きだ」ってね。

--- 愛の告白みたいだね。

うん、まぁ。デジタルキューブという会社も大好きだし、もし機会があるならなんかこの先もっとスゴいこともできるんじゃないかって。そうしたら彼が僕のためのポジションをオファーしてくれて、それですぐに Yes って答えたんだ。

--- えぇ、決断早いねー

うそ、実際は本当に決断するのはちょっと大変だったんだ。デジタルキューブの仕事はとても楽しいんだけど、たとえばタイムゾーンが違うし、言語の壁もあるから結構チャレンジングだなと思うし、簡単なことは1つもないんだよね。でも、最近はみんながチャットで日本語でやりとりしてても、なんとなくどんなことを言ってるか分かるんだよ。少しづつ少しづつだけど、仕事の流れもよくしていけるといいかなと思ってる。

大事なのはチームで仕事すること

--- ところでオファーされたDanのポジションっていうのはどんなんなの?

COOだよ。もっと大きなプロジェクト、たとえば会社が次のステップに進めるような仕事をやってねとオファーされたんだ。当然Shifterがメインでフォーカスしないといけないプロジェクトだけどね。

--- ということはShifterを改善して世界に広めるためのキーマンということ?

うーん、キーマンのうちの1人くらいかな。僕らはチームで働いてるし、チーム自体が素晴らしいから、僕もあくまで1人のチームメイトさ。ここ(US)にいてサポートして、作業が詰まってしまうような部分があれば僕も対応するんだ。僕は決してブレイクスルーを起こすようなタイプじゃないし、チームメイトとして仲間と一丸となって課題に対処していくんだ。

--- 今日はありがとう。また呑もうね!

ありがとう!

f:id:yoshidashingo:20170809112058j:plain

Cloud Foundryについてjacopenさんに聞いてみた

セクションナイン吉田真吾@yoshidashingo)です。

前回に続いて、MasterCloudで話してもらう草間さん(@jacopen )に Cloud Foundry について聞いてみました。

--- 吉田です、今日はよろしくお願いします。はじめに簡単に自己紹介していただいてもよいですか?

草間です、どうぞよろしくお願いします。本名よりもjacopenというハンドルネームほうが定着してまして、そちらの名前で呼ばれることも多いですね。

Pivotalジャパンという会社で、Platform Architectという仕事をしております。Cloud Foundry導入前、もしくは導入検討中のお客様をサポートするのが主な仕事ですね。

その他の活動として、PaaS勉強会Cloud Foundry Tokyo Meetup のオーガナイザーもやっています。

f:id:yoshidashingo:20170809112158j:plain

paas.connpass.com

https://www.meetup.com/ja-JP/Cloud-Foundry-Tokyo-Meetup/www.meetup.com

Cloud Foundryとのかかわりについて

Cloud Foundryなら1人で運用を回せる

--- Cloud Foundry自体はだいぶ昔からありましたよね?草間さん自身はどういう関わりかたをしてきたのでしょうか?

Cloud Foundryは2011年にVMwareからOSSとして公開されたのですが、ちょうどその頃スタートアップでインフラ担当をやっておりまして。そのときはWindows Azure(今のAzure App Service )を利用していました。インフラ担当は私1人だけだったのですが、PaaSを使えばたった1人で運用を回せるぞ、これはすごいぞと。

そんなタイミングでCFに出会い、夢中になりました。ブログ書いたりミートアップに参加したり。 時を同じくしてNTTコミュニケーションズがCFを採用したPaaSサービスを開発しはじめたという話を聞き、これは行くしかない!と。即求人に応募しましたね。

CFでPaaSサービスを開発運用

入社後は開発メンバーとして参画し、2012年末にCFベースのCloudn PaaSをリリース。2013年からは開発リーダーを担当させていただき、新バージョンや企業向けバージョンの開発に携わりました。

おおよそ5年が過ぎ、CFも順調に普及していったところで、よりCFに近い場所で仕事をしたい!と思うようになりました。そこで、CF開発の中心を担っているPivotalに転職したという流れになります。

Fortune500の半数が利用するCF

--- オープン系PaaSって複数あって、Cloud Foundryは歴史的にもその筆頭だと思いますが、利用者もやはり一番多いんでしょうか?

そうですね。今年の6月にシリコンバレーでCloud Foundry Summitというイベントが開催されたのですが、キーノートで「Fortune500に載っている企業の半数がCloud Foundryを導入済み」という発表がありました。開発を主導するCloud Foundry Foundationのメンバーにも、名だたる企業が名を連ねており、利用者数は間違いなく一番だと考えられます

Docker前後の変化

--- Docker以後ってオープン系PaaSの実装もだいぶ変わったんでしょうか?DEISなどは元からDockerベースでしたよね?

全体的なアーキテクチャという意味ではそれほど大きく変わっていないですね。もともとマルチテナントなPaaSを実装するには何らかのアイソレーションの仕組みが必要であり、Docker以前もLXCやその他独自実装のコンテナランタイムが利用されていました。Docker登場以降は、ランタイム部分をDocker Engineに切り替えたり、互換機能を持たせたり・・・という流れです。

ただ、Dockerという使いやすく強力な仕組みが登場したことにより、間違いなくオープン系PaaSの数は増えましたね。DEISもそうですし、FlynnTsuruなどもそうです。PaaSのコアである「アプリケーションを動かす仕組み」の部分は自ら開発しなくともDockerを利用すればよく、あとは周辺機能を作っていけば差別化できるようになった。『俺が考える最強のPaaS』を作りやすい世界になったのは間違いないです。

サービスを利用するか自分で構築運用するか

--- BluemixやK5などのCFベースあるいはPivotal Web Servicesといったサービスを利用する人と、Yahoo! JAPANのように自身で構築して利用する人ってどのくらいの比率でいるんでしょう?またその使い分けってみんなどう決めてるんでしょう?

各サービス具体的な利用者数が公表されているわけではないので、正確な比率は分からないのですが・・・あくまでも自分の感覚になりますが、OSS CFやPivotal Cloud FoundryをプライベートPaaSとして導入して利用している企業のほうが、CFベースのパブリックPaaSを利用している人より多いのではないかなと。パブリックPaaSだとCF以外にもHerokuをはじめ強力なサービスが多く存在する上、OSSならではの特徴も生かしづらいので。一方、組織内部に導入したり、基盤の運用そのものもコントロールしたいという需要に対しては、CF以外の選択肢がそれほど多くないため強さが際立っています。

--- そもそもPaaSってインフラ(VM/コンテナ)の抽象化で開発者からは負荷分散やスケール変更が簡単にできるだけでなく、CI/CDのようなアプリのライフサイクル管理機能が便利だったりしますが、そういったPaaSならではでCloud Foundryの最近の「押し」の機能って何かありますか?

最近・・・ではなく以前からある仕組みなのですが、「Service Broker」という仕組みは今も昔も強みですね。CFのコマンドやGUIからサードパーティーのバックエンドサービスを簡単にプロビジョニングできます。コマンド一発でAWSのRDSを作ってアプリにバインドできるんですよ。すごく便利で、まさにPaaS!という感じの機能です。実は今、これをベースにした「Open Service Broker」という仕様を策定中でして、近い将来CFをだけでなくKubernetesでも同じ仕組みを使えるようになります。「CFならでは」じゃなくなりますが、エコシステムが広がるので楽しみです。詳しくは僕のスライドを参考にしてください

www.slideshare.net

Concourseという別のCIツールも

ご質問にもあるCI/CDについてですが、CF自体は非常に簡単なコマンドでアプリケーションのデプロイや削除ができます。なので、CIツール等からCFのCLIやAPIを叩いて実現する形になりますね。CIツール自体をCFの機能としては提供する予定ないのですが、PivotalがConcourseというCIツールをOSSで提供していて、CFの開発にも利用されています。このツール、ほんと便利なのでおすすめです! 最近、ブラウザで有名なFenrirさんが「Jenkins はもうオワコン? Concourse CI で iOS 向けビルドをやってみた」という刺激的なタイトルで紹介記事を書かれていました。

blog.fenrir-inc.com

構築の手間は以前の1/4程度に

--- 草間さんのスライドでCFのセットアップが大変との記載を見たことがありますが、最近はどうなんでしょうか?

スライドを書いた当時に比べるとかなりマシになりました! かかる手間は1/4くらいになってるんじゃないかなと。ただ、それでもコマンド一発というわけにはいきません。CFのインストールはIaaSレイヤーのAPIを叩いて自動でVM作成までやっちゃうBOSHという仕組みを利用する必要があり、どうしても最初の設定項目は多くなってしまうんですよね。その分、運用フェーズに入ると、他の仕組みよりも楽ちんなんですが。

CFでビジネスするためには

--- 私自身2年間くらいサーバーレス界隈見てきて、海外だとこういったパラダイムシフトの上でどうマネタイズするか真剣に考えてる人が多い印象なのですが、PaaS界隈のビジネス的な海外動向や国内動向ってどんな話題がありますか?

ビジネスの観点でいうと、PaaSというカテゴリ自体がハイプ・サイクルの幻滅期を過ぎたあたりだと考えています。なので、皆が注目するキラキラしたジャンルではとうの昔になくなっていて、実際これを導入することでいくら得すんの?とシビアに見られることが多いですね。

一方、先ほども紹介したようにFortune500企業の半分がCF採用しているという話もありますし、商用であるPivotal Cloud Foundryもかなり順調に導入が進んでいます。Red HatのOpenShiftも好調のようです。ですので、幻滅期を超えて着実な普及期に入ったのかな、という実感はありますね。今年のCloud Foundry Summitも、新機能の発表や導入方法ではなく、実際のユースケースについてのセッションが多かったのが印象的でした。国内では海外に比べるとやや出足は鈍いですが、それでも導入は結構進んでいます。

あと、最近MicrosoftがDeisを買収したのは大きなトピックになりましたね。Deisはどうマネタイズを行っていくのか興味をもって見ていましたが、Engine Yardに買収され、次にMicrosoftに買収されて今に至ります。既にさまざまなサービスを提供しているMicrosoftがDeisをどう扱っていくのか、非常に気になっているところです。

コミュニティについて

--- PaaSの普及にとってコミュニティってどういう側面で大切なんでしょうか?

PaaSはその仕組み上「開発や運用を決まったやり方に嵌めてしまう」ものなんですね。その「決まったやり方」は悪いものでは決して無く、従いさえすれば確実に効率が良くなる、いわゆるベストプラクティスなんです。「開発と運用の矯正ギプス」という表現をしても良いかもしれません。ただ、いきなり矯正ギプスをはめられて嬉しい人はいないですよね。なりたい将来像が見えてるとか、最終的に得られるベネフィットが見えて、初めて「ギプス付けるか・・・」ということになる。なので、コミュニティでPaaSについて情報共有するのはすごく重要ですし、利用している間に発生する問題点や解決方法を共有するのも、大切な取り組みだと思います。

ネタの広さと国内最速のトピックの早さ

--- PaaS勉強会は長年に渡り継続的に何十回も続いていますが、これだけ長くコミュニティが継続できる秘訣ってあるんでしょうか?

PaaS勉強会って扱うネタの幅がめちゃくちゃ広いんですよ。DeisやFlynn、OpenShiftといったアプリケーションPaaSもそうですし、今や飛ぶ鳥を落とす勢いのKubernetes、グラフィカルプログラミングツールのNode-RED、サーバーレスのOpenWhisk、いずれも日本で最初にPaaS勉強会が取り上げているんですね。

節操ないと思われるかもしれませんが・・・PaaSという言葉の定義については今でも固まってません。Cloud Foundryのようなアプリケーションを動かすプラットフォームだけをPaaSと定義している例もあれば、DBaaSやCaaSまでPaaSだと定義している例もあります。まあその定義は皆さん好きに行って頂ければ良いと思うのですが、個人的には「何もかも楽をしたい」というエンジニアの欲求が最も具現化しているのがPaaSであり、エンジニアを楽にしてくれるものならば何でもPaaS勉強会で扱っちゃおうくらいに思っています。

今の世の中どんどん良い仕組みが生まれ続けているので、ネタは尽きないんですよね。主催している自分も毎回新しいものを知ることが出来ますし、やっていて楽しいです。なので、このコンセプトがモチベーションの源泉ですね。先日は10年続けます!と宣言しました(笑)。

100人超の会場が確保しにくい

参加者が100人を超える勉強会になってきたので、会場については毎回悩むところです。開催頻度は、ネタの有無よりも会場の確保に左右されているのが現状ですね。会場提供についてのお申し出はいつでも歓迎しております! 今後については、他の勉強会ともコラボして何かやれたらなーと考えているのがひとつ。もうひとつは、東京以外での開催も企画したいなと考えています。実際にいくつか話はあり、そう遠くないうちに地方開催をアナウンスできるんじゃないかなと。

--- ありがとうございました。当日のお話も楽しみにしています。

まとめ

さすが老舗PaaS勉強会のオーガナイザーということで、メイントピックのCloud Foundry以外についても非常に幅広いネタが聞けたという印象でした。

さらに色々聞きたい人は来週のMasterCloudに参加するのだー。

mastercloud.connpass.com

www.slideshare.net