[アップデート] Amazon CloudFront にマルチテナントディストリビューションという SaaS 向けの新しい機能が登場しました
いわさです。
CloudFront のドキュメント見ましたか。
マルチテナントディストリビューションというものが CloudFront に追加されたようです。なんだこれは。
アナウンスにも出ていますね。
CloudFront コンソールを眺めてみると新しくディストリビューションを作成しようとするときに、従来のシングルウェブサイトかマルチテナントアーキテクチャか選択することができるようになっています。
使ってみたところだいぶ理解が進んだので検証結果や、マルチテナントディストリビューション機能の使い方などを紹介します。
CloudFront コンソールのディストリビューションにタイプが追加された
今回新しく「マルチテナントディストリビューション」というものが追加されました。
従来のディストリビューションはどうやら「クラシック」という扱いになるようです。
「クラシック」という表現はあれですね。いつか廃止される気がしてならないですが、本日時点では何も情報は無いです。
ではこのマルチテナントディストリビューションが何なのか、まずはドキュメントベースで確認してみましょう。
マルチテナントディストリビューション
公式ドキュメントでは以下がマルチテナントディストリビューションの仕組みを説明したページになります。
次のような図で表現されていまして、マルチテナントディストリビューションの中に、複数のディストリビューションテナントを関連付けて使用します。
従来、ひとつのディストリビューションに複数のドメインを割り当てるためにはだいたいドメイン機能を使ったり 対応する SSL 証明書の用意が必要でした。
さらに、その上でドメインごとに挙動のカスタマイズを行うのは難易度が高く、多くの場合は CloudFront Functions や Lambda@Edge に頼る必要がありました。
今回登場したマルチテナントディストリビューションを使うと、マルチテナントディストリビューションに共通の設定(オリジン、ビヘイビア、セキュリティ、ログなど)を設定しつつ、ドメインごとのディストリビューションテナントでドメインごとに一部設定を上書きしたりすることができます。
コンソールやドキュメント上、マルチテナントや SaaS といった用語が出ていますが、私の理解では複数ドメインをカスタマイズしながら運用するための新しいディストリビューションと考えると良いと思います。
従来はドメインごとにディストリビューションを用意して重複した設定を管理する必要があったり、特に大量のテナントをドメインベースでホストする場合はクォータに気をつける必要もあったのですが、そのあたりの課題が解決できます。
クォータについてもドキュメントに情報が追加されています。[1]
一部抜粋すると、前述の代替ドメインを使う方法ではディストリビューションあたり 100、AWS アカウントごとのディストリビューション数は 200 がデフォルトクォータでした(上限緩和可能)
マルチテナントディストリビューションでは AWS アカウントごとのディストリビューションテナントは 10,000 がデフォルトクォータとなっており、デフォルトで大量のテナントをホスティングすることができます。
マルチテナントディストリビューション構成方法
マルチテナントディストリビューションの使い方ですが、まずはマルチテナントディストリビューションを作成します。
そしてマルチテナントディストリビューションにテナントを追加していきます。
最後にドメインごとにディストリビューションテナントへの名前解決を行います。ちょっとわかりにくいのですがマルチテナントディストリビューションはエンドポイントを持たず、ディストリビューションテナント(に関連付けしたコネクショングループ)がエンドポイントを持っています。
マルチテナントディストリビューションを作成する
ここからポチポチとコンソールでマルチテナントディストリビューションを作成していきます。
新規ディストリビューション作成時に、「Multi-tenant architecture」を選択します。
まず、適当なマルチテナントディストリビューションの名前をつけ、共通の証明書を選択します。
この共通証明書をすべてのテナントで使いまわすこともできますし、テナントごとに個別の証明書や別のドメインを割り当てることもできます。
オリジンを設定します。
ここ重要な気がしますが、オリジン設定についてはテナントディストリビューション側で追加設定が出来ません。
ただし、マルチテナントディストリビューションには新たに「パラメータ」という新しい概念が登場しまして、オリジン設定にテナントコンテキストを含めることでテナントごとのオリジン設定のカスタマイズが出来ます。後ほど解説します。
WAF の設定も共通部分で行います。こちらはディストリビューションテナントごとに追加設定が可能なので、テナントによって WAF をオプション導入するとか、そういった使い方が出来ます。
マルチテナントディストリビューションが作成出来ました。
ほとんどのタブは従来のディストリビューションと同じなのですが、ドメイン&テナントと、パラメータのふたつは新しい概念なので抑えておきましょう。
ドメイン&テナントは関連づいているディストリビューションテナントが表示されるだけなので割愛します。パラメータがちょっと重要です。
パラメータはマルチテナントディストリビューション側でテナントごとに設定可能なパラメータを定義します。
そしてディストリビューションテナント側でその値を設定することで一部挙動をカスタマイズするというものになります。
ここではテナント名をパラメータに設定するようにしてみましょう。
オリジン設定を再度編集してみます。
対象オリジンやパスに先ほど設定したパラメータを変数として与える事ができます。
以下ではテナント名をオリジンパスに含めるようにしていますが、オリジン設定自体に埋め込むこともできるので、S3 オリジンの対象バケットをテナントごとに分けるとかもできます。
ディストリビューションテナントを作成する
マルチテナントディストリビューションはただの共通設定なので、それ自体はディストリビューションとしてコンテンツを発行するエンドポイントを持っていません。
ここからディストリビューションテナントを追加してみます。
ディストリビューションテナントとマルチテナントディストリビューションは親子関係ではなくて、関連づいている関係性となっていまして、あるディストリビューションテナントを別のマルチテナントディストリビューションに移動させることもできます。
テナントのドメインはここで指定する形ですね。
証明書を上書きすることもできますし、外部 DNS のドメインを指定することもできます。
続いてパラメータです。
マルチテナントディストリビューション側でパラメータを必須とした場合はここでの入力が必須となります。
テナント名を入力しましょう。
WAF や地理制限の設定もテナント個別の設定が必要であればここで行います。
ディストリビューションテナントの作成が出来ました。
キャッシュ無効化(Invalidations)はテナントごとに行えるというのが良いですね。
名前解決するのだが...
あとは作成したディストリビューションテナントに対する名前解決を設定してやれば終わりです。
ただし、私が本日確認した時点ではデフォルトエンドポイントの名前解決に失敗しておりうまく動作しませんでした。
% 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 の設定画面からコネクショングループを有効化します。
作成されました。
CreateBy...
がデフォルトのものですね。
名前解決できるか先に確認してみましょう。
% 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
良さそうです。
ディストリビューションテナントのコネクショングループを変更してみます。
API Gateway で確認してみる
今回は次のような API Gateway (REST) を用意してオリジンとして使ってみたいと思います。
テナントごとのリソースを用意しまして、マルチテナントディストリビューションのパラメータ機能で透過的にテナントリソースにアクセスできるか確認してみます。
設定方法は先程のとおりオリジンパスにパラメータを使っているだけです。
作成したふたつのテナントディストリビューションにアクセスしてみましょう。
% 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 ドルみたいです。
Amazon CloudFront CDN - Plans & Pricing - Try For Free より