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

高速多品種開発・運用を支えるBonBonのインフラ

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.
Avatar for BonBon BonBon
September 30, 2021

 高速多品種開発・運用を支えるBonBonのインフラ

少人数でのサービス開発・運用を支えるためのインフラ構成についての解説資料です。

Avatar for BonBon

BonBon

September 30, 2021
Tweet

More Decks by BonBon

Other Decks in Technology

Transcript

  1. 自己紹介 2 藤原 涼馬 • 経歴 ◦ ユーザー系SIerにて研究員として活動した後、 2016年1月より大手メディア系企業にて新規サービス (主にHR系サービスが中心)構築支援、

    およびパブリッククラウド利活用の標準化について活動 ◦ 並行して大手金融機関のグループ企業などにて パブリッククラウドのインフラ改善などの活動に従事 • 得意?領域 ◦ パブリッククラウドインフラストラクチャ・ CI/CD • 社外実績 ◦ コミュニティ・イベント運営 ▪ Japan Container DaysおよびCloud Native Days Tokyo 2019/2020実行委員 ▪ Rancher JPコアメンバー ◦ 執筆・出版 Articles & publications ▪ 先行事例に学ぶKubernetes企業活用の現実(@IT) ▪ コンテナベースのCI/CD本番事例大解剖(@IT) ▪ マルチクラウド時代の最強コンビ  RancherによるKubernetes活用ガイド(ThinkIT) ▪ RancherによるKubernetes活用完全ガイド(インプレス) ▪ WAF実践 (Web+DB Press vol.123, 2021年6月号特集記事) ▪ ほか
  2. 主に開発・提供(開発中のもの含む)しているサービス 9 名称のみ • Porous • Trepo • Manabon •

    Aiseki • stluke ◦ などなど 提供している(またはしようとしている)ものは多い
  3. 主に開発・提供(開発中のもの含む)しているサービス 10 名称のみ • Porous • Trepo • Manabon •

    Aiseki • stluke ◦ などなど 提供している(またはしようとしている)ものは多い かつ、世の中に存在しないジャンルのサービスばかりなので どんどん仮説検証サイクルを回して進化させる余地がある
  4. 運用しなければいけない範囲を最小化するための選択 25 • GCE ◦ 仮想マシンを直接利用することで自由度は高いが、 管理の手間は最も大きい • GKE ◦

    Managed Kubernetesの利用によって、自由度も高く保ちつつ管理も 容易。 ◦ 但し、Kubernetesのバージョンそのものの管理の手間が起きる • Cloud Run ◦ サーバーレス ◦ ビルド済みのコンテナイメージさえあれば良い
  5. 運用しなければいけない範囲を最小化するための選択 26 • GCE ◦ 仮想マシンを直接利用することで自由度は高いが、 管理の手間は最も大きい • GKE ◦

    Managed Kubernetesの利用によって、自由度も高く保ちつつ管理も 容易。 ◦ 但し、Kubernetesのバージョンそのものの管理の手間が起きる • Cloud Run ◦ サーバーレス ◦ ビルド済みのコンテナイメージさえあれば良い
  6. 運用しなければいけない範囲を最小化するための選択 27 • GCE ◦ 仮想マシンを直接利用することで自由度は高いが、 管理の手間は最も大きい • GKE ◦

    Managed Kubernetesの利用によって、自由度も高く保ちつつ管理も 容易。 ◦ 但し、Kubernetesのバージョンそのものの管理の手間が起きる • Cloud Run ◦ サーバーレス ◦ ビルド済みのコンテナイメージさえあれば良い アプリケーションの実行基盤には 原則 Cloud Runを利用
  7. システムアーキテクチャの標準化(同期処理) 34 サービス1 サービス2 サービス3 サービスN-1 サービスN API Gateway まず最初にモニタリングすべきポイントを

    定めることでサービスの運用を効率化 & OpenAPI specによって公開API、公開範 囲などを明示 何か問題が出たときに見るポイントを明確化 (その上で掘るべきサービスを確認)
  8. システムアーキテクチャの標準化(同期処理) 36 サービス1 サービス2 サービス3 サービスN-1 サービスN API Gateway Firebase

    Authentication 認証にFirebase Authenticaionなどを利用 API GatewayのOpen API定義で記述 Open APIとFirebase Authenticationほか で認証まわりの品質を担保
  9. システムアーキテクチャの標準化(非同期処理) 37 Cloud PubSubを利用   Cloud Run Compute Engine Pub/Sub

    1時間以内で終了する処理の場合 1時間以内で終了しない処理の場合
  10. Cloud Codeのメリット 43 • ローカルでCloud Runを実行してテスト可能 ◦ 仕組み的にはローカルでminikubeとknativeとGoogle Cloudの認証プ ラグインを組み合わせて実現

    • ローカルでGCPのサービスアカウントをセキュアに利用できる ◦ jsonファイルをエクスポートすること無く利用できる • VSCodeやJetBrainsのIDE(IntelliJやGoLand)などのプラグイ ンが提供されている
  11. Cloud Codeのメリット 44 • ローカルでCloud Runを実行してテスト可能 ◦ 仕組み的にはローカルでminikubeとknativeとGoogle Cloudの認証プ ラグインを組み合わせて実現

    • ローカルでGCPのサービスアカウントをセキュアに利用できる ◦ jsonファイルをエクスポートすること無く利用できる • VSCodeやJetBrainsのIDE(IntelliJやGoLand)などのプラグイ ンが提供されている これについては一度使ってみたほうが良い (サーバーレスの開発体験が全然変わる )
  12. Cloud Runの サービスA 3. Cloud Runを利用している 51 Cloud Runのrevision毎にトラフィックをコントロールしたり、revision毎にURLを発行で きるのでこれを利用

    本番リリース時 ドメイ ン revision N-1 revision N 0% 100% Cloud Runの サービスA ドメイ ン revision N-1 100% Cloud Runの サービスA ドメイ ン revision N-1 revision N 100% 0% --no-trafficで新リビジョンをデプロイして切替 テスト時 Cloud Runの サービスA ドメイ ン revision N-1 revision N 0% 100% Cloud Runの サービスA ドメイ ン revision N-1 100% リビジョンタグドメ イン リビジョンにタグを付与して固有のドメインを払い出してテスト テスト用URL
  13. 3. API Gatewayを利用している 52 API Gatewayでも同様の仕組みがあるため特定のサービスのみを新バージョンに入れ 替えたGatewayを準備してQAを実行する API Gateway 本番ドメイン

    本番用 OpenAPI spec サービス1 (リビジョンN) サービス2 (リビジョンN) サービス3 (リビジョンN) サービス3 (リビジョンN+1) 動作確認用ドメイン (動的に払い出し) 動作確認用 OpenAPI spec
  14. 4. 安全なCDを志向した手順 53 以下のようなステップを開発環境や本番環境で実行することで 安全なデプロイを実現している サービス3ではリビジョンN+1 のリビジョンタグドメインにア クセスするよう OpenAPI specをCDパイプラ

    イン内で動的に生成 0. デプロイ前 1.新しいリビジョンをデプロイ  (トラフィックなし) 2.新しいリビジョンに リビジョンタグドメインを紐付け 3. API Gatewayで動作確認用のOpenAPI specを生成(リビジョンN+1に流す) 4. 問題なさそうであればサービス 3のトラフィッ クをリビジョンNからリビジョンN+1に切替(カナリ アリリースも可能)
  15. 4. 安全なCDを志向した手順 54 以下のようなステップを開発環境や本番環境で実行することで 安全なデプロイを実現している サービス3ではリビジョンN+1 のリビジョンタグドメインにア クセスするよう OpenAPI specをCDパイプラ

    イン内で動的に生成 0. デプロイ前 1.新しいリビジョンをデプロイ  (トラフィックなし) 2.新しいリビジョンに リビジョンタグドメインを紐付け 3. API Gatewayで動作確認用のOpenAPI specを生成(リビジョンN+1に流す) 4. 問題なさそうであればサービス 3のトラフィッ クをリビジョンNからリビジョンN+1に切替(カナリ アリリースも可能) 開発環境であれば、PRをトリガーとすることで API Gatewayのドメイン払い出しまでを 実現することで実施が可能
  16. 注意点(QAおよび動作確認用API Gateway払い出しまでの流れ) 55 一つのAPI Gatewayに複数のサービス(=Cloud Runサービス)がぶら下がる 形になるのでCloud Buildの工夫が必要 GitHub ・あるサービスで

    PRを作成 Cloud Build ・Cloud Runでリビジョンをデ プロイ & リビジョンに紐付い たドメインを生成 Cloud PubSub ・どのサービスでリビジョン が生成されたかを受け取っ て通知 Cloud Build ・Cloud Runでリビジョンをデ プロイ & リビジョンに紐付い たドメインを生成 PR作成 (Cloud Runデプロイのトリガー ) Cloud Runのデプロイ (新規リビジョンのデプロイ &ドメイン生成) API Gatewayデプロイ (動的に生成された設定に基づいた Gateway生成) Terraformを使って動的に API GatewayのOpenAPI specとgatewayを生成
  17. CI/CDまとめ 56 • Cloud Build便利(あまり語ってないが) • Cloud RunのリビジョンとAPI Gatewayの組み合わせでかなり 効率的かつ安全なリリースが実現できる

    • 但しシステムアーキテクチャやアプリケーションのビルド手順 がある程度標準化していないと構築の手間が増えるので技術 スタック、アーキテクチャを絞り込むことは必須
  18. 今後進めていきたいこと 58 • テストの改善 ◦ テストピラミッドの考え方に準拠したテストの充実と品質の可視化 & 客 観的な品質改善の方向性の策定 •

    監視・モニタリング品質の向上 ◦ プロダクションで動くものが増えてきたため運用品質を高めたい ◦ モニタリングをしやすい仕組みは考慮した設計にはしているつもりなの で通知や対応プロセスなどを作り込む(予定)