ARISE analytics流SaaS開発・運用術 #1 TerraformとArgoCDで開発効率化

こんにちは。Marketing Solution Division(MSD)でDevOpsエンジニアと活動している山中です。
ARISE analyticsの提供するSaaSプロダクトを「1.新規顧客に迅速に提供(オンボーディング)する」「2.継続的なアップデートを提供(CD)する」ためにTerraformとArgoCDを活用した社内システム統合管理環境を構築しました。
今回はSaaSプロダクトの開発・運用という観点から、統合管理環境の機能とメリットを解説します。

Terraform, ArgoCDとは?

まずは統合管理環境の要であるTerraformとArgoCDについて見ていきましょう。すでにご存知の方は「統合管理環境とは」のセクションまでスキップしてください。

Terraform

TerraformはInfrastructure as Code(IaC)を実現するツールです。 詳細については素晴らしい解説記事がありますのでここでは割愛します。
ARISEのSaaS開発で導入する主なメリットは下記が挙げられます。

1.プロダクトのインフラを迅速に構築できる
Terraformはソースコードでインフラリソースを定義するため、別のテナントに対してもコードの使い回しが可能です。
ARISE analyticsのSaaSプロダクトはAWS上で稼働しています。またテナント分離[^1]には、テナント毎に異なるAWSアカウントを利用するシングルテナントの形態を取っています。
Terraformを用いることで新規顧客のオンボーディングの際には任意のAWSアカウントにリソースを自動構築することが出来ます。

2.クラウドリソースを宣言的に管理できる
Terraformではクラウドインフラの所望の状態をソースコードで記述(=宣言)します。ソースコードを確認することでクラウド上の現在のリソース全体像を把握することが出来ます。
そのため別途ドキュメントなどでリソース管理などを行う必要が無くなり管理コストを削減できます。

ArgoCD

ArgoCDはKubernetes(K8s)クラスタ上で動作する、GitOpsを実現するCDツールです。ArgoCDの詳細についても他の解説記事に譲るとして、開発・運用に導入するメリットを取り上げます。

図1:ArgoCDの操作画面

GitOpsとGUI操作による運用負荷の削減

K8sクラスタ上のアプリケーションの開発・運用はK8sについてやマニフェスト、専用UI(kubectl等)の知識が必要となります。そのためK8sに馴染みのないアプリ開発者や運用者がDevOpsを実現する際の障害になり得ます。
ArgoCDを用いることでマニフェストの変更やkubectlなどの操作を隠蔽し、GUIの操作でデプロイ・ロールバック・ヘルスチェックなどの操作を完結する事ができます(図1)。そのためK8sに習熟してないアプリ開発者や運用者だけでも円滑なDevOpsを実現できます。

統合管理環境とは

統合管理環境はTerraform・ArgoCDに加えてAWSリソースを組み合わせることで、それぞれを単体で利用する以上のメリットを実現します。統合管理環境の下記2つの機能について解説します。

1.基盤構築機能

2.アプリケーション管理・開発機能

1.基盤構築機能

図2:基盤構築機能構成

基盤管理機能はTerraformを用いて、K8sクラスタ(EKS)を含めたAWSリソースを任意のAWSアカウントに構築します。下記が主な特徴です。

  • Terraformソースコードと依存関係をDocker imageとしてパッケージングしている
  • AWS Batchをトリガーとして、fargate(ECS)でコンテナを稼働してTerraformの実行する

    Terraformをローカル環境ではなくコンテナ化する[^2]メリットとして運用者がローカル実行環境を構築不要な点や、運用者間で環境差分が発生しない点が挙げられます。ローカル実行環境ではTerraformクライアントのバージョンや依存関係の差分が個々の運用者間で発生する可能性があります。
    またAWS Batchを用いることのメリットはオペレーションミス防止への貢献です。実行時にはAWSコンソールにログイン後パラメータをjobに追記してsubmitするだけで良いため、運用負荷は少なくて済みます。

    2.アプリケーション管理・開発機能

    図3:アプリケーション開発管理機能構成

    アプリケーション管理・開発機能はArgoCDを用いて基盤管理機能で構築されたK8sクラスタ上に継続的なアプリケーションデプロイ(CD)を行います。下記が主な特徴です。

    • 複数のK8sクラスタを一元管理する
    • ArgoCDが稼働するK8sクラスタ(ソースクラスタ)とアプリケーション用のK8sクラスタ(ターゲットクラスタ)を、Transit Gatewayを用いて1:多関係のプライベートネットワークで接続する

    各ターゲットクラスタのアプリケーションをソースクラスタ上のArgoCDで一元管理することでSaaS提供先テナントが増加しても管理コストの増加を抑えることが出来ます。仮にテナントが5社、各テナントにつき開発・検証・本番の3環境が必要な場合は3 * 5 = 15(個)の環境を個々に管理する必要があり、個別に操作する場合は管理コストが増大します。ArgoCDから各ターゲットクラスタを接続すれば全ての環境を一箇所で操作・管理することが可能になれば管理コストを抑えることが出来ます。(図4)

    図4:ArgoCDによる複数クラスタ・アプリ管理

    また各クラスタのVPCはTrasit Gatewayを用いて、ソースクラスタを中心としたスター型のネットワーク・トポロジーで接続されています(図5)。Trasit Gatewayにより、ソースクラスタとターゲットクラスタの通信はインターネットを経由しないプライベートネットワーク接続となるためセキュリティ上安全な通信を確保できます。
    もちろん個々のターゲットクラスタ同士のネットワークルーティングは行っていないため「テナントAのK8sクラスタ <-> テナントBのK8sクラスタでの直接的なプライベート通信」といったインシデントは発生しません。

    図5:クラスタ間のネットワーク構成

    おわりに

    今回はArgoCD・Terraformやそれらを活用した統合管理環境について機能・構成・メリットを「SaaSプロダクトの開発運用の効率化」という観点で解説しました。#2では実際に、「異なるAWSアカウント上に存在するソースクラスタとターゲットクラスタをTransit Gatewayでプライベートネットワーク接続する方法」を解説します。お楽しみに!
    またARISE analyticsではモダンなDevOps技術を用いてより良いプロダクト開発を実現する仲間を募集しています!ご興味のある方はこちらのページからご連絡をお待ちしています!

    脚注

    [^1]: テナントとは、SaaS を利用する顧客の契約の単位です。またテナント分離とはテナント毎にどのようにアプリやインフラを分割するかという考え方です。詳細はこちらのページを参照下さい。

    [^2]: Terraformの実行環境にはHashiCorpが提供するTerraform Cloudがありますが、今回の統合管理環境では「機能をAWS上で完結させる」という要件があったため本記事で紹介する構成としました。

    関連記事