仮想ネットワークに統合されたサーバーレス マイクロサービス

Azure API Management
Azure Cosmos DB
Azure Functions
Azure Key Vault
Azure Virtual Network

この Azure ソリューションでは、Azure API Management (APIM) が単一のマネージド エンドポイントを介して API へのアクセスを制御します。 アプリケーション バックエンドは、患者カルテと監査レコードを作成および管理する、相互に依存する 2 つの Azure Functions マイクロサービス アプリで構成されています。 APIM と 2 つの関数アプリは、ロックダウンされた仮想ネットワーク経由で相互にアクセスします。

この記事と、関連するコード プロジェクトでは、シナリオ例を主要な技術的要素に絞り込んで、特定の実装のスキャフォールディングとして機能するようにしています。 このソリューションでは、Terraform を使用してコードとインフラストラクチャのすべてのデプロイを自動化しており、自動化された統合テスト、単体テスト、ロード テストが用意されています。

アーキテクチャ

次の図は、患者カルテの作成要求フローを示しています。

Diagram showing virtual network integrated microservices.

このアーキテクチャの Visio ファイルをダウンロードします。

ワークフロー

  1. 外部のサービスとクライアントは、APIM に POST 要求を行います。データ本文には、患者情報が含まれています。
  2. APIM は、指定された患者情報を使用して、Patient APICreatePatient 関数を呼び出します。
  3. Patient APICreatePatient 関数は、Audit APICreateAuditRecord 関数を呼び出して監査レコードを作成します。
  4. Audit APICreateAuditRecord 関数で Azure Cosmos DB に監査レコードを作成し、Patient APICreatePatient 関数に成功応答を返します。
  5. CreatePatient 関数は、Azure Cosmos DB に患者ドキュメントを作成し、APIM に成功応答を返します。
  6. 外部のサービスとクライアントは、APIM から成功応答を受信します。

Components

このソリューションでは、次のコンポーネントを使用します。

  • Azure API Management (APIM): あらゆる環境にわたって API を管理するためのハイブリッド、マルチクラウド プラットフォームです。 このソリューションでは、APIM によって、Patient API への内部アクセスとサード パーティのアクセスが制御され、データの読み取り/書き込みが許可されます。 APIM を使用すると、さまざまな認証メカニズムと簡単に統合できます。

  • Azure Functions: イベントドリブンの小さなコードを処理するサーバーレス コンピューティング プラットフォームです。 クラウド インフラストラクチャは、関数を大規模に実行するために必要な更新済みサーバーを提供します。 現在のソリューションでは、患者の検査結果と監査レコードに対する操作を作成および管理する 2 つの Azure Functions API マイクロサービスを使用しています。

  • Azure Virtual Network: ネットワーク アクセスを特定の IP アドレスまたはサブネットに制限することで、分離され、高度なセキュリティで保護されたアプリケーション環境を実現します。 APIM と Azure Functions では、どちらも仮想ネットワークでのアクセス制限とデプロイがサポートされています。 このソリューションでは、リージョンの仮想ネットワーク統合を使用して、同じリージョンの同じ仮想ネットワークに両方の関数アプリをデプロイします。

  • Azure Key Vault: キー、証明書、接続文字列を一元的に保存、暗号化し、これらへのアクセスを管理します。 このソリューションでは、指定された ID だけがアクセスできる Key Vault に、Azure Functions ホスト キーと Azure Cosmos DB 接続文字列を保持します。

  • Azure Cosmos DB: 瞬時に自動スケーリングされるフル マネージドのサーバーレス データベースです。 現在のソリューションでは、両方のマイクロサービスが MongoDB Node.js ドライバーを使用して、Azure Cosmos DB にデータを保存します。 これらのサービスはデータを共有しないので、各サービスを独自の独立したデータベースにデプロイできます。

  • Application Insights: Azure Monitor の機能です。アプリケーションのパフォーマンス、使用状況、可用性、動作について報告し、異常を検出して診断を支援します。

    マイクロサービスベースのアーキテクチャの障害は、さまざまなコンポーネントに分散していることが多く、サービスを個別に調べても診断できません。 これらの問題を診断するには、コンポーネント間でテレメトリを相互に関連付ける機能が不可欠となります。 Application Insights Telemetry は、要求パイプライン全体に沿ってログを一元化して、パフォーマンスの異常を検出します。 テレメトリは共通の操作 ID を共有するので、コンポーネント間の関連付けが可能になります。

    APIM と Azure Functions ランタイムには、Application Insights のサポートが組み込まれており、標準のアプリケーション出力を含め、さまざまなテレメトリを生成して相互に関連付けます。 関数アプリでは、Application Insights Node.js SDK を使用して、依存関係や他のカスタム テレメトリを手動で追跡します。

    このソリューションでの分散したテレメトリのトレースの詳細については、「分散したテレメトリ」をご覧ください。

