モダンアプリケーション入門

2025/03/10

プログラミング

モダンアプリケーションとは

モダンアプリケーションとは、継続的にアプリケーションの設計、構築、管理を見直し、市場やユーザーのニーズの変化に柔軟に対応し、顧客価値を最大化するために進化し続けることのできる開発戦略のこと。モダンアプリケーションの導入によって、例えば次のような恩恵が受けられる。

  • リクエストの増加に柔軟に対応できる
  • 新機能を素早くユーザーに提供できる
  • 一部機能に不具合が発生しても他の機能に影響しない
  • 障害発生時に原因の特定、対応が容易
  • 適切なクラウドサービスを利用することで、最もビジネスの差別化を生み出す部分にリソースを集中させることができる
  • モダンアプリケーションを実現するための構成要素として、しばしば次のようなものが挙げられる。

  • クラウドネイティブ
  • モジュラーアーキテクチャ
  • サーバーレス技術/コンテナ技術
  • データベース技術
  • モニタリング
  • CI/CD(継続的インテグレーション/継続的デリバリー)
  • IaC(Infrastructure as Code)
  • クラウドネイティブ

    クラウドネイティブとは、AWSなどのクラウドサービスの利用を前提にアプリケーションを設計する開発手法で、サーバーの管理の手間が省きながら、必要な分だけコンピューティングリソースを利用することができるため、モダンアプリケーションの実現が容易になる。

    モジュラーアーキテクチャ

    モジュールアーキテクチャでは、アプリケーションをモジュールごとに分離するため、他のモジュールに影響を与えることなく、アプリケーションの各モジュールを進化させることが容易になる。これによって、継続的にアプリケーションの設計を見直し、変更に柔軟に対応していくことが可能になる。

    代表的なモジュラーアーキテクチャには、モノリシック、モジュラーモノリス、マイクロサービスがある。

    Notion Image

    サーバーレス技術/コンテナ技術

    サーバーレスを利用すると、必要なランタイムやソフトウェアのインストール、継続的なバッチの適用などをクラウドサービス側に任せることができ、運用コストを大幅に削減し、ユーザーはアプリケーション開発に集中できるようになる。その他にも、サーバーレスによって得られる恩恵には次のようなものがある。

  • サーバー管理が不要
  • 柔軟なスケーリング
  • 利用分のみの従量課金
  • 自動化された高可用性
  • サーバーレスを検討する際に、コンテナが比較される場合も多い。コンテナはアプリケーションの実行環境をパッケージ化し、任意の場所に持っていってデプロイ、実行することを可能にした技術。コンテナを利用することで、手元の開発環境から本番環境まで、どこでも一貫した形でアプリケーションを実行できる。さらに、コンテナオーケストレーターを利用することで効率的な運用が可能になり、ユーザーはアプリケーション開発に集中できるようになる。

    サーバーレスとコンテナをどのように使い分けるかについての明確な回答は存在しないが、指針の一つとして「どの選択肢がアプリケーション開発により多くの時間を投下できるか」という観点での考え方がある。この考え方に従うと、AWS LambdaとAmazon ECSのどちらでも要件を満たせるのなら、アプリケーションの構築に必要な作業が少なく、よりアプリケーション開発に集中できるAWS Lambdaを採用するということになる。一方で、アプリケーションの実行時間が長く、AWS Lambdaの制限に引っかかってしまう場合は、ECSを採用することになるが、その際コンテナの実行環境の選択(Amazon EC2とAWS Fargateのどちらか)についても、どちらでも要件を満たせるのなら、同様の基準から、よりアプリケーション開発に集中できるAWS Fargateを採用することになる。

    データベース技術

    モダンアプリケーションでは、データベースも要所要所で要件にあったものを選択する必要がある。データベースを選択する際に検討すべき要件を以下に示す。

  • データ量 データベースに保存するデータサイズやデータ件数。数万件なのか、数百万件なのか、はたまた数億件規模かなど。
  • データ増減パターン データ量がある程度一定なのか大きく増減するか。一週間に1件ずつしか増えないのか、ユーザー数によって大きく増える可能性があるのかなど。
  • 保持期間 データをいつまで保持する必要があるのか。直近1年なのか、5年なのか、あるいは無期限保持しておくのかなど。
  • アクセスパターン 参照、追加、更新、削除のどのアクセスパターンを受け入れるのか。またそれぞれの利用回数に傾向はあるのか。一度追加された後は参照が多くなるのか、参照は少なく新規の追加が多いのかなど。
  • 形式 データの形式。リレーショナル、キーバリュー、インメモリ、ドキュメント、ワイドカム、グラフ、時系列、台帳など。
  • 一例としてあるアプリケーションのお気に入り機能のデータ要件を以下に示す。

  • データ量:100万件 サービスの伸びを考慮してユーザー1万人×お気に入り100個
  • データ増減パターン:ユーザー数の増加に伴って増加、お気に入り登録数には上限を設ける
  • 保存期間:無期限
  • アクセスパターン:登録、参照、削除がバランスよく
  • 形式:キーバリュー
  • モニタリング

    ユーザーのニーズに合わせて、アプリケーションを進化させていくには、ビジネスやアプリケーションの状態を適切にモニタリングして把握しておく必要がある。取得すべきデータは大別して、ビジネスデータ、運用データ、システムデータの3つがある。それぞれのデータの具体例を以下に示す。重要なのは、データを取得できるようにアプリケーションが構築されていることである。各自の状況に応じて、ビジネスやアプリケーションの状態をモニタリングするためにどんなデータが必要で、そのデータを取得するために、どのようにアーキテクチャを構成し、どのようにアプリケーションを実装するか、事前に検討しておくと良い。


    ビジネスデータ

  • アクティブユーザー数
  • 新規会員登録者数/退会者数
  • 商品の販売数
  • 閲覧数/検索数
  • 滞在時間
  • etc…

  • 運用データ

  • 運用担当者の呼び出し回数
  • 設定変更などの運用作業のチケット数
  • チケットが完了するまでの経過時間
  • 1日あたりのデプロイ数
  • サービス可用性
  • etc…

  • システムデータ

  • リクエスト数
  • リクエストのエラー数
  • リクエストの処理時間
  • etc…
  • CI/CD(継続的インテグレーション/継続的デリバリー)

    アプリケーションを継続的に進化させていくには、複数のエンジニアのソースコードが継続的に統合され(継続的インテグレーション)、それをトリガーにしてテスト、ビルド、リリースが自動的に実施され、ユーザーのもとに継続的にアプリケーションが提供される(継続的デリバリー)ことが重要である。

    CI/CDパイプラインの構築は、それ自体が直接的にユーザーに価値を提供するわけではないので、アプリケーション開発と比較して優先順位が低くなりやすい。だが、CI/CDパイプラインが構築されていないと、面倒でバグの入り込みやすい手動でのデプロイ作業を何度も繰り返すことになり、そのせいでリリースの頻度が1ヵ月に1回、2ヵ月に1回と少なくなってしまうこともある。初めから自動化の恩恵を受けられるように、開発の初期段階でCI/CDパイプラインを構築しておくことが望ましい。

    参考資料



    著者画像

    ゆうき

    2018/04からITエンジニアとして活動、2021/11から独立。主な使用言語はPython, TypeScript, SAS, etc.