Appearance
フルマネージド環境でスケーラブルな Web API を構築する
概要
このアーキテクチャで達成できる要件
- シンプルな Web アプリケーションをデプロイしたい
- アプリケーションの実行環境の運用コストを軽減して、アプリケーションの開発に集中したい
構成図
構成説明
AppSerivce等のリソースを作成するための VNet および以下のサブネットを作成します。
- App Serviceが所属するサブネット
- App Serviceがサブネットに所属するかどうかはデプロイ時のパラメータであるSubnetIdの有無によって決定されます。SubnetIdが指定されていない場合App Serviceはサブネットに所属しません。
- App Serviceが所属するサブネット
受信セキュリティ規則を、Azure Network Security Group(NSG)に以下の通り設定します。
- 任意のポート・プロトコル・IPアドレスからのアクセスを許可します。
App Serviceにデプロイするアプリケーションのコンテナイメージを保存するための Azure Container Registry リポジトリを作成します。
Azure Cache for Redisインスタンスを作成します。
各種シークレットを保存するための Azure Key Vaultインスタンスを作成します。
データベースとなる Azure Database for MySQL インスタンスを作成します。インターネットからこのインスタンスに接続でき るように、インスタンスにはパブリック IP アドレスを割り当てます。
各種シークレットが、Key Vault シークレットとして作成されます。具体的には以下のシークレットが作成されます。
- Azure Database for MySQL の root ユーザ用パスワード
- Azure Cache for Redis の AccessKey
デプロイするアプリケーションのコンテナイメージを保存するための Azure Container Registry リポジトリを作成します。
ログを保存するための Log Analytics Workspace インスタンスが作成されます。
アプリケーションをデプロイするApp Serviceを作成します。
アプリケーションのコンテナイメージをAzure Container Registryに登録します。
Azure Containe Registryよりイメージを取り出し、App Service にデプロイを行います。
App Service とクライアント間の通信に利用される証明書が App Service Managed Certificates によって自動的に発行、管理されます。
App ServiceにデプロイされたアプリケーションのFQDNを対応づけるために、Azure DNSレコードを作成します。
- なお、Azure DNS のゾーンは作成されないため、作成済みの Azure DNS ゾーンを使用してください。
処理フロー
アプリケーションに対する HTTPS リクエストを、App Service が受け付けます。
アプリケーションが実行され、アプリケーションは必要に応じて MySQL データベースやシークレットにアクセスを行います。
- App Service と Azure Cache for Redisの連携によりアプリケーションのレスポンスを高速化しています。
アプリケーションが処理を終えて、クライアントに処理結果を返す。
他の方式との比較
Azure App Service と AKS
アプリケーション層を実現するサービスとして Azure Kubernetes Service (AKS) を利用する選択肢も考えられます。
AKSを用いた方式は以下の場合に適しています。
- 開発者が Kubernetes を用いたアプリケーション運用・管理に慣れている。
- 複数アプリケーションにまたがる複雑な処理、アプリケーション単体では管理の難しい全体にまたがるバッチ処理などが必要
App Serviceを用いた方式は以下の場合に適しています。
- 単体、もしくは処理の連携の必要がないアプリケーションをデプロイしたい。
- アプリケーションの実行環境の運用コストを軽減して、アプリケーションの開発に集中したい。
AssemblyLine 構成
このアーキテクチャでは、以下の AssemblyLine が生成されます。
Azure Shared Infrastructure
- バックエンドアプリケーションをデプロイするための基盤となるクラウドリソースをデプロイする。
Azure API Backend Application
- 基盤となるリソース上にバックエンドアプリケーションをデプロイする。
Azure Shared Infrastructure
この AssemblyLine は、以下の Pipeline から構成されます。
deploy
- 基盤となるクラウドリソースをデプロイする。
Azure API Backend Application
この AssemblyLine は、以下の Pipeline から構成されます。
refer
Azure Shared Infrastructure
AssemblyLine によってデプロイされたリソースの情報を取得し、リソースデプロイに活用する。
build
- デプロイするアプリケーションのコンテナイメージをビルドする。
deploy
- バックエンドアプリケーション用のクラウドリソースをデプロイする。
追加可能な Option
アプリケーションの公開範囲を制限したい
機能説明
アプリケーションにアクセスできるソース IP アドレスを制限します。アクセスを許可したい IP アドレスをパラメータで指定することで、指定した IP アドレスが ポリシーに設定され、それ以外の IP アドレスからのアクセスが拒否されます。この Option を使用しない場合は、インターネットの全ての IP アドレスからのアクセスが許可されます。
利用場面
- アプリケーションにアクセスできるクライアントを制限してセキュリティを向上したい。
コンテナの脆弱性検知をしたい
機能説明
アプリケーションのコンテナイメージがビルドされて Azure Container Registry にプッシュされた後に、Trivy を用いたコンテナイメージの脆弱性診断を実施し、診断結果を表示します。デフォルトでは、何らかの脆弱性が検知されると Pipeline の実行が失敗します。パラメータを設定することで、特定の重大度の脆弱性のみを検知対象にしたり、脆弱性が検知された場合も Pipeline を失敗させずに処理を継続させたりできます。
利用場面
- デプロイするアプリケーションのセキュリティリスクを評価したい。
備考
- この Option を追加すると、
Azure API Backend Application
AssemblyLine に、ビルドされたコンテナイメージの脆弱性診断を実施するscan
Pipeline が追加されます。
非機能要件
可用性
- App Serviceはデフォルトで
PremiumV3
プランでインスタンスが作成されます。PremiumV3
ではLinux,Windows両方のコンテナの利用が可能です。
冗長化構成
- App Serviceの冗長化構成はデフォルトでは設定されませんが、ユーザが設定を変更することでゾーン冗長構成を取ることができます。
リージョン構成
- サブネット:
japaneast
- App Service:
japaneast
- Azure Database for MySQL インスタンス:
japaneast
運用・保守性
バックアップ
- バックアップ方式
- Azure Database for MySQL インスタンスでは、バックアップが毎日 1 回実行されます。バックアップは 7 日間保持されます。
保守
セキュリティ
アクセス制限
- アクセス制限方法
- (【アプリケーションの公開範囲を制限したい】Option を追加した場合)パラメータで指定することで、アプリケーションにアクセスできるソース IP アドレスを制限できます。
ログ
- ログポリシー
- Azure におけるデフォルトのロギング設定に基づいてログを保存します。
- ログ保存先
- Log Analytics ワークスペースに保存されます。
- ログ保存期間
- デフォルトでは 30 日間保持されます。パラメータで指定することで、保持期間を変更できます。
データの暗号化
- Standard レベルの Azure Key Vault を使用するため、シークレットは Azure のソフトウェアによって保護されます。
マルウェア対策
- (【コンテナの脆弱性検知をしたい】Option を追加した場合)Trivy を用いたコンテナイメージの脆弱性診断を実施します。
Web からの攻撃対策
- (【アプリケーションの公開範囲を制限したい】Option を追加した場合)許可したIP以外のリクエストは拒否され、準拠するリクエストのみが受理されます。