Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Cookpad summer internship 2019 - infra intro

itkq
August 23, 2019

Cookpad summer internship 2019 - infra intro

https://internship.cookpad.com/2019/summer/ の 5 日目の講義に使った資料です。

itkq

August 23, 2019
Tweet

More Decks by itkq

Other Decks in Technology

Transcript

  1. Summer Internship 2019

    10 Day Tech: Infrastructure
    技術部 SRE グループ @itkq

    View Slide

  2. Day 5

    View Slide

  3. View Slide

  4. メンバー紹介
    •講師: @itkq (SRE グループ)
    •TA: (全員 SRE グループ)
    ‣ @hfm
    ‣ @mozamimy
    ‣ @rrreeeyyy

    View Slide

  5. 自己紹介

    View Slide

  6. 講師
    •ID: itkq
    •職歴: 新卒2年目
    ‣ 長野高専 → 東工大 → クックパッド (イマココ)
    •仕事: 障害に強いシステムをつくりたい
    ‣ カオスエンジニアリングとか
    •趣味: 最近は Re:ステージ! にハマっている

    View Slide

  7. TA 各位の自己紹介!

    View Slide

  8. 今日の流れ
    •講義
    ‣ クックパッドのインフラの変遷 (イマココ)
    ‣ API サーバ (Day 3) のデプロイの裏側
    •講義 + ハンズオン
    ‣ トピック: 認証認可・DynamoDB
    •実践 (残り時間)
    ‣ インフラを意識した API サーバの拡張・開発環境の整備

    View Slide

  9. 最初の講義テーマ
    •“クックパッドのインフラ”
    ‣ 普段趣味でプロダクトを作るだけでは知れないような

    現場のインフラの話をします
    ‣ 今年のインターンがなぜこういう構成だったのかが

    きっと分かる

    View Slide

  10. 突然の組織構成
    ʜ
    SRE グループ

    View Slide

  11. 突然の組織構成
    ʜ
    SRE グループ
    •各開発チーム
    ‣ プロダクトの開発に集中して価値を提供
    •SRE
    ‣ 横断的に各開発チームのインフラ・信頼性の担保

    View Slide

  12. SRE
    •Site Reliability Engineering
    ‣ Google が言い出した
    ‣ “ソフトウェアエンジニア”による信頼性工学
    • “インフラエンジニア” じゃない
    ‣ とりあえず名前だけ覚えておいてください

    View Slide

  13. クックパッドを支えるインフラ
    •様々なサービスの安定稼働
    ‣ クックパッド (レシピサービス)、クックパッドマート、…
    •ピーク時は結構トラフィックがある
    ‣ レシピサービスが一番使われるのは夕方

    View Slide

  14. レシピサービスの一週間
    17~18時
    スマホ API Web
    月曜日

    View Slide

  15. クックパッドのインフラの特徴
    •AWS (クラウド) のフル活用
    •巨大モノリシックアプリケーションに特化したインフ
    ラからマイクロサービス指向のインフラへ変遷
    ‣ 権限移譲とセルフサービス化
    •コスト最適化, etc.

    View Slide

  16. 時は 2015 年
    •“The Recipe for the World’s Largest Rails
    Monolith”
    ‣ https://speakerdeck.com/a_matsuda/the-recipe-for-
    the-worlds-largest-rails-monolith

    View Slide

  17. View Slide

  18. View Slide

  19. View Slide

  20. 超巨大 Rails を支えるインフラ
    •mamiya
    ‣ 高速デプロイツール。15分かかっていたデプロイが20秒で終わるように
    •RRRSpec
    ‣ 並列分散テストツール。1時間かかっていたテストが15分で終わるように
    •SpotScaler
    ‣ 安い EC2 スポットインスタンスを活用したオートスケーラー

    View Slide

  21. 当時の図 (雰囲気)
    tech/cookpad_all
    課金
    ユーザ情報
    検索
    レシピ
    つくれぽ
    調整
    調整
    調整
    調整
    調整 調整
    調整

    プッシュ &&

    デプロイしたい!!
    インフラ
    運用

    View Slide

  22. 当時の様子①
    •検索ロジックを改善するためにモデルを30行変更してみた
    •モデルは他の機能と密結合していて全然関係なく思えるテストが数百
    単位で落ちる
    •がんばって修正していく
    •その間に別のチームが他の変更をデプロイしていて、いざブランチを
    マージしようとするととんでもなくコンフリクトした
    •いつまでも変更をリリースできない… \(^o^)/オワタ

    View Slide

  23. 当時の様子②
    •A/B テストの結果が良さそうだったので新しい機能を本番リリース
    したい
    •しかし結構影響範囲が大きいため別のチームと調整する必要がある
    •GitHub 上で非同期的な議論するのは時間がかかるので各チームと
    ひたすらミーティングをする
    •調整が終わってコードを書き始められるのは1ヶ月後だった…

    \(^o^)/オワタ

    View Slide

  24. •価値を提供したいだけなのにどうして…
    消耗

    View Slide

  25. 問題点
    IUUQTUFDIMJGFDPPLQBEDPNFOUSZPEBJCBTUSBUFHZ

    View Slide

  26. 問題点 (続)
    IUUQTUFDIMJGFDPPLQBEDPNFOUSZPSDIBC⒎

    View Slide

  27. モノリシックの限界
    •最初はうまくいっていたが組織とサービスが成長するに
    つれて素早い価値提供が難しくなった
    ‣ 密結合によるコミュニケーション・メンテナンスコストの増加
    •我々は本質的にはサービスを提供したい
    ‣ レシピサービス以外のサービスも立ち上げたいフェーズ
    •2014 年からマイクロサービスアーキテクチャへ移行開始

    View Slide

  28. 3行で分かるマイクロサービスアーキテクチャ
    •Kubernetes 上のコンテナで動いていて
    •最新の技術が使われていて
    •規模が小さいサービスの集まり

    View Slide

  29. 3行で分かるマイクロサービスアーキテクチャ
    •Kubernetes 上のコンテナで動いていて
    •最新の技術が使われていて
    •規模が小さいサービスの集まり
    全部間違ってる!!!

    View Slide

  30. 3行で分かる本当のマイクロサービスアーキテクチャ
    •(Why) 組織全体のパフォーマンス最大化するために
    •(How) 開発からリリースまでのサイクルを回して
    コミュニケーションコストを下げることで
    •(What) 巨大化した組織とシステムを再編するための
    アーキテクチャ

    View Slide

  31. マイクロサービス詳細
    •時間の関係で割愛します

    View Slide

  32. 理想のマイクロサービス
    Airbnb Netflix

    View Slide

  33. マイクロサービスアーキテクチャとインフラ
    •インフラグループはレシピサービスのインフラを支えていたが、
    以降新旧様々なサービスのインフラも支えていかなければならなく
    なった
    •個々のサービスのインフラを用意したりデプロイしたり運用の
    サポートをするのではコミュニケーションコストが高くなり
    スケールもしない
    ‣ マネージドサービスを活用しつつ権限移譲とセルフサービス化に

    取り組む

    View Slide

  34. そして SRE へ
    •“インフラ” → “SRE”
    ‣ 主業務がインフラ調達・運用から自動化・効率化のためのソ
    フトウェア開発運用へ徐々にシフト
    •技術部 開発基盤グループとも協力が多くなった
    ‣ “開発環境” → ”プラットフォーム”
    ‣ 2019 年現在では組織再編で SRE に吸収された

    View Slide

  35. SRE
    開発者

    これまでの新規開発フロー
    ② サーバ準備・配置 ③ デプロイ

    スクリプト用意

    View Slide

  36. 権限移譲の取り組み (1)
    •これまでアプリケーションのデプロイとはインフラに大きく

    関係していた
    ‣ インスタンス準備、ミドルウェア・ライブラリ更新、…
    •コンテナ技術 (Docker) の台頭
    ‣ アプリケーション開発者が実行環境まで制御可能になり docker run
    さえできる場を用意すれば良くなった
    ‣ コンテナ化やるぞ!!

    View Slide

  37. クックパッドのコンテナ動作環境
    •AWS ECS (2015 ~)
    ‣ Docker コンテナのオーケストレーションを提供するマネージドサービ
    ス。これ自体で実際のユースケースをカバーするのは当時難しかった
    •hako
    ‣ 宣言的に記述した定義をもとにデプロイするツール。ECS へのデプロ
    イに使われている。OSS になっている。現在ではクックパッドの中心
    的なエコシステム・プラットフォームに。

    View Slide

  38. SRE
    開発者
    ① ② ③
    ④ レビュー
    LGTM

    新規開発フロー w/ hako
    Pull-Request

    View Slide

  39. SRE
    開発者
    ① ② ③
    ④ レビュー
    LGTM

    新規開発フロー w/ hako
    Pull-Request

    SRE の介入は Pull-
    Request のレビューだけ
    => リードタイムが少なく
    スケールする

    View Slide

  40. Docker イメージ
    CPU とメモリ割当
    ALB
    ECS Task
    NGINX
    APP
    ECS Task
    NGINX
    APP
    タスク数

    View Slide

  41. hako-console
    開発者・SRE の
    ための管理画面
    各種リソースへのリンク
    ECS 関連の情報

    View Slide

  42. hako-console
    開発者・SRE の
    ための管理画面
    各種リソースへのリンク
    ECS 関連の情報

    View Slide

  43. サービス間通信はむずい
    •マイクロサービスは銀の弾丸ではなく解決しなければならない課題
    がある; 特にサービス間通信 (実質コミュニケーションコスト)
    •アプリケーション開発者の視点
    ‣ サービス間通信を実装しなければならない。複数サービスへのクエリ
    やテストなど考えることが増える
    •SRE の視点
    ‣ 障害の特定が難しくなったり、カスケード障害の対応などコスト増

    View Slide

  44. サービス間通信の問題?

    View Slide

  45. サービス間通信の問題?

    View Slide

  46. サービス間通信の問題?
    連鎖する障害
    (カスケード障害)

    View Slide

  47. サービス間通信の問題?
    •各サービスが一斉にリトライするとさらに延焼
    •どことどこが通信しているのかもはや分からない
    •どこが元凶・どこを直せばいいかすぐ分からない

    View Slide

  48. サービス間通信をいい感じにしたい
    •適切なリトライ/タイムアウト/サーキットブレイク
    •サービスディスカバリ (通信相手をいい感じに知りたい)
    •オブザバビリティ (サービス間通信状況を追跡できる)
    ‣ キャパシティプランニング
    ‣ 障害の原因究明

    View Slide

  49. サービス間通信をいい感じにするには
    IUUQTTQFBLFSEFDLDPNUBJLJPCTFSWBCJMJUZTFSWJDFNFTIBOENJDSPTFSWJDFT

    View Slide

  50. サービス間通信をいい感じにするには
    IUUQTTQFBLFSEFDLDPNUBJLJPCTFSWBCJMJUZTFSWJDFNFTIBOENJDSPTFSWJDFT

    View Slide

  51. サービスメッシュの良さ
    •中央管理できオブザバビリティ指向
    •アプリケーション (言語) に依存しない
    ‣ 自作 Ruby 用ライブラリはある (expeditor) が…
    •サービスメッシュやるぞ!!

    View Slide

  52. サービスメッシュを選んだ

    View Slide

  53. 権限移譲の取り組み (2)
    •サービス間通信の設定を GitHub で中央管理
    •hako と同様の PR レビュープロセス

    View Slide

  54. サーキットブレイカー
    リトライ
    タイムアウト

    View Slide

  55. pantry というアプリの
    通信先を追加します

    View Slide

  56. pantry
    エラーになると赤くなる

    View Slide

  57. 通信状況が把握できる

    View Slide

  58. 通信状況が把握できる

    View Slide

  59. アプリ以外のリソース管理
    •普通サービスにはアプリケーション以外の様々なリソースが
    必要
    ‣ データストア、キャッシュストア、CDN、…
    •これまで基本的に SRE が管理
    ‣ 強い権限・責任が伴う、キャパシティプランニングが必要、…
    ‣ このままでは開発者主導で変更しづらい・スケールもしない

    View Slide

  60. 権限移譲の取り組み (3)
    •基本的に AWS のマネージドサービスを使う
    ‣ お金は上乗せされるが運用コストの軽減を狙う
    •リソースにはプロジェクト毎にタグをつけるよう徹底
    ‣ プロジェクト毎の使用状況やコストを可視化
    ‣ 責任分割を徹底して GitHub フローに乗せるためには…
    ‣ Terraform ちゃんとやるぞ!!

    View Slide

  61. •Infrastructure as Code のためのツール (OSS)
    •AWS, GCP, Azure, … 様々なプロバイダ
    •エコシステムが育ちデファクトになりつつある
    ‣ これまでもクックパッドで使ってはいた
    ‣ ちなみにサーバの中身の構築には を使う

    View Slide

  62. これまでの Terraform 運用
    infra/infra2
    SRE
    大統一 Terraform
    terraform/
    プッシュ・plan・apply
    すべてのリソースを

    SRE が一元管理

    View Slide

  63. これからの Terraform 運用
    tech/terraform
    kirare/ ortensia/ stella-maris
    プッシュ

    (Project = kirare)

    plan
    独立 独立
    プロジェクト毎に

    分けて管理
    それぞれ 

    apply

    View Slide

  64. View Slide

  65. •PR に対して CI で terraform plan が実行される
    ‣ 何が実際に変わるか事前に確認できる (dry-run)
    ‣ Project タグがないと落ちる
    ‣ 差分が良さそうだったら SRE が terraform apply で適用

    View Slide

  66. これからの Terraform 運用
    tech/terraform
    kirare/ ortensia/ stella-maris
    プッシュ

    (Project = kirare)

    plan
    独立 独立
    プロジェクト毎に

    分けて管理
    それぞれ 

    apply

    View Slide

  67. リソースの利用状況?
    •リソースの管理は開発者主導でできるようになった
    •アプリを含むリソースは適切に利用されているか?
    ‣ オーバープロビジョニングしてないか
    ‣ 逆にサチったりしていないか
    •開発者がモニタリング/アラーティングできることが健全

    View Slide

  68. 権限移譲の取り組み (4)
    •アプリケーション開発者が設定することなく汎用的な
    モニタリング環境を提供する w/ hako-console
    ‣ マネージドな CloudWatch Metrics
    ‣ Grafana は便利

    View Slide

  69. View Slide

  70. ステータスコード別

    リクエスト数
    レイテンシ

    パーセンタイル
    各コンテナのメモリ
    タスク (インスタンス) 数
    各コンテナの CPU 時間

    View Slide

  71. RDS のフリーメモリ量
    デプロイタイミング
    ElastiCache のヒット率

    View Slide

  72. RDS のフリーメモリ量
    デプロイタイミング
    ElastiCache のヒット率

    View Slide

  73. 権限移譲の取り組み (5)
    •Prometheus + Alertmanager で柔軟なモニタリング/
    アラーティング設定を可能にする

    View Slide

  74. •時系列 DB をもつモニタリングシステム (OSS)
    ‣ メトリクスに対する強力なクエリ言語 (PromQL)
    ‣ 動的なクラウド環境に向いているため流行りつつある
    •クックパッドでは 2017 年ぐらいから徐々に導入

    View Slide

  75. コンテナ
    コンテナ
    サーバ
    サーバ
    見つけて

    取りに行く
    Alertmanager
    ルールに基づいて
    クエリ
    アラート
    ダッシュボードを

    見る
    クエリ
    モニタリング/アラーティング概観

    View Slide


  76. hako-console
    Slack チャンネル
    を設定
    Alertmanager
    レシーバを設定
    Check
    Fire
    通知
    Validator
    ルール設定
    実装
    通知先を取得
    Fire
    システム
    Pull
    開発
    Validate
    Hako を中心としたアラーティングプラットフォームの図

    View Slide


  77. hako-console
    Slack チャンネル
    を設定
    Alertmanager
    レシーバを設定
    Check
    Fire
    通知
    Validator
    ルール設定
    実装
    通知先を取得
    Fire
    システム
    Pull
    開発
    Check
    Hako を中心としたアラーティングプラットフォームの図
    • 開発者は Slack チャンネルを設定するだけ
    でいい感じに
    • 必要なら自分でアラートも定義できる

    View Slide


  78. hako-console
    Slack チャンネル
    を設定
    Alertmanager
    レシーバを設定
    Check
    Fire
    通知
    Validator
    ルール設定
    実装
    通知先を取得
    Fire
    システム
    Pull
    開発
    Check
    Hako を中心としたアラーティングプラットフォームの図
    • SRE は汎用的なアラーティングを整備

    して開発者のチャンネルに届けられる

    View Slide

  79. Runbook
    #wangan

    View Slide

  80. Runbook = アラート対応手順書

    View Slide

  81. 開発者自身も

    アラート設定できる

    (もちろんレビューする)

    View Slide


  82. hako-console
    Slack チャンネル
    を設定
    Alertmanager
    レシーバを設定
    Check
    Fire
    通知
    Validator
    ルール設定
    実装
    通知先を取得
    Fire
    システム
    Pull
    実装/設定

    View Slide

  83. What’s next?
    •デプロイ、サービス間通信、リソース管理、モニタリング、アラー
    ティングは移譲が進んできた (2019 年)
    •この先どうやってアプリケーション開発者と SRE で “運用” 

    するべきなのか
    ‣ 本番環境でエラーが出ていたら誰がどう対処するべき?
    ‣ ユーザにどれぐらい影響があったか (ビジネスインパクトは) ?
    ‣ 機能開発の手を止めて信頼性の改善に集中すべき?

    View Slide

  84. 運用シナリオ①
    システム
    システム
    ①エンバグ
    ①エンバグ
    ②帰宅
    ②帰宅
    ③アラート
    ③アラート
    ④オンコール対応

    View Slide

  85. 運用シナリオ①
    システム
    システム
    ①エンバグ
    ①エンバグ
    ②帰宅
    ②帰宅
    ③アラート
    ③アラート
    ④オンコール対応
    •Dev: 機能優先で信頼性をおろそかにしてしまう
    ‣ アプリケーションコードの品質の低下
    •Ops: アプリケーション起因のアラート対応
    ‣ ドメイン知識がないままバグを修正することになり

    消耗

    View Slide

  86. 運用シナリオ②
    システム
    システム
    慎重な開発
    慎重な開発
    デプロイ
    デプロイ

    View Slide

  87. 運用シナリオ②
    システム
    システム
    慎重な開発
    慎重な開発
    デプロイ
    デプロイ
    •Dev: 障害を恐れた慎重な開発
    ‣ 機能リリース速度・回数の低下
    •Ops
    ‣ サービスが成長しないのでやれることがない…

    View Slide

  88. •価値を提供したいだけなのにどうして…
    消耗 (again)
    Dev Ops

    View Slide

  89. どうすれば…?
    •信頼性リスクを 0 にするのは不可能なことを思い出す
    ‣ “Everything fails, all the time.”
    •Dev も Ops も障害を “受け入れる”
    ‣ どれぐらい “受け入れられるか” を定義する
    • 例: サービスが 10 分落ちたらいくら損失するか?

    View Slide

  90. SLI と SLO
    •サービスレベル指標 (SLI)
    ‣ 例: Uptime
    •サービスレベル目標 (SLO)
    ‣ 例: 月の Uptime: 99.95% (= 月に 22 分落ちてもいい)
    ‣ Biz, Dev, SRE すべてで共通する目標

    View Slide

  91. SLO があると嬉しいこと
    •数値に基づいた具体的なコミュニケーションができる
    ‣ 「サービス落ちるとまずいんで落とさないようにしてく
    ださい!」みたいなのが無くなる
    ‣ SRE は必要十分なコストを払って信頼性の担保する動機
    ができる

    View Slide

  92. アプリケーション開発者の今後
    •(当然) アプリケーションコードを書く
    •宣言的にインフラの設定を書く
    ‣ インフラは抽象化され誰でも触れるように
    •サービスレベルに従って開発・運用していく
    ‣ “DevOps”

    View Slide