何百万人もの人々によって利用されるクラウド プラットフォームを構築する企業の場合、独自のクラウド コンテンツを速やかに提供できなければなりません。Azure.com はまさに、日々何百万人もの人々にサービスを提供しているクラウドベースの複雑なアプリケーションですが、これは完全に Azure コンポーネントで構成され、Azure 上で運営されています。
自社のツールを使用して自社のビジネスを運営するのが、常にマイクロソフトの文化です。Azure.com は、Web のアジャイル開発用に Azure で提供されている、便利な PaaS (サービスとしてのプラットフォーム) オプションの一例です。当社は、Azure が 1 要求あたり 100 ミリ秒未満のラウンドトリップ時間 (RTT) を実現できるグローバル ネットワークにおいて、99.99% の可用性で Azure.com を運営できることに自信を持っています。
2 部構成のシリーズの第 2 弾では、Web サイトの構築を世界規模で進めてきた当社の経験を参考に、お客様が独自の Web サイト変革を進めていただけるよう、当社のブループリントをご紹介します。
この記事は、Azure.com を構成するインフラストラクチャやリソースを技術的な観点から理解していただくのに役立つはずです。当社の設計原則の詳細については、「Azure 上での Azure.com の運用 パート 1: 設計の原則とベスト プラクティス」をご覧ください。
グローバル規模のアーキテクチャ
Azure.com での当社の目標は、世界クラスの Web サイトをコスト効率よく世界規模で運営することです。そのため、当社は現在 25 を超える Azure サービスを展開しています (後述の「Azure.com のサービス」を参照してください)。
このブログ記事では、HTTP 要求を Web フロント エンドにルーティングするための Azure Front Door や、クラウド アプリケーションの作成と展開を支援するフルマネージド プラットフォームである Azure App Service など、主なサービスの役割について説明します。
下図は、Azure.com のグローバル規模のアーキテクチャの概要を示しています。
- 左側では、各種ネットワーク サービスがセキュアなエンドポイントと接続性を提供し、場所を問わず世界中のユーザーに即時アクセスをもたらしています。
- 右側では、開発者が Azure DevOps の各種サービスを使用して継続的インテグレーション (CI)/継続的配置 (CD) パイプラインを運用することで、更新プログラムや機能をゼロ ダウンタイムで提供しています。
- その間には、コンピューティング、ストレージ、セキュリティ、監視機能などを提供するさまざまな PaaS オプションが存在します。
Azure.com のグローバル規模のアーキテクチャ: Azure の各種サービスとデータフローの概要
グローバル規模でホストし、リージョンごとに配信する
Azure.com のアーキテクチャはグローバル規模でホストされていますが、高可用性を確保するために複数のリージョンでローカルに運営されています。Azure App Service では、最寄りのグローバル データセンター インフラストラクチャから Azure.com をホストし、その自動スケーリング機能によって Azure.com が需要の変化に対応できるようにしています。
下図は、App Service でホストされているリージョン規模のアーキテクチャの詳細を示しています。当社では、開発、ステージング、および運用環境に展開するために、デプロイ スロットを使用しています。デプロイ スロットは、固有のホスト名を持つライブ アプリです。 コンテンツと構成は、アプリケーションの可用性を維持しながら、デプロイ スロット間でスワップできます。
Azure.com のリージョン規模のアーキテクチャ: App Service ではリージョンのインスタンスを各スロットでホストしています。
Azure.com を支える主要な PaaS コンポーネントの概要
Azure.com は、複雑な多層型の Web アプリケーションです。マイクロソフトでは、マネージド サービスの時間節約効果を活かし、可能な限り PaaS オプションを使うようにしています。インフラストラクチャや運用にかける時間が減るということは、世界クラスのカスタマー エクスペリエンスの実現にかけられる時間が増えるということです。OS のパッチ適用や、キャパシティ プロビジョニング、負荷分散といった処理はプラットフォームが実行するため、当社は他の作業に集中できます。
Azure DNS
Azure DNS を使用すると、DNS レコードに対するセルフサービスのクイック編集や、100% の可用性を備えたグローバル ネームサーバー、およびエニーキャスト アドレス指定による超高速の DNS 応答時間を実現できます。当社では、CNAME と ANAME の両方の種類のレコードに Azure DNS エイリアスを使用しています。
Azure Front Door Service
Azure Front Door Service を使用すると、待機時間の短い TCP 分割、HTTP/2 の多重化およびコンカレンシー、パフォーマンスに基づくグローバルなルーティングを実現できます。当社では、RTT が 1 要求あたり 100 ミリ秒未満にまで短縮されました。これは、クライアントが元のノードに直接接続しなくても、エッジ ノードに接続するだけで済むためです。
ビジネス継続性を確保するために、Azure Front Door Service ではバックエンドの正常性プローブがサポートされています。これは、異常な動作が見られる正常でないリージョンを実質的に排除するための、回復性のパターンの 1 つです。また、バックアップ サイトを有効にするために、Azure.com では優先順位に基づくトラフィック ルーティングを採用しています。当社のプライマリ サービス バックエンドがオフラインになった場合、この方法によって Azure Front Door Service でリング状のフェールオーバーをサポートできます。
また、Azure Front Door Service は、リバース プロキシとして動作するため、パターンベースの URL 書き換えや要求の転送によって動的なトラフィックの変化を処理できます。
Web アプリケーション ファイアウォール
Web アプリケーション ファイアウォール (WAF) は、不良なボットの負荷の遮断や、アプリケーション レイヤーでの OWASP トップ 10 の攻撃に対する保護を提供することで、プラットフォームのセキュリティ体制の強化を支援します。WAF は強制的に、Cookie や要求 URL、フォーム ポスト パラメーター、要求ヘッダーなどのデータ ペイロードに、開発者がもっと注意を向けるようにします。
当社では、WAF のカスタム規則を使用して、特定の地域、IP、URL、その他の要求プロパティへのトラフィックをブロックしています。規則によって、ネットワーク エッジでトラフィックをオフロードして、元のノードに到達するのを防ぎます。
Content Delivery Network
Azure.com では、読み込み時間を短縮するために、Content Delivery Network (CDN) を使用して元のノードへの負荷の遮断を行います。CDN は、消費される帯域幅を削減し、コストを抑えるのに役立っています。また、ポイント オブ プレゼンス (POP) のエッジ ノードで静的アセットのキャッシュを行い、RTT 待機時間を短縮することで、パフォーマンスを向上させます。CDN を使用しないと、元のノードが静的アセットに対するすべての要求を処理しなければならなくなります。
CDN では、アプリケーションのセキュリティを向上させる DDoS Protection もサポートされています。当社は、CDN での圧縮と HTTP/2 を有効にして、静的ペイロードの配信が最適化されるようにしています。CDN によってネットワーク上のデータの移動が減るため、CDN を使用することは、ネットワーク トラフィックを最適化する (英語) ための持続可能なアプローチでもあります。
Azure App Service
当社では、App Service の水平方向の自動スケールを使用して、トラフィックの急増に対応しています。自動スケール機能は使いやすく、ノードごとの 1 秒あたりの要求数 (RPS) に対する Azure Monitor のメトリックに基づいています。また当社では、弾力性のあるコンピューティングを利用して、Azure コストを 50% 削減しました。これには、当社の炭素消費を直接減らす (英語) 効果があります。
Azure.com では、他にも以下のようないくつかの便利な App Service 機能を使用しています。
- 常時接続。つまり、アイドル タイムアウトが発生しません。
- アプリケーションの初期化。カスタム ウォームアップと検証が行われます。
- VIP スワップのブルーグリーン デプロイ パターン (英語)。ゼロ ダウンタイムのデプロイ (英語) がサポートされます。
- エッジへのネットワーク待ち時間を減らすために、当社では、12 の地理的に分離されたデータセンターでアプリを実行しています。このプラクティスにより、1 つ以上のデータセンターで停電が発生した場合でも、geo 冗長性がサポートされます。
- アプリケーションのパフォーマンスを向上させるために、当社では App Service DaaS - .NET プロファイラー (英語) を使用しています。この機能により、パフォーマンスの低いコード ブロックや低速な依存関係につながる、ノードのボトルネックやホットスポットを特定できます。
- ディザスター リカバリーと平均復旧時間 (MTTR) の短縮を目的として、当社ではスロット スワップを使用しています。アプリのデプロイにおける例外が当社の PPE テストで検出されなかった場合は、元の安定したバージョンにすばやくロール バックできます。
また、App Service は PaaS サービス (英語) でもあります。つまりユーザーは、仮想マシン (VM) インフラストラクチャや、OS の更新プログラム、アプリのフレームワーク、これらの管理に付随するダウンタイムなどを心配する必要がない、ということです。当社では、インフラストラクチャのあらゆるローリング更新を抑制するために、データセンターを選ぶ場合はペアになっているリージョンの概念に従い、分離性と回復性が向上するようにしています。
最後に、垂直方向のスケーリングを適切な規模に設定するには、適切な App Service プラン レベルを選択することが重要になります。選択するプランは、持続可能なエネルギー比例性 (英語) にも影響を及ぼします。つまり、より高い使用率でインスタンスを実行する (英語) ことで、炭素利用効率が最大化されるということです。
DaaS - .NET プロファイラー: コードのボトルネックを特定し、パフォーマンスの向上を測定します。このケースでは、HTML の空白の "圧縮" がコンピューティング ノードを飽和状態にしていることがわかりました。これを無効化してから応答時間を確認すると、CPU 使用率が大幅に向上していました。
Azure Monitor
Azure Monitor を使用すると、Application Insights、Log Analytics、および Azure Data Explorer のデータ ソースに対して、正常性のパッシブ監視を行うことができます。当社では、これらのクエリ モニター アラートを利用して、当社のテレメトリ ログに基づく構成ベースの正常性モデルを構築し、アプリの動作がおかしいことをお客様からご指摘いただく前に把握できるようにしています。
たとえば、当社は以下のスクリーンショットのように、データセンターごとの CPU 使用率を監視しています。アプリのメトリックに対して CPU 使用率が高い状態が続いている場合、Monitor から当社の対応チームに通知がトリガーされます。これにより対応チームが速やかに対応し、問題をトリアージできるので、MTTR の短縮につながります。また、クライアント ブラウザーの動作がおかしい場合やコンソール エラーがスローされる場合 (Safari が特定の push と replace の状態パターンを変更する (英語) 場合など) には、プロアクティブな通知を受信します。
パフォーマンス カウンター: CPU 使用率が高い状態が 5 分以上続いている場合には、アラートを受け取ります。
Application Insights
Monitor の機能である Application Insights は、クライアント (およびサーバー) 側のアプリケーション パフォーマンス管理 (APM) のテレメトリ ログ記録に使用します。この機能によって、ページのパフォーマンス、例外、低速な依存関係が監視され、クロスプラットフォームのプロファイル作成機能が提供されます。お客様は通常、Application Insights を障害対応シナリオで、MTTR の短縮のほか、失敗した要求やアプリケーション例外の速やかなトリアージを行うために使用します。
お客様には、データ ボリュームのストレージ クォータを使い果たすことがないように、テレメトリのサンプリングを有効にすることをお勧めしています。当社では、日単位でストレージ クォータのアラートを設定して、ログ記録のパイプラインが停止する前にテレメトリの飽和状態を把握できるようにしています。
また、Application Insights では、アプリ ドメインの境界と依存関係における分散トレースに対して OpenTelemetry のサポート (英語) が提供されています。この機能を使用すると、クライアント側からバックエンドのデータやサービス層までのトレーサビリティを実現できます。
データ ボリュームの容量に関するアラート: この例は、データ ストレージのしきい値を超えたことを示しています。これは、たちまちのうちに増大するテレメトリ ログの追跡に便利です。
Azure DevOps による開発
Azure.com には大規模なチームで取り組んでいるため、当社では Azure DevOps サービス を使用してその取り組みの調整を行っています。内部の技術ドキュメントの作成には Azure Wikis (英語) を、作業項目の追跡には Azure Boards を、CI/CD のワークフローの構築には Azure Pipelines を、そしてアプリケーション パッケージの管理には Azure Artifacts をそれぞれ利用しています。また、ソフトウェア構成管理と品質ゲートには、Azure Boards (英語) との連携に適した GitHub を使用しています。
当社は、構築プロセスの中で日々プル要求を何百となく送信し、CI/CD パイプラインでは毎日複数の更新プログラムを実稼働サイトに展開しています。単一のツールでソフトウェア開発ライフサイクル (SDLC) 全体を管理することで、エンジニアリング チームや当社の内部顧客の学習曲線を簡素化できます。
今後の予定を常に把握するために、当社では Delivery Plans (英語) で多くの計画を行っています。このツールは、徐々に追加されるタスクを確認したり、Azure.com のトラフィックに影響を及ぼす大きなイベント (Microsoft Build、Microsoft Ignite、Microsoft Ready など) に対する予測を立てたりするのに非常に便利です。
今後の展望
Azure プラットフォームの進化と共に、Azure.com も進化しています。しかし、いつまでも変わらないものもあります。その 1 つが、信頼性、拡張性、持続可能性、およびコスト効率に優れたプラットフォームを求めるニーズです。だからこそ、当社は Azure に自信を持っています。
マイクロソフトでは、クラウド開発者の皆様に多彩なリソースとベスト プラクティスを提供しています。以下に当社のその他のリソースを紹介していますので、ぜひご確認ください。まずは、今すぐ Azure の無料アカウントを作成してください。
Azure.com のサービス
Azure.com を構成する各種サービスの詳細について、ぜひ以下のリソースをご確認ください。
コンピューティング
ネットワーク
- Azure Front Door
- Azure DNS
- Web アプリケーション ファイアウォール
- Azure Traffic Manager
- Azure Content Delivery Network
ストレージ
- Azure Cognitive Search
- Azure Cache for Redis
- Azure Blob Storage と Azure キュー
- Application Insights
- Azure Cosmos DB
- Azure Data Explorer
- Azure Media Services
アクセスのプロビジョニング
アプリケーションのライフ サイクル