ITエンジニアkenkenのアウトプット場

技術トレンド、読んだ書籍、やってみた系について書いていきます。

エンジニアなら知っておくべきモダンアプリケーション開発プラクティス

AWSからモダンアプリケーション開発のホワイトペーパー(日本語版)が2020年1月7日に公開された。 「AWSモダンアプリケーション開発-AWSにおけるクラウドネイティブ モダンアプリケション開発と設計パターン」というタイトル。

aws.amazon.com

AWS上でアプリケーションを開発している開発者からマネジメント層までが対象読者で、モダンアプリケーション開発における6つのプラクティスを紹介し、AWSのサービスを利用した設計パターンが説明されている。

AWSを利用するしないに関わらず、モダンアプリケーション開発に参考になることばかりであった。この記事では、モダンアプリケーション開発に共通して重要と思われる部分をまとめた。

モダンアプリケーション開発

企業がビジネスを成長させ、成功を収めるには新しい製品をすばやく発明していく必要がある。 これを実現するために、企業はアプリケーションの設計、構築、管理の手法を継続的に 更新している。これをモダンアプリケーション開発と呼ぶことにする。

モダンアプリケーション開発のプラクティスは、企業がイノベーションに見合ったスピードと俊敏性を実現するのに役立つ。 大部分の企業では、クラウドネイティブのアプリケーション構築によって、 管理オーバーヘッドに費やす時間が減り、コアビジネスにさらに集中できることが 明らかになっている。

モダンアプリケーションの機能

モダンアプリケーションは次のような特徴を備えている必要がある。

  • セキュリティ
    • どのようなアプリケーションにおいても重要
    • すべての階層とライフサイクルの各段階に、セキュリティ対策を実装することが必要
  • 弾力性
    • 例えば、外部データソースの呼び出し時に障害が発生しても、そこで応答が停止することなく、呼び出しを再試行するか、例外処理を実行する
    • 同時に、動作を継続させつつ、機能をグレースフルに低下させていく
    • マイクロサービスアーキテクチャ、他のサービスとのやりとりにも適用される
  • 伸縮性
    • スケールイン・スケールアウトすることでビジネスチャンスを逃すことなくコストを最適化する
    • 自動スケーリング機能を提供するマネージドサービスの使用により、日常的な管理業務の負担を軽減し、機能停止による深刻な中断を防止できる
  • モジュール化
    • 高い凝集度と低い結合度が実現されている
    • 大規模なシステムは単一のモノリスにしてしまうのではなく、ドメインの境界にしたがって、それぞれが特定の役割を果たす個別のコンポーネントへと分解する
    • さまざまなコンポーネントを個別にデプロイできるようになる
  • 自動化
    • インテグレーションとデプロイを自動化し、高品質のリリースを頻繁に実施することが必要
    • アジャイルな開発と頻繁なリリースをサポートするため、モダンアプリケーションのデプロイは継続的インテグレーションと継続的デリバリーのパイプラインによって実施することが必要
  • 相互運用性
    • それぞれのサービスが別のサービスとやりとりし、リクエストされたリソースを提供し、要求されたタスクを実行する
    • 各サービスの詳細な実装はプライベートな実装に保ち、必要な機能は堅牢なパブリックAPIを通じて公開する必要がある

モダンアプリケーションのベストプラクティス

マイクロサービスアーキテクチャ
  • モノリシックアプリケーションでは、サイズの肥大化に伴って機能の追加や変更が困難になる
  • わずかな変更に対しても時間がかかる回帰テストが必要になり、新機能の開発が遅れる
  • マイクロサービスアーキテクチャ疎結合コンポーネントによって構築されたアプリケーションでは、新機能やバグ修正の多くを単体サービスのレベルで実装できるため、より迅速なリリースが可能になる
  • 疎結合を実現するには、システム内のマイクロサービスが相互に通信する必要がある
  • 1つのプロセスを実行するために多数のマイクロサービスが接続されている場合、エンドツーエンドの単一タスクの状態をモニタリングする方法が必要
サーバーレステクノロジーの利用

組織のアプリケーションを実行するためにサーバーやOSの運用とメンテナンスを行う場合は、 システム管理者が単純な反復タスクに時間を費やさざるを得ない。 また、リクエストのボリュームに応じて柔軟にスケールアップすることは難しいため、 システム管理者は可用性と耐久性の要件を慎重に検討しながら、ピーク時のボリュームに 備えてサーバーをあらかじめプロビジョニングしておく必要がある。

サービスを利用することでこのような負担は軽減が可能だが、サーバーレスで構築すれば、 サーバーの管理とプロビジョニングさえ不要になる。

CI/CDを使用したデプロイの自動化

モダンアプリケーション開発ではリリースプロセス全体を自動化する。 CI/CDパイプライン全体は任意の数の品質ゲートとコントロールで構成される。

新しいコードは、本番環境への反映前にそのすべてに合格する必要がある。 プロセス全体が自動化されると速度も向上するので、1度のデプロイに含まれる変更の 数が減り、リスクも低くなる。 コードのコミットからデプロイまでの時間が手動プロセスに比べて大きく短縮されるため、 優先度の高いセキュリティ修正や設定変更にも特別なホットパッチが不要で、標準のパイプラインで リリースできる。

コードとしてのインフラストラクチャの管理

アプリケーション全体とInfrastructure as Codeのモデルを作成する必要がある。 インフラストラクチャはコードとしてモデル化すると、標準のアプリケーション開発ライフサイクルに 組み込み、インフラストラクチャの変更をCI/CDパイプラインで実行できる。

モニタリングとログ記録

モダンアプリケーション開発者には、モニタリングツールとログ記録ツールを使用してアプリケーションの実行時の動作をモニタリングし、そのデータを使用してカスタマーエクスペリエンスの維持や改善を図ることが求められる。 最新のデジタル製品では、アプリケーションログ、モバイルデバイスからのデータ、ウェブのクリックストリーム、IoT センサーのデータ、その他の使用状況データなど、数多くの種類のデータをモニタリングする場合がある。 これらのデータは製品の拡張と強化を続けるために活用していく必要がある。

モダンアプリケーションのチェックリスト
  • セキュリティとコンプライアンスが、アプリケーションのライフサイクル全体に組み込まれている
  • アプリケーションはマイクロサービスの集合として構造化されている
  • 可能な限りサーバーレステクノロジーが使用されている
  • 高品質の機能を迅速に提供するためにCI/CD が使用されている
  • インフラストラクチャはコードとして開発され、デプロイされている
  • アプリケーションの動作について深く理解するためにモニタリングツールが使用されている