CloudFront のマルチテナントディストリビューションでテナントパラメータを使ってオリジン様々なオリジン切り替えを行ってみた
いわさです。
先日登場した Amazon CloudFront のマルチテナントディストリビューションでは、パラメータを使うことでテナントごとのオリジン構成を少しコントロールすることが出来ます。
以下の記事では API Gateway をオリジンとした時に、パラメータを使うことでテナントごとにオリジンパスを分けることが出来ました。
このパラメータですが、オリジンパス以外に、オリジンドメインに対しても使うことが出来ます。
今回はオリジンドメインにこのパラメータを使った時にどこまで柔軟にオリジン構成のテナントカスタマイズができるのかを調べてみましたので紹介します。
S3 オリジンでターゲットバケットを切り替える
まずはバケットをテナントごとに切り替えてみます。これは出来そうです。
以下のように HTML コンテンツを含む S3 バケットを 2 つ用意します。
マルチテナントディストリビューションのオリジンドメイン設定でパラメータを使います。
{{bucketname}}.s3.ap-northeast-1.amazonaws.com
のように指定しました。
そしてディストリビューションテナント側では次のようにテナントごとのバケットを指すようにパラメータの値を指定します。
それぞれのテナントドメインにアクセスしてみると、各テナントバケットに格納したテナント用の Web ページにアクセスすることが出来ました。
% curl https://hoge0508bucket1.tak1wa.com/index.html
hoge bucket1
% curl https://hoge0508bucket2.tak1wa.com/index.html
hoge bucket2
ALB オリジンでターゲットロードバランサーを切り替える
続いて、ALB もよく使うと思うのでテナントごとに ALB を切り替えることができるのかも確認してみます。
こちらも同様にテナントごとに ALB を用意しておきます。
オリジンドメイン構成は次のように指定しました。
テナントパラメータには ALB DNS 名の.ap-northeast-1.elb.amazonaws.com
以外の部分を設定します。
オリジン切り替え機能はないので、マルチテナントディストリビューションのビヘイビア設定で目的のオリジンを指す必要があります。
アクセスしてみるとこちらも期待どおり、テナントごとに目的の ALB にアクセスさせることが出来ました。
% curl https://hoge0508bucket1.tak1wa.com/index.html
hoge0508alb1
% curl https://hoge0508bucket2.tak1wa.com/index.html
hoge0508alb2
異なるオリジンタイプで切り替えることは出来ない
さらに発展させる形で、オリジンタイプ関係なしに切り替え(例:テナント1は ALB オリジン、テナント2は S3 オリジン)もできるのか試して見ましたが、これは難しかったです。
まず、マルチテナントディストリビューションのオリジン設定では、通常のディストリビューションと同様にオリジンタイプの選択から行う必要があります。
そのため、OAC の構成が必要な S3 オリジンと ALB オリジンを組み合わせるようなことが出来ませんでした。
さらに、「Other」で単純な URL ベースでアクセスするカスタムオリジンの作成もできるのですが、どうやらオリジンドメインはパラメータのみではダメで、ドメイン形式の文字列が含まれている必要があるようでした。、
そのため、ALB やその他の AWS サービスであれば次のようにパラメータを構成することも出来そうなのですが、試してみたところうまくアクセスが出来ませんでした。
上記のオリジンドメイン設定後に、各テナントで S3 バケットや ALB のドメインを指すようにパラメータ指定した場合、次のようにアクセスに失敗しました。
% curl https://hoge0508bucket1.tak1wa.com/index.html
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>5ZP8ZDK8MEG4Q7YD</RequestId><HostId>TP/tuBJG4LHvDG6lPGa23mTFt006vsYdgsrh21Jk/3JgjXmPeR/kGR15WrNzwk5OmbMPSC+tsik=</HostId></Error>
% curl https://hoge0508bucket2.tak1wa.com/index.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML><HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<TITLE>ERROR: The request could not be satisfied</TITLE>
</HEAD><BODY>
<H1>504 Gateway Timeout ERROR</H1>
<H2>The request could not be satisfied.</H2>
<HR noshade size="1px">
We can't connect to the server for this app or website at this time. There might be too much traffic or a configuration error. Try again later, or contact the app or website owner.
<BR clear="all">
If you provide content to customers through CloudFront, you can find steps to troubleshoot and help prevent this error by reviewing the CloudFront documentation.
<BR clear="all">
<HR noshade size="1px">
<PRE>
Generated by cloudfront (CloudFront) HTTP3 Server
Request ID: kJwZOeb5718FqaodxdRka6G3VcltU8ElML37WdGlQAIHKprastpPdA==
</PRE>
<ADDRESS>
</ADDRESS>
</BODY></HTML>
オリジンドメインに対するパラメータ設定はサブドメインの切り替えくらいまでにしておいたほうが良いですね。
さいごに
本日は CloudFront のマルチテナントディストリビューションでテナントパラメータを使ってオリジン様々なオリジン切り替えを行ってみました。
テナントパラメータが使えることで「なんでもありか?」と思ったのですがそんなことはなく色々と制約がありました。
同一オリジンタイプの中で ALB をテナントごとに切り替える、バケットを切り替えるくらいまでが期待されている使い方な気がしますね。