代替

  • 現在のソリューションでは、APIM エンドポイントにアクセスするためにサブスクリプション キーが必要ですが、Microsoft Entra 認証を使うこともできます。
  • API アクセス キーを要求するだけでなく、Azure Functions の組み込みの App Service 認証を使って、API のマネージド ID の Microsoft Entra 認可を有効にすることができます。
  • コードを変更せずに、このソリューションの Azure Cosmos DB エンドポイントを別の MongoDB サービスに置き換えることができます。
  • Azure Cosmos DB のセキュリティを強化するために、Azure Cosmos DB データベースから関数アプリへのトラフィックをロックダウンできます。
  • Azure Cosmos DB などのコンポーネントは、テレメトリを Azure Monitor に送信することができ、Application Insights からのテレメトリと関連付けることができます。
  • Terraform の代わりに、Azure portal または Azure CLI を使用して、Key Vault のキーの交換タスクを実行できます。
  • Terraform の代わりに、Azure DevOpsGitHub Actions などのシステムを使用して、ソリューションのデプロイを自動化できます。
  • 可用性を高めるために、このソリューションを複数のリージョンにデプロイできます。 Azure Cosmos DB をマルチマスターに設定し、APIM に組み込まれた複数リージョンのサポートを使用して、ペアになっているリージョンに Azure 関数アプリをデプロイします。

シナリオの詳細

この記事では、患者のカルテを管理するための統合ソリューションについて説明します。 医療機関は、機密性の高い大量の患者検査データをクラウドにデジタル形式で保存する必要があります。 内部およびサードパーティ システムは、アプリケーション プログラミング インターフェイス (API) を介して、データの読み取りと書き込みを安全に実行できる必要があります。 データのすべての操作を監査レジスタに記録する必要があります。

考えられるユース ケース

  • 指定された外部エンドポイントから機密性の高いデータにアクセスする。
  • データ アクセス操作のセキュリティで保護された監査を実装する。
  • 共通のアクセスとセキュリティで、相互に依存するマイクロサービス アプリを統合する。
  • サーバーレスによるコスト削減と柔軟性を活用しながら、仮想ネットワーク セキュリティ機能を使用する。

メリット

Azure Functions のようなサーバーレス アプリケーションの利点は、専用サーバーの費用を前払いするのではなく、必要なコンピューティング リソースのみを使用することによって実現されるコスト削減と柔軟性です。 このソリューションにより、完全な Azure App Service Environment (ASE) のコストと運用のオーバーヘッドを発生させずに、Azure Functions は仮想ネットワークのアクセス制限を使用してセキュリティを確保できます。

APIM は、Azure Functions 上に構築された一連の API マイクロサービスへの内部アクセスとサードパーティのアクセスを制御します。 Patient API は、患者とその検査結果の作成、読み取り、更新、削除 (CRUD) 操作を提供します。 Audit API 関数アプリは、監査エントリを作成するための操作を提供します。

各関数アプリは、独立した Azure Cosmos DB データベースにデータを保存します。 Azure Key Vault には、アプリとデータベースに関連付けられているすべてのキー、シークレット、接続文字列が安全に保持されます。 Application Insights Telemetry と Azure Monitor は、システム全体のログを一元化します。

考慮事項

以降の考慮事項には、ワークロードの品質向上に使用できる一連の基本原則である Azure "Well-Architected Framework" の要素が組み込まれています。 詳細については、「Microsoft Azure Well-Architected Framework」を参照してください。

このソリューションを実装するときには、以下の側面を考慮してください。

セキュリティ

セキュリティは、重要なデータやシステムの意図的な攻撃や悪用に対する保証を提供します。 詳細については、「セキュリティの重要な要素の概要」を参照してください。

データの機密性のため、このソリューションではセキュリティが最も重要です。 このソリューションでは、次のような複数のメカニズムを使用してデータを保護します。

  • APIM ゲートウェイ管理
  • 仮想ネットワークのアクセス制限
  • サービス アクセス キーと接続文字列
  • Key Vault でのキーと接続文字列の管理
  • Key Vault のキーの交換
  • マネージド サービス ID

Azure DDoS Protection を使用することで、分散型サービス拒否 (DDoS) 攻撃から Azure API Management インスタンスを保護することができます。 Azure DDoS Protection には、帯域幅消費型およびプロトコル型の DDoS 攻撃を保護するための強化された DDoS 軽減機能があります

このソリューションのセキュリティ パターンの詳細については、「API Management、Functions アプリ、Azure Cosmos DB 間の通信のセキュリティ パターン」を参照してください。

API ゲートウェイ管理

