サーバレス構成におけるAzureアーキテクチャの検討①

## 0.はじめに
**本記事ではサーバレス構成を例にAzureのアーキテクチャ検討のノウハウをご紹介します。**

実際のPJで基盤検討メンバとして、Azureのアーキテクチャの検討に携わる機会がありましたので、ポイントだと感じた部分をピックアップして紹介します。（偏りがありますが、ご容赦ください）

:::note info
こんな方にオススメ 
・Azureのアーキテクチャの検討をやったことがない
・他の人がAzureアーキテクチャを検討する際の考え方を知りたい
・Azureに関する技術情報が知りたい
:::

## 目次
- [0.はじめに](#0はじめに)
- [1. 本ブログで記載するアーキテクチャ検討](#1-本ブログで記載するアーキテクチャ検討)
- [2. 前提](#2-前提)
- [3. 検討ポイント](#3-検討ポイント)
  - [3-1. アプリケーションのホスティング](#3-1-アプリケーションのホスティング)
  - [3-2. データベース選定](#3-2-データベース選定)
  - [3-3. 非同期処理](#3-3-非同期処理)
  - [3-4. 複数のリージョンへのトラフィックの負荷分散](#3-4-複数のリージョンへのトラフィックの負荷分散)
  - [3-5. 静的コンテンツ配信の保護](#3-5-静的コンテンツ配信の保護)
- [4. まとめ](#4-まとめ)


### 1. 本ブログで記載するアーキテクチャ検討
アーキテクチャ検討というと、システムアーキテクチャ図を作成することをイメージする方が多いと思います。

本ブログでは、システムアーキテクチャ図を作成する前の作業として、システムの要件を実現するために、各コンポーネントをどのように構成するか検討するポイントを、基盤担当の目線でご紹介します。

### 2. 前提
前提は以下の通りです。
・イベント駆動型のアプリケーションを検討する
・非同期処理を検討する
・セキュリティを高める構成を検討する

### 3. 検討ポイント
### 3-1. アプリケーションのホスティング
アプリケーションのソースコードをどのコンピュートリーソースにホスティングするか、いくつか選択肢があります。

MSの公式サイトにコンピュートリソースを決定するためのディシジョンツリーがありますので、こちらを活用すると意思決定しやすいかと思います。

![1_スクリーンショット 2024-12-03 124743.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3923708/71a3981c-17f8-0f8b-4ae1-cbc3baea09ea.png)
><引用元>Azure コンピューティング サービスを選択する
https://learn.microsoft.com/ja-jp/azure/architecture/guide/technology-choices/compute-decision-tree

前提に記載したとおり、今回はイベント駆動としているため、Azure Functionsとなります。もし、アプリケーションの処理時間が長時間になることが想定される場合は、Azure App Serviceも選択肢となります。

Azure App Serviceが良い点は、制約はありますが証明書の自動更新が可能である点です。
運用をオフロードできるのはポイントが高いです。

https://learn.microsoft.com/ja-jp/azure/app-service/configure-ssl-certificate?tabs=apex%2CRBAC

Azure Functionsは、HTTPリクエストなどのイベント駆動型で、動くアプリケーションに最適であり、高いスケーラビリティと可用性が特徴です。

https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-overview?pivots=programming-language-csharp


また、関数アプリを統合的に管理したい場合は、Azure API Managementを関数アプリの前段に配置する構成が考えられます。

Azure API Managementは様々な機能が利用できますが、特に関数アプリの前段で認証を行うことで、複数の関数アプリを統合的に保護できる点が有用です。

https://learn.microsoft.com/ja-jp/azure/api-management/authentication-authorization-overview

Azure API Managementを利用しない場合の選択肢として、Azure Functionsのエンドポイントを直接公開することも可能です。その場合、以下のメリット・デメリットがあります。小規模なシステムの場合やシンプルな構成としたい場合、マッチするのではないでしょうか。

:::note info
■メリット
・実装がシンプル
・コストを抑えることができる

■デメリット
・其々の関数で認証、レート制限など実装する必要がある
・統合的な管理が難しい
:::


### 3-2. データベース選定
業務アプリケーションで利用するデータの格納先として、どのデータベースを選定するかについては、複雑なトランザクションを意識する必要があるかが大きな分岐点かと思います。

複雑なトランザクションが必要な場合は、リレーショナルデータベースを選定することになります。
リレーショナルデータベースの種類としては、Azure SQL Database、Azure Database for MySQL、Azure SQL Database Managed Instance等があります。詳細は、以下をご参照ください。

https://azure.microsoft.com/ja-jp/products/category/databases/#:~:text=%E3%82%A4%E3%83%B3%E3%83%86%E3%83%AA%E3%82%B8%E3%82%A7%E3%83%B3%E3%83%88%E3%81%A7%E7%84%A1%E5%88%B6%E9%99%90%E3%81%AE%E4%BF%A1%E9%A0%BC%E3%81%A7%E3%81%8D%E3%82%8B%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%20%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%80%81%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%97%E3%80%81%E5%A4%89%E6%8F%9B%E3%81%97%E3%81%BE%E3%81%99%E3%80%82%20Azure%20%E3%81%A7%E3%81%AF%E3%80%81%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E3%83%8B%E3%83%BC%E3%82%BA%E3%81%AB%E5%90%88%E3%82%8F%E3%81%9B%E3%81%A6%E3%83%AA%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB,%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%A8%E9%9D%9E%E3%83%AA%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%20%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%82%92%E9%81%B8%E6%8A%9E%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82%20%E7%B5%84%E3%81%BF%E8%BE%BC%E3%81%BF%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%86%E3%83%AA%E3%82%B8%E3%82%A7%E3%83%B3%E3%82%B9%E3%81%AF%E3%80%81%E9%AB%98%E5%8F%AF%E7%94%A8%E6%80%A7%E3%80%81%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E3%80%81%E3%82%AF%E3%82%A8%E3%83%AA%20%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%81%AA%E3%81%A9%E3%81%AE%E7%AE%A1%E7%90%86%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8B%E3%81%AE%E3%81%AB%E5%BD%B9%E7%AB%8B%E3%81%A1%E3%81%BE%E3%81%99%E3%80%82?msockid=33b6bcaef875631c33d7a8a7f906622e

:::note warn
<留意事項>
過去にAWSの案件を担当した時に検討課題となったことがあるのですが、リレーショナルデータベースを選択した場合の注意点として、水平方向にスケールアウトするには、何らかの方法でデータをシャード化する必要があります。拡張性の要件がある場合は、判断ポイントの一つになるかと思いますので、頭の片隅に入れておくと良いかもしれません。
:::
   
特にリレーショナルデータベースが必須でない場合は、業務アプリケーション次第ではありますが、拡張性に優れたNoSQLを選択することになるかと思います。
加えて、以下の点を考慮する場合、**Azure CosmosDB**を選択するのがよいかと思います。

:::note info
・複雑なトランザクションを意識する必要がない
・アプリケーションがキーバリュー型のデータモデルに適している
・大量のトラフィックに対応可能
・自動バックアップやポイントインタイムリストアに対応可能
・大規模なリージョン障害が発生した場合にも対応可能
:::


https://learn.microsoft.com/ja-jp/azure/cosmos-db/provision-throughput-autoscale

https://learn.microsoft.com/ja-jp/azure/cosmos-db/continuous-backup-restore-resource-model

https://learn.microsoft.com/ja-jp/azure/reliability/reliability-cosmos-db-nosql
   
少し話はそれますが、最近、正式に利用可能となった動的スケーリング（リージョンごとおよびパーティションごとのオートスケール）という機能があります。特定のパーティションに負荷が集中するケースなどで、コストを削減したい場合に効果を発揮しそうです。

https://learn.microsoft.com/ja-jp/azure/cosmos-db/autoscale-per-partition-region

### 3-3. 非同期処理
非同期処理を組み込むことで、後続の処理がすべて完了する前にレスポンスを返すことができたり、アプリケーション間の依存関係を減らすことで、障害時の影響範囲を限定できます。

非同期処理を実現する場合は、キューイングサービスを組み込むとよいかと思います。
Azureのキューイングサービスには、Azure Queue StorageやAzure Service Busがあります。

Azure Service Busを選択すると、配信不能キューや順序の保証が可能であったり、リトライ処理も容易に実装できるため、アプリケーションの信頼性を高めることができます。

https://learn.microsoft.com/ja-jp/azure/service-bus-messaging/service-bus-async-messaging

一方で、シンプルで低コストなキューイングサービスを利用したいのであれば、Azure Queue Storageを選択するとよいかと思います。

https://learn.microsoft.com/ja-jp/azure/storage/queues/storage-queues-introduction

### 3-4. 複数のリージョンへのトラフィックの負荷分散
複数のリージョン間でアプリケーションのトラフィックを効率的に分散し、可用性やパフォーマンスを向上させるためには、グローバル負荷分散を構成することになるかと思います。

選択肢として、Azure Traffic ManagerとAzure Front Doorが候補にあがります。

単純にDNSのベースのルーティングを行いたい場合は、Azure Traffic Managerを選択することになります。

一方で、以下のようなケースの場合、Azure Front Doorを選択すると良いかと思います。

:::note info
・WAFやDDoS保護と組み合わせて利用し、セキュリティ境界を設けたい
・URLパスベースのルーティングをさせたい
・低遅延なコンテンツ配信が求められるなど
:::

 
https://learn.microsoft.com/ja-jp/azure/frontdoor/front-door-overview

### 3-5. 静的コンテンツ配信の保護
静的コンテンツ(ストレージアカウントに格納)を保護する手段として、Azure Front Door Premium + Private Linkを組み合わせて利用することができます。この方式により、ストレージアカウントをパブリックにアクセス可能にする必要がなくなり、セキュリティを高めることができます。

https://learn.microsoft.com/ja-jp/azure/frontdoor/private-link

### 4. まとめ
サーバレス構成を例に主にアプリケーションに周りのAzureのアーキテクチャ検討のノウハウをご紹介しました。

実際のPJにおいては、要件によって、何を検討するか、検討の結果、どのアーキテクチャを選定するか変わってくるかと思います。一例として、本ブログでお役に立てる部分があれば幸いです。

他にもネットワーク観点や運用観点など、紹介したい内容がありますので、
続きは、どこかのタイミングで公開できればと思います。

:::note info
過去のブログで、Azureのサービスプランの選定方法を紹介してます。
興味のある方は、目を通して頂けるとありがたいです。　

https://qiita.com/bluesea_nishi/items/4bcf46239a9d8758f81a
:::

:::note warn
留意事項
・2024年11月時点の情報となります。Azureサービスの仕様等、変更になる可能性がございますので、最新の情報をご確認ください。
・個人の見解であり、会社と一切関係がありません。
:::