CloudFront のマルチテナントディストリビューションとテナントを CloudFormation でデプロイする
いわさです。
先日、CloudFront にマルチテナントに関する新しい機能が追加されました。
実はその直後のアップデートで既に CloudFormation でこれらの機能を利用できるようになっています。
本日は CloudFormation からこれらの機能を使ってみたので手順を紹介します。
従来の CloudFormation ディストリビューションのデプロイ
従来から変わった点を解説したいので、まずは軽く従来のディストリビューションをデプロイする方法をおさらいします。
オリジン構成によって少し変わったりするのですが、大枠としてはAWS::CloudFront::Distribution
を使ってオリジンやビヘイビアの構成をし、デプロイする感じです。
以下は S3 静的ウェブサイトホスティングをオリジンとしている例です。
AWSTemplateFormatVersion: 2010-09-09
Description: ---
Resources:
SingleTenantDist:
Type: AWS::CloudFront::Distribution
Properties:
DistributionConfig:
Origins:
- Id: iwasa-hoge-public-bucket.s3-website-ap-northeast-1.amazonaws.com
DomainName: iwasa-hoge-public-bucket.s3-website-ap-northeast-1.amazonaws.com
CustomOriginConfig:
OriginProtocolPolicy: http-only
DefaultCacheBehavior:
TargetOriginId: iwasa-hoge-public-bucket.s3-website-ap-northeast-1.amazonaws.com
ViewerProtocolPolicy: redirect-to-https
AllowedMethods:
- HEAD
- GET
Compress: true
ForwardedValues:
QueryString: false
Cookies:
Forward: none
Enabled: true
DefaultRootObject: index.html
ViewerCertificate:
CloudFrontDefaultCertificate: true
PriceClass: PriceClass_All
Outputs:
CloudFrontEndpoint:
Value: !GetAtt SingleTenantDist.DomainName
次のように従来のディストリビューションがデプロイされました。
余談ですが、マルチテナントのアップデート直後は従来型のディストリビューションタイプが「Classic」だったのですが、今日確認したところ「Standard」になっていました。
Classic となると先行きが不安になるので、フィードバックがあったのかもしれないですね。
マルチテナントディストリビューション
CloudFront のマルチテナントの使う場合はマルチテナントディストリビューションをデプロイし、そこにディストリビューションテナントをデプロイします。
今回の CloudFormation のアップデートでどちらも対応できるようになりました。
まずはマルチテナントディストリビューションをデプロイしましょう。
マルチテナントディストリビューションをデプロイするには従来と同じAWS::CloudFront::Distribution
を使います。
ただし、マルチテナントモードに切り替えるためにDistributionConfig.ConnectionMode
にtenant-only
を指定します。省略した場合はdirect
となり従来型のディストリビューションとなります。
おそらくこのプロパティは新しく追加された感じですかね。
以下が作ってみたテンプレートになります。
共通証明書や Web ACL などを省略した最低限な感じ + パラメータです。
AWSTemplateFormatVersion: 2010-09-09
Description: ---
Resources:
MultiTenantDist:
Type: AWS::CloudFront::Distribution
Properties:
DistributionConfig:
ConnectionMode: tenant-only # for Multi-Tenant Distribution
TenantConfig:
ParameterDefinitions:
- Name: hogeparam1
Definition:
StringSchema:
Comment: hogecomment
DefaultValue: abc
Required: false
Origins:
- Id: iwasa-hoge-public-bucket.s3-website-ap-northeast-1.amazonaws.com
DomainName: iwasa-hoge-public-bucket.s3-website-ap-northeast-1.amazonaws.com
CustomOriginConfig:
OriginProtocolPolicy: http-only
DefaultCacheBehavior:
TargetOriginId: iwasa-hoge-public-bucket.s3-website-ap-northeast-1.amazonaws.com
ViewerProtocolPolicy: redirect-to-https
AllowedMethods:
- HEAD
- GET
Compress: true
CachePolicyId: 658327ea-f89d-4fab-a63d-7e88639e58f6
Enabled: true
DefaultRootObject: index.html
ViewerCertificate:
CloudFrontDefaultCertificate: true
Outputs:
CloudFrontEndpoint:
Value: !GetAtt MultiTenantDist.DomainName
マルチテナントディストリビューションを使う場合、オプションでパラメータを指定することが出来ます。
これを指定する場合は新プロパティのDistributionConfig.TenantConfig
を設定しましょう。
また、私がデプロイを試した際にいくつかエラーメッセージを確認しており、従来型で指定していた以下についてはマルチテナント指定した場合は設定ができなかったです。
- PriceClass
- ForwardedValues
- MinTTL (MinTTL の代わりに CachePolicyId を指定することで解決出来た)
また、マルチテナントディストリビューションはエンドポイントを持たないので、DomainName
を参照しても何も値が取得できませんでした。
Deploying template 'template.yaml' as stack 'hoge0504multi5' in ap-northeast-1.
Stack hoge0504multi5: CREATE_COMPLETE
Outputs:
CloudFrontEndpoint: -
Successfully deployed hoge0504multi5
スタックデプロイ後のリソースを確認してみましょう。
ディストリビューションタイプが「Multi-tenant」になっていますね。良いですね。
この時点では関連づいているテナントがまだ存在しません。
上記テンプレートではオプションのパラメータを指定していたのですが、期待どおり作成されていました。
ディストリビューションテナント
で、さらにここにテナントを追加します。
新たにAWS::CloudFront::DistributionTenant
というリソースタイプが追加されています。
DistributionId
で関連付けるマルチテナントディストリビューションを指定し、ConnectionGroupId
で接続グループを指定できます。ConnectionGroupId
は省略した場合はデフォルトが使用されます。
AWSTemplateFormatVersion: 2010-09-09
Description: ---
Resources:
Tenant1:
Type: AWS::CloudFront::DistributionTenant
Properties:
Name: hoge0504tenant1
DistributionId: E1OR9ZG9DV4RUU
Enabled: true
Domains:
- hoge0504tenant1.tak1wa.com
ManagedCertificateRequest:
PrimaryDomainName: hoge0504tenant1.tak1wa.com
ValidationTokenHost: cloudfront
Parameters:
- Name: hogeparam1
Value: tenant1value
Customizations:
WebAcl:
Action: override
Arn: arn:aws:wafv2:us-east-1:123456789012:global/webacl/hoge0504waf/b4ab2343-bcf6-4aa9-aac8-83c76ad2d6a7
Customizations
でマルチテナントディストリビューションの指定を上書きすることができます。
今回気がついたのですが、マルチテナントディストリビューションで共通の Web ACL を設定し、ディストリビューションテナントで Web ACL を設定なしにさせることもできるんですね。へぇー。
デプロイしてみたところ次のようにテナントが追加されました。
テナント固有パラメータも指定できていますね。
今回マルチテナントディストリビューションで共通証明書を指定していなかったので、ディストリビューションテナント側で証明書を用意する必要があるのですが、レコード検証などが必要です。
このあたりもレコードを作成することでうまいこと出来そうな気もするのですが今回はそこまではやらずに、次のブログのように手動で ACM 証明書の HTTP 検証を行いました。
さいごに
本日は CloudFront のマルチテナントディストリビューションとテナントを CloudFormation でデプロイしてみました。
マルチテナントディストリビューション用にいくつかプロパティが追加されていますので、通常のディストリビューションを作成する際に見慣れないパラメータで混乱しないようにしましょう。
マルチテナントの観点でいうと、テナントオンボーディングの自動化などで特にディストリビューションテナントについては使う可能性が高いので使い方を抑えておきたいところです。