システムには、単一のマネージド APIM エンドポイントを介してのみパブリックにアクセスできます。 APIM サブネットでは、ゲートウェイ ノードの指定された IP アドレスに受信トラフィックを制限します。

APIM を使用すると、さまざまな認証メカニズムと簡単に統合できます。 現在のソリューションではサブスクリプション キーが必要ですが、APIM でサブスクリプション キーを管理しなくても、Microsoft Entra ID を使って APIM エンドポイントをセキュリティで保護することもできます。

仮想ネットワーク

API と関数が公開されないようにするために、Azure Virtual Network では、API と関数のネットワーク アクセスを特定の IP アドレスまたはサブネットに制限します。 API Management と Azure Functions では、どちらも仮想ネットワークでのアクセス制限とデプロイがサポートされています。

関数アプリでは、IPv4、IPv6、仮想ネットワーク サブネットのアクセスを制限できます。 既定では、関数アプリはすべてのアクセスを許可しますが、アドレスまたはサブネットの制限を 1 つ以上追加すると、アプリは他のすべてのネットワーク トラフィックを拒否します。

このソリューションでは、関数アプリは独自の仮想ネットワーク内でのみ対話を許可します。 Patient API は、アクセス制限許可リストに APIM サブネットを追加することで、APIM サブネットからの呼び出しを許可します。 Audit API は、アクセス制限許可リストに Patient API サブネットを追加することで、Patient API との通信を許可します。 これらの API は、他のソースからのトラフィックを拒否します。

このソリューションでは、リージョンの仮想ネットワーク統合を使用して、APIM と関数アプリを、同じ仮想ネットワークおよび Azure リージョンと統合します。 リージョンの仮想ネットワーク統合を使用する場合、重要な考慮事項がいくつかあります。

  • リージョンの仮想ネットワーク統合とスケーラビリティの両方を実現するには、Azure Functions Premium SKU を使用する必要があります。
  • APIM Developer または Premium SKU を使用して、VNET 接続を有効にする必要があります。
  • 仮想ネットワークのサブネットに関数アプリをデプロイするため、仮想ネットワークの他のサブネットからのトラフィックを許可するように、関数アプリのアクセス制限を構成します。
  • リージョンの仮想ネットワーク統合では、Azure 関数から仮想ネットワークへの送信トラフィックだけが制限されます。 アプリのアクセス リストによって制限されていても、受信トラフィックは仮想ネットワークの外部に引き続きルーティングされます。

完全なネットワークレベルの仮想ネットワークの分離を実現するのは、App Service Environment だけです。 リージョンの仮想ネットワーク統合をサポートする Azure Functions に比べ、ASE は実装にかなりの費用と労力を必要とする可能性があります。 また、ASE のスケーリングは弾力性に劣ります。

アクセス キー

アクセス キーを使用しなくても、APIM と関数アプリを呼び出すことができます。 ただし、アクセス キーの無効化は適切なセキュリティ対策ではないため、このソリューションのすべてのコンポーネントはアクセスにキーを必要とします。

  • APIM にアクセスするにはサブスクリプション キーが必要であるため、ユーザーは HTTP ヘッダーに Ocp-Apim-Subscription-Key を含める必要があります。
  • Patient API 関数アプリのすべての関数に API アクセス キーが必要であるため、APIM は Patient API を呼び出すときに、HTTP ヘッダーに x-functions-key を含める必要があります。
  • Audit API 関数アプリの CreateAuditRecord を呼び出すには API アクセス キーが必要であるため、Patient API は CreateAuditRecord 関数を呼び出すときに、HTTP ヘッダーに x-functions-key を含める必要があります。
  • どちらの関数アプリも Azure Cosmos DB をデータ ストアとして使うため、接続文字列を使って Azure Cosmos DB データベースにアクセスする必要があります。

Key Vault ストレージ

アクセス キーと接続文字列をアプリケーション設定に保持することは可能ですが、アプリにアクセスできるユーザーならだれでもキーと文字列を確認できるため、これはお勧めできません。 特に運用環境では、キーと文字列を Azure Key Vault に保持し、Key Vault 参照を使用してアプリを呼び出すのがベスト プラクティスです。 Key Vault では、指定されたマネージド ID にのみアクセスが許可されます。

APIM では、受信ポリシーを使用して Patient API ホスト キーをキャッシュに保存することで、パフォーマンスを向上させます。 以降の試行では、APIM は最初にキャッシュ内のキーを探します。

  • APIM は、Key Vault から Patient API ホスト キーを取得し、それをキャッシュに保存して、Patient API 関数アプリを呼び出すときに HTTP ヘッダーに挿入します。
  • Patient API 関数アプリは、Key Vault から Audit API ホスト キーを取得し、Audit API 関数アプリを呼び出すときに HTTP ヘッダーに挿入します。
  • Azure 関数ランタイムは、受信要求で HTTP ヘッダーのキーを検証します。

キーの交換

Key Vault のキーを交換すると、システムのセキュリティを強化できます。 キーは、定期的に自動で交換することも、漏洩が発生した場合に手動またはオンデマンドで交換することもできます。

キーの交換には、いくつかの設定の更新が含まれます。

  • 関数アプリのホスト キー自体
  • ホスト キーを保存する Key Vault のシークレット
  • 関数アプリのアプリケーション設定の Key Vault 参照 (シークレットの最新バージョンを参照するため)
  • Patient API の APIM キャッシュ ポリシーの Key Vault 参照

現在のソリューションでは、ほとんどのキー交換タスクに Terraform を使用しています。 詳細については、「Terraform を使用したキー交換パターン」をご覧ください。

マネージド ID

このソリューションでは、APIM と関数アプリは、Azure のシステム割り当てマネージド サービス ID (MSI) を使用して Key Vault シークレットにアクセスします。 Key Vault には、各サービスのマネージド ID に対して次の個別のアクセス ポリシーがあります。

  • APIM は、Patient API 関数アプリのホスト キーを取得できます。
  • Patient API 関数アプリは、Audit API ホスト キーと、データ ストアの Azure Cosmos DB 接続文字列を取得できます。
  • Audit API 関数アプリは、データ ストアの Azure Cosmos DB 接続文字列を取得できます。

コストの最適化

コストの最適化とは、不要な費用を削減し、運用効率を向上させる方法を検討することです。 詳しくは、コスト最適化の柱の概要に関する記事をご覧ください。

Azure Functions のようなサーバーレス アプリケーションの主な利点の 1 つは、専用サーバーの費用を前払いするのではなく、使用した分だけ支払うことによって実現されるコスト削減です。 仮想ネットワークのサポートには、追加料金で Azure Functions Premium プランが必要です。 Azure Functions Premium では、リージョンの仮想ネットワーク統合がサポートされており、動的スケーリングも引き続きサポートされます。 Azure Functions Premium SKU には、APIM での仮想ネットワーク統合が含まれています。

詳細と料金計算ツールについては、「Azure Functions の価格」をご覧ください。

Functions は、App Service仮想マシンでホストすることもできます。 完全なネットワークレベルの仮想ネットワークの分離を実現するのは、App Service Environment (ASE) だけです。 ASE は、リージョンの仮想ネットワーク統合をサポートする Azure Functions プランよりもかなりコストがかかる可能性があり、ASE のスケーリングは弾力性に劣ります。

このシナリオのデプロイ

このソリューションのソース コードは、「Azure VNet 統合サーバーレス マイクロサービス」にあります。

PatientTest APIAudit APITypeScript ソース コードは、/src フォルダーにあります。 作業を迅速に進めることができるように、各 API のソースには、すべての前提条件がインストールされている開発コンテナーが含まれています。

どちらの API にも、変更を加えたときの回帰を防ぐうえで役立つ、一連の自動化された統合テストと単体テストが含まれています。 また、コード スタイルを維持し、意図しないエラーから保護できるように、プロジェクトは ESLint によるリンティングを実行するように構成されています。 サービスのそれぞれの README ファイルには、テストとリンティングの実行方法に関する情報が含まれています。

Terraform デプロイ

コード プロジェクトの /env フォルダーには、Terraform デプロイ用のスクリプトとテンプレートが含まれています。 Terraform は APIM と関数アプリをデプロイし、デプロイされた Application Insights インスタンスを使用するようにそれらを構成します。 また、ネットワークのロックダウンやアクセス キー セキュリティ パターンなど、すべてのリソースと構成のプロビジョニングも行います。

デプロイの README には、Terraform 環境をユーザー独自の Azure サブスクリプションにデプロイする方法が記載されています。 /env フォルダーには、Terraform のデプロイに必要なものがすべてインストールされた開発用コンテナーも含まれています。

Locust ロード テスト

API のパフォーマンスを測定するために、付属の Locust ロード テストを使用して、API に対してロード テストを実行できます。 Locust はオープンソースのロード テスト ツールであり、テストは Python で記述されています。 ロード テストはローカルで実行することも、Azure Kubernetes Service (AKS) クラスターでリモートで実行することもできます。 テストでは、APIM エンドポイントに対してさまざまな操作を実行し、成功基準と失敗基準に照らして動作を検証します。

共同作成者

この記事は、Microsoft によって保守されています。 当初の寄稿者は以下のとおりです。

プリンシパル作成者:

パブリックでない LinkedIn プロファイルを表示するには、LinkedIn にサインインします。

次のステップ

次のアーキテクチャでは、主要な API Management シナリオについて説明します。

次の記事では、主要な関数のシナリオについて説明します。