[DevOpsプラットフォームの取り組み #8] Qmonus Value Streamを支えるアーキテクチャの紹介

DevOpsプラットフォームの取り組みを紹介する8回目の記事です。

Qmonus Value Stream 開発チームの浅井です。

連載第8回では、Qmonus Value Streamのアーキテクチャとその技術スタックについて紹介します。

これまでの連載ではQmonus Value Streamで利用している技術要素として、第4回ではデータ記述言語であるCUE言語を、第5回ではKubernetes NativeなオープンソースフレームワークであるTektonを紹介してきました。 Qmonus Value Streamではこれらの技術要素に加え、複数のGCPプロダクトやSaaSを利用することでシステムを構築しています。

本記事では、Qmonus Value Stream全体のアーキテクチャと、利用している主要なフレームワークやサービスについて紹介します。1つ1つの要素についての説明は少ないですが、システムを構成するアーキテクチャの一例として参考になればと思います。

全体像

Qmonus Value Streamのシステムアーキテクチャの概要図です。

クラウド基盤としてGoogle Cloud Platform (GCP) を利用しており、中心となる機能は全てGoolge Kubernetes Engine (GKE) 上に構築しています。 これはこれまでの記事でいくつか触れていますが、CI/CD機能を実現するためにKubernetesの拡張機能を活用していることに由来します。 GKE上では、主要な機能を具備しAPIを提供するAPIサーバ (FastAPI) 、CI/CD機能を提供するためのTektonおよびKubernetesカスタムオペレータ、ログ基盤としてLokiなどが実行されています。

ユーザがQmonus Value Streamを利用する場合、まずCloudflareからWebページを取得し、ブラウザ上での操作に対応したリクエストをAPIサーバに送信します。 APIサーバは受けたリクエストに応じてTekton PipelineRunリソースなどを作成することでCI/CDパイプラインを駆動し、それらのリソースのステータスをAPIで応答しブラウザ上に表示することで、パイプラインのステータス・進捗を可視化しています。

Qmonus Value Streamのシステムアーキテクチャは大きく分けて以下の機能郡に分かれており、それぞれで用いているコンポーネントの役割と特徴について簡単に説明していきます。

  • WAF (Web Application Firewall)・LB (Load Balancer)
  • メインサービス
  • CI/CD ログ基盤
  • CI/CD 実行基盤
  • Metrics
  • Monitoring
  • GCP Service Log

コンポーネントと技術スタックの紹介

WAF・LB

WAF・LBは、アプリケーションへのアクセスの前段として、アプリケーションへのアクセスの処理と外部公開しているエンドポイントの保護を担当しています。

Cloudflare

CloudflareはContent Delivery Network (CDN) やセキュリティサービスなどを提供するサービスです。 Qmonus Value StreamではフロントエンドアプリケーションのホスティングにClouflare Pagesを利用しています。Cloudflare Pagesを利用することで、githubのpushイベントをトリガーに手軽にビルドと環境へのデプロイができ、安定して手軽にそして早く開発を進めることができます。

また、Cloudflareをリバースプロキシとしても利用しており、外部へ公開しているドメインへのアクセスは全てCloudflareへ集約させています。 その過程でWAFサービスも利用することで、各エンドポイントの保護も行っています。 マネージドWAFを利用することで高いレベルのセキュリティを手軽に保つことができています。

Cloud Load Balancing

Cloud Load Balancing (GCLB) はGCPが提供する、パフォーマンスとスケーラビリティに優れた負荷分散を実現するマネージドロードバランササービスです。

Qmonus Value Streamでは外部公開しているサービスは全てGKE上に構築されており、KubernetesにおけるIngressではGCLBを利用しています。Ingressには他にも選択肢がありますが、GKEと手軽に連携ができる他、Cloud LoggingやCloud ArmorといったGCPのサービスとの連携もやりやすいという利点があるため、GCLBを利用しています。

Cloud Armor

Cloud Armorは、インターネットからアプリケーションへの攻撃を保護するIPフィルタリングやWAFなどの機能を持つGCPのマネージドセキュリティサービスです。外部APIを保護するために利用しています。

メインサービス

メインサービスは、Qmonus Value Streamが扱うリソースやCI/CD基盤を管理し、REST APIを提供しています。 NuxtJSを用いて実装されたユーザインタフェースと組み合わせて使用し、認証認可によるAPI保護のためにAuth0と連携しています。

NuxtJS

NuxtJSは、Vue.jsアプリケーションを作成するための多用な機能を備えたフルスタックフレームワークです。 NuxtJSといえばServer Side Rendering (SSR) やStatic Site Generation (SSG) の機能で有名ですが、ルーティングの自動生成やVuexのサポートなど、開発の助けとなる機能を豊富に備えています。

Qmonus Value StreamのフロントエンドはSingle Page Applicationとして構成されておりSSRを使用していないため、NuxtJSを使う必然性はないのですが、コア機能の実装に集中し開発速度を向上するためにあえて使用しています。

FastAPI

FastAPIは、Pythonのウェブアプリケーションフレームワークとして一般的なFlaskと同様のマイクロフレームワークです。 ブラウザに展開されたアプリケーションやKubernetesオペレータなどからのアクセスを受け付けるAPIサーバを構成するためのフレームワークとして利用しています。

FastAPIは、型システムを利用した堅牢性やStarletteを利用した高速な動作などが特徴です。 型システムとしてpydanticを採用しており、型定義をするだけでリクエストデータのバリデーション・シリアライズを実行してくれます。 API開発において、受け入れるデータのバリデーションやシリアライズは多くの労力と実装が必要なため、データ型を定義するだけで良いこの仕組みは開発において非常に嬉しい機能です。

また、APIコールバック関数の定義からOpen API Specification (OAS) を自動生成する機能もあります。OASを利用してAPIクライアントを自動生成し、フロントエンドアプリケーションで利用することで、開発を効率化しています。

Auth0

Auth0はWebアプリケーションやモバイルアプリケーション、APIなどに対して認証認可基盤をクラウドで提供するIDaaSサービスです。パブリッククラウドのIdPとの連携、OpenID ConnectやSAMLへの対応、さらに多要素認証にも対応しています。

Qmonus Value Streamでは、Auth0を利用することでユーザの認証と認可を実現しています。Auth0ではOAuth2.0やOpenID ConnectをインテグレーションするためのSDKを提供しており、手軽にAuth0とアプリケーションを連携させることができます。加えて、ソーシャルアカウント連携もAuth0の画面上で操作するだけ実現できます。これらの機能を用いることで、認可フローの実装やトークンの管理などに時間をかけずに、コア機能の開発に専念できています。

BigQuery

BigQueryはGCPが提供する、大規模なデータ処理が可能なマネージドデータウェアハウスです。主に、GCLBで取得したログやCI/CDタスクの実行履歴などの情報を保存しています。

BigQueryに格納されたCI/CDタスクのイベントログをBigQuery SQLで加工することで、ユーザ自身でデプロイ頻度などのDevOps Metricsを確認できる機能を提供しています。Qmonus Value Streamで提供しているDevOps Metricsの仕組みについては別の記事で紹介予定です。

Firestore・Cloud Storage

FirestoreはGCPが提供する、スケーラブルなマネージドNoSQLデータベースサービスです。Qmonus Value StreamのUIから設定する各種データや、CI/CDタスクを実行する際に生成されるTektonマニフェストなどを保存しています。 また、Firestoreに保存できないサイズや形式のBlobなどデータはCloud Storage (GCS) に保存しています。

CI/CD ログ基盤

CI/CD ログ基盤は、Tektonが生成したPodのログを収集・保存し、ユーザに提供する機能を担当しています。

Grafana Loki

LokiはGrafana Labsが公開している、複数のコンポーネントから構成されるログ収集基盤です。 主要なコンポーネントとして、収集したログを最初に処理しIngesterへ送信するDistributor、Distributorから送信されたログを任意のストレージへ保存するIngester、LogQLの形式でクエリを受け取り、検索処理を実行するQuerierが存在します。これらを組み合わせることによって、ログの収集と保存、検索を実現しています。また、Lokiは他のログ基盤とは異なり、ログのメタデータのみをインデックス化するため、ログを保存するコストが少ないという特徴があります。

Qmonus Value Streamでは、CI/CDタスクの実行ログの保存・閲覧機能を提供するためにLokiを使用し、ログを保存するためのバックエンドとしてGCSを用いています。 Tekton Pipelineで実行される処理は最終的にPod内のコンテナで実行されます。Lokiはこれらコンテナ内の標準出力を保存し、後から検索して参照できるようにしています。ユーザは、CI/CDタスクの実行中はWebsocketによりLokiを通してpod内のログを直接見ることができ、過去に実行したログはLokiを通してストレージに保存したログを参照することで確認できるようになっています。

Envoy

Envoyはサービスメッシュの通信バスやエッジプロキシとして利用可能な、Webサービスのために設計されたL4/L7プロキシソフトウェアです。認証機能を持たないLokiに対して、EnvoyプロキシをAuth0と連携させることで、アクセス元のユーザの認証・認可を実現しています。

CI/CD 実行基盤

CI/CD 実行基盤は、CI/CD機能を担うコンポーネントを実行するための基盤を提供する役割を担当しています。

AssemblyLine

AssemblyLineはQmonus Value Streamの独自コンポーネントです。Kubernetesカスタムオペレーターとして実装されており、複数のTekton Pipelineを順に実行するワークフローエンジンとしての機能を持ち、柔軟性の高いCI/CDパイプラインを構成・実行するために必要な様々な機能を有しています。

Qmonus Value StreamでのAssemblyLineの役割と実現方式の詳細な説明については第7回で解説しています。

Tekton

TektonはCI/CDシステムを作成するためのKubernetes Nativeなオープンソースフレームワークです。 TektonではStep、Task、Pipelineと呼ばれる概念があり、これらを組み合わせて順次実行することで柔軟なパイプラインを構成できるという特徴を持っています。 Qmonus Value StreamでのTektonの利用とTekton自体の詳細な説明については第5回で解説しています。

Qmonus Value Streamでは、コンテナビルド・デプロイ・リリースといったCI・CDの標準機能を基本タスクとして提供しており、Buildkit、CUE、Pulumiなどの技術を用いて実現しています。詳しくは第2回 (後編)を参照してみてください。

Metrics

Metricsは、Qmonus Value Stream上で実行されたCI/CDタスクの時系列データを収集し、後から利用できるようBigQueryへと保存しておく処理を担当しています。

Cronjob

CronjobはKubernetes上のリソースで、一般的に知られるCronと同様、スケジュールされた時間に任意の処理を実行させることができます。 CronjobはJobと呼ばれるリソースを介してPodを作成することで、そのPodが管理するコンテナ上で任意のプロセスを実行します。

Qmonus Value StreamではCI/CDタスクの実行履歴がFirestoreに保存されているため、データ解析のためにCronjobを用いてBigQueryへ転送しています。任意のスケジュールタスクの実行にはBigQueryスケジューラなどの利用が考えられますが、実行工数の低さや、実行履歴の管理などの観点からCronjobを採用しています。

Monitoring

Monitoringは、各コンポーネントの稼働状況とパフォーマンスを計測、可視化し、一定のしきい値を超えた場合はユーザや私たち開発者に通知する役割を担当しています。

Datadog

DatadogはSaaSベースの運用監視と分析サービスです。 GCPやAmazon Web Service (AWS)、Microsoft Azureなどのクラウドサービスをサポートしており、プラットフォームを横断して監視対象のアプリケーションを管理できます。 データ収集と可視化に加え、インフラ監視やApplication Performance Monitoring (APM)、Logの管理といったことも行うことができます。

Qmonus Value Streamでは監視対象のGKEにDatadog Agentを導入することで、ディスクI/OやCPU利用率、ネットワークトラフィックなどのシステムレベルのデータを収集し、Datadog上で可視化しています。 また、CPU利用率とメモリ利用率は実行するCI/CDタスクのパフォーマンスにも影響することから、設定したしきい値を超えた場合にSlackでアラートを通知することで、インフラの状況を把握しやすい環境を構築しています。

GCP Service Log

GCP Service Logは、GCPの各サービスで取得可能なログを集約し、後から参照できるよう用途に応じたストレージへ保存する役割を担当しています。

Cloud Logging

Cloud LoggingはGCPが提供するマネージドサービスで、GCP上のリソースで生成されるログのストレージ設定や検索、分析、アラートなどの機能が利用できます。 Cloud Loggingで収集されたログは、ログバケットやGCS、BigQueryに保存できます。

Qmonus Value Streamではログを確認する一般的な用途に加え、参照する頻度は低いが長期間保存したいログはGCSのバケットへ、分析対象となるログはBigQueryのデータセットへと分けて保存するといったストレージ設定も利用しています。

おわりに

DevOpsプラットフォームの取り組み連載の8回目の記事として、Qmonus Value Streamを支えるアーキテクチャと主要な技術スタックを紹介しました。紹介したアーキテクチャは現在のスナップショットであり、今後も更新を続けていく予定です。 全ての要素についてはご紹介できませんでしたが、サービスを構成するアーキテクチャの一例として参考になれば嬉しいです。

Qmonus Value Streamチームは、メンバ一人一人が、利用者であるアプリケーション開発者のために信念を持って活動を続けています。 プラットフォームを内製開発するポジション、プラットフォームを使ってNTTグループのクラウド基盤やCI/CDを構築支援するポジションそれぞれで 、一緒に働く仲間を募集していますので、興味を持たれた方は応募いただけると嬉しいです。

次はQmonus Value Streamにおける開発スタイルと内部アーキテクチャについて紹介します。 お楽しみに!

© NTT Communications Corporation 2014