[アップデート] Amazon CloudFront にマルチテナントディストリビューションという SaaS 向けの新しい機能が登場しました

[アップデート] Amazon CloudFront にマルチテナントディストリビューションという SaaS 向けの新しい機能が登場しました

Clock Icon2025.04.29

いわさです。

CloudFront のドキュメント見ましたか。
マルチテナントディストリビューションというものが CloudFront に追加されたようです。なんだこれは。

7FD8C3A2-FE33-46C4-BB26-FCC5D44E202E.png

アナウンスにも出ていますね。

https://aws.amazon.com/about-aws/whats-new/2025/04/saas-manager-amazon-cloudfront/

CloudFront コンソールを眺めてみると新しくディストリビューションを作成しようとするときに、従来のシングルウェブサイトかマルチテナントアーキテクチャか選択することができるようになっています。

11C236E1-174B-4640-AF43-CF8B7209D752.png

使ってみたところだいぶ理解が進んだので検証結果や、マルチテナントディストリビューション機能の使い方などを紹介します。

CloudFront コンソールのディストリビューションにタイプが追加された

今回新しく「マルチテナントディストリビューション」というものが追加されました。
従来のディストリビューションはどうやら「クラシック」という扱いになるようです。

9945977C-B38B-4724-B686-B159E1ADF4EA.png

「クラシック」という表現はあれですね。いつか廃止される気がしてならないですが、本日時点では何も情報は無いです。
ではこのマルチテナントディストリビューションが何なのか、まずはドキュメントベースで確認してみましょう。

マルチテナントディストリビューション

公式ドキュメントでは以下がマルチテナントディストリビューションの仕組みを説明したページになります。

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-config-options.html

次のような図で表現されていまして、マルチテナントディストリビューションの中に、複数のディストリビューションテナントを関連付けて使用します。

template_distribution.png

従来、ひとつのディストリビューションに複数のドメインを割り当てるためにはだいたいドメイン機能を使ったり 対応する SSL 証明書の用意が必要でした。
さらに、その上でドメインごとに挙動のカスタマイズを行うのは難易度が高く、多くの場合は CloudFront Functions や Lambda@Edge に頼る必要がありました。

今回登場したマルチテナントディストリビューションを使うと、マルチテナントディストリビューションに共通の設定(オリジン、ビヘイビア、セキュリティ、ログなど)を設定しつつ、ドメインごとのディストリビューションテナントでドメインごとに一部設定を上書きしたりすることができます。

コンソールやドキュメント上、マルチテナントや SaaS といった用語が出ていますが、私の理解では複数ドメインをカスタマイズしながら運用するための新しいディストリビューションと考えると良いと思います。
従来はドメインごとにディストリビューションを用意して重複した設定を管理する必要があったり、特に大量のテナントをドメインベースでホストする場合はクォータに気をつける必要もあったのですが、そのあたりの課題が解決できます。

クォータについてもドキュメントに情報が追加されています。[1]

一部抜粋すると、前述の代替ドメインを使う方法ではディストリビューションあたり 100、AWS アカウントごとのディストリビューション数は 200 がデフォルトクォータでした(上限緩和可能)
マルチテナントディストリビューションでは AWS アカウントごとのディストリビューションテナントは 10,000 がデフォルトクォータとなっており、デフォルトで大量のテナントをホスティングすることができます。

マルチテナントディストリビューション構成方法

マルチテナントディストリビューションの使い方ですが、まずはマルチテナントディストリビューションを作成します。
そしてマルチテナントディストリビューションにテナントを追加していきます。
最後にドメインごとにディストリビューションテナントへの名前解決を行います。ちょっとわかりにくいのですがマルチテナントディストリビューションはエンドポイントを持たず、ディストリビューションテナント(に関連付けしたコネクショングループ)がエンドポイントを持っています。

マルチテナントディストリビューションを作成する

ここからポチポチとコンソールでマルチテナントディストリビューションを作成していきます。
新規ディストリビューション作成時に、「Multi-tenant architecture」を選択します。

33E5D475-EAD7-4806-9350-AC171D3FEDF8.png

まず、適当なマルチテナントディストリビューションの名前をつけ、共通の証明書を選択します。
この共通証明書をすべてのテナントで使いまわすこともできますし、テナントごとに個別の証明書や別のドメインを割り当てることもできます。

0A9AEFDC-3645-4FC8-86F7-AE8CD3696A13.png

オリジンを設定します。
ここ重要な気がしますが、オリジン設定についてはテナントディストリビューション側で追加設定が出来ません。
ただし、マルチテナントディストリビューションには新たに「パラメータ」という新しい概念が登場しまして、オリジン設定にテナントコンテキストを含めることでテナントごとのオリジン設定のカスタマイズが出来ます。後ほど解説します。

497A8650-CA68-4A0E-B47D-721D55B641FE.png

WAF の設定も共通部分で行います。こちらはディストリビューションテナントごとに追加設定が可能なので、テナントによって WAF をオプション導入するとか、そういった使い方が出来ます。

0C0E4D39-0202-4922-AB47-23CC447149C4.png

マルチテナントディストリビューションが作成出来ました。
ほとんどのタブは従来のディストリビューションと同じなのですが、ドメイン&テナントと、パラメータのふたつは新しい概念なので抑えておきましょう。
ドメイン&テナントは関連づいているディストリビューションテナントが表示されるだけなので割愛します。パラメータがちょっと重要です。

ADA512E9-75E6-4BB4-AD69-F21ED3EA2E86.png

パラメータはマルチテナントディストリビューション側でテナントごとに設定可能なパラメータを定義します。
そしてディストリビューションテナント側でその値を設定することで一部挙動をカスタマイズするというものになります。

BEAE4F41-9FA6-41C8-A7DB-292CB328851D.png

ここではテナント名をパラメータに設定するようにしてみましょう。

3FE923A9-A9AE-4144-8DB9-480988425BAC_4_5005_c.jpeg

オリジン設定を再度編集してみます。
対象オリジンやパスに先ほど設定したパラメータを変数として与える事ができます。
以下ではテナント名をオリジンパスに含めるようにしていますが、オリジン設定自体に埋め込むこともできるので、S3 オリジンの対象バケットをテナントごとに分けるとかもできます。

3958F76C-7039-4202-9F2A-C025FD04B32E.png

ディストリビューションテナントを作成する

マルチテナントディストリビューションはただの共通設定なので、それ自体はディストリビューションとしてコンテンツを発行するエンドポイントを持っていません。
ここからディストリビューションテナントを追加してみます。

939A2C94-D4DC-4B40-A865-FBFDFB0A818D.png

ディストリビューションテナントとマルチテナントディストリビューションは親子関係ではなくて、関連づいている関係性となっていまして、あるディストリビューションテナントを別のマルチテナントディストリビューションに移動させることもできます。

94A348AA-F1EF-4C81-BE42-3E0DC377A7EE.png

テナントのドメインはここで指定する形ですね。
証明書を上書きすることもできますし、外部 DNS のドメインを指定することもできます。

1F00CD0B-08D7-42C8-A04B-896CD4EE498F.png

続いてパラメータです。
マルチテナントディストリビューション側でパラメータを必須とした場合はここでの入力が必須となります。
テナント名を入力しましょう。

B263D909-8B01-40B9-ACFB-41EA345EF495.png

WAF や地理制限の設定もテナント個別の設定が必要であればここで行います。

5F9ADD5C-74D7-4393-8218-595BF197B48C.png

ディストリビューションテナントの作成が出来ました。
キャッシュ無効化(Invalidations)はテナントごとに行えるというのが良いですね。

605E1CD6-48BD-43A0-8ED2-1071AE18D415.png

名前解決するのだが...

あとは作成したディストリビューションテナントに対する名前解決を設定してやれば終わりです。

32C220C1-7E60-4ACE-BE50-EAA5738E54C7.png

ただし、私が本日確認した時点ではデフォルトエンドポイントの名前解決に失敗しておりうまく動作しませんでした。

% nslookup d3vgjf4gn2zqa9.cloudfront.net
Server:         2404:1a8:7f01:b::3
Address:        2404:1a8:7f01:b::3#53

Non-authoritative answer:
*** Can't find d3vgjf4gn2zqa9.cloudfront.net: No answer

マルチテナントディストリビューション機能におけるエンドポイントですが、「コネクショングループ」という概念が登場します。
このコネクショングループごとに CloudFront エンドポイントが発行される形になっていまして、デフォルトではデフォルトコネクショングループが使われるようになっています。
そのため、特に追加の設定をしない場合はすべてのディストリビューションテナントが指すエンドポイントは同じアドレスを指しています。

このコネクショングループですが、有効して追加で設定することも出来ます。
例えば DDos を受けたタイミングでエンドポイントを変更したいとか、特定のエンタープライズテナントだけはエンドポイントを分離させるとかそういった用途で使うことが出来ます。

デフォルトエンドポイントの名前解決に失敗してしまう問題をこの機能で代替できたのでこのオプション機能についても使いましょう。

CloudFront の設定画面からコネクショングループを有効化します。

FC7367CC-2749-4911-968A-5A4E6CEC8346.png

7520094E-6252-4AB5-B1E8-951DB443A5F5.png

作成されました。
CreateBy...がデフォルトのものですね。

C49FCB74-3E39-4E01-A969-562293DC0FA4.png

名前解決できるか先に確認してみましょう。

% nslookup dyelwjvvcqjlm.cloudfront.net
Server:         2404:1a8:7f01:b::3
Address:        2404:1a8:7f01:b::3#53

Non-authoritative answer:
Name:   dyelwjvvcqjlm.cloudfront.net
Address: 3.164.121.118
Name:   dyelwjvvcqjlm.cloudfront.net
Address: 3.164.121.58
Name:   dyelwjvvcqjlm.cloudfront.net
Address: 3.164.121.18
Name:   dyelwjvvcqjlm.cloudfront.net
Address: 3.164.121.9

良さそうです。
ディストリビューションテナントのコネクショングループを変更してみます。

FFC35F54-D901-4D32-BD18-6D1509B1BEE8.png

API Gateway で確認してみる

今回は次のような API Gateway (REST) を用意してオリジンとして使ってみたいと思います。
テナントごとのリソースを用意しまして、マルチテナントディストリビューションのパラメータ機能で透過的にテナントリソースにアクセスできるか確認してみます。

486E86EC-A217-4391-ABD9-CF99A9C4DFE9.png

設定方法は先程のとおりオリジンパスにパラメータを使っているだけです。
作成したふたつのテナントディストリビューションにアクセスしてみましょう。

% curl https://hoge0429tenant1.tak1wa.com/
{
    "path": "tenant1"
}
% curl https://hoge0429tenant2.tak1wa.com/
{
    "path": "tenant2"
}

良いんじゃないか。

さいごに

本日は Amazon CloudFront にマルチテナントディストリビューションという新しい概念が登場したので使ってみました。

パラメータを使ってオリジン構成のカスタマイズができるのは非常に良いですね。
また、SaaS の観点ではデフォルトで 10,000 テナントに対応できるのも良いですし、必要に応じてディストリビューションテナントの関連付けを変更できるのが非常におもしろいと思いました。ティアリングに応じてコネクショングループを変更したり、テナント固有の追加設定をするとか。

料金ページも更新されていました。
CloudFront SaaS Manager として料金が発生するみたいです。
10 テナントまでは無料、11~200 までは 20 ドル、それ以降は 1 テナントあたり 0.1 ドルみたいです。

image.png
Amazon CloudFront CDN - Plans & Pricing - Try For Free より

脚注
  1. Quotas - Amazon CloudFront ↩︎

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.