CloudFront のマルチテナントディストリビューションとテナントを CloudFormation でデプロイする

CloudFront のマルチテナントディストリビューションとテナントを CloudFormation でデプロイする

Clock Icon2025.05.04

いわさです。

先日、CloudFront にマルチテナントに関する新しい機能が追加されました。

https://dev.classmethod.jp/articles/cloudfront-multitenant-distribution/

実はその直後のアップデートで既に 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

次のように従来のディストリビューションがデプロイされました。

D941D592-122D-4C70-BA8C-AF23BFC1E9D7.png

余談ですが、マルチテナントのアップデート直後は従来型のディストリビューションタイプが「Classic」だったのですが、今日確認したところ「Standard」になっていました。
Classic となると先行きが不安になるので、フィードバックがあったのかもしれないですね。

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

CloudFront のマルチテナントの使う場合はマルチテナントディストリビューションをデプロイし、そこにディストリビューションテナントをデプロイします。
今回の CloudFormation のアップデートでどちらも対応できるようになりました。

まずはマルチテナントディストリビューションをデプロイしましょう。
マルチテナントディストリビューションをデプロイするには従来と同じAWS::CloudFront::Distributionを使います。

ただし、マルチテナントモードに切り替えるためにDistributionConfig.ConnectionModetenant-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」になっていますね。良いですね。

5F7400ED-1C87-4E32-AEB6-61AEAB7BAAFC.png

この時点では関連づいているテナントがまだ存在しません。

B316740B-FC49-45C7-8574-60DDB498C7D6.png

上記テンプレートではオプションのパラメータを指定していたのですが、期待どおり作成されていました。

C8D479CE-2780-44D7-9C4B-1BB1AB7183B1.png

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

で、さらにここにテナントを追加します。
新たに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 を設定なしにさせることもできるんですね。へぇー。

デプロイしてみたところ次のようにテナントが追加されました。

BE7D98D6-D3AE-4A82-96F3-E0C4A369858F.png

テナント固有パラメータも指定できていますね。

58E9A448-C957-46EE-A082-667217467F38.png

今回マルチテナントディストリビューションで共通証明書を指定していなかったので、ディストリビューションテナント側で証明書を用意する必要があるのですが、レコード検証などが必要です。

BFA0FAA0-A4A0-43ED-B36E-5EBD7325E7FD.png

このあたりもレコードを作成することでうまいこと出来そうな気もするのですが今回はそこまではやらずに、次のブログのように手動で ACM 証明書の HTTP 検証を行いました。

https://dev.classmethod.jp/articles/automated-http-validated-public-certificates-amazon-cloudfront/

ABFE2635-C5EC-45E3-BAC7-279C0DDEB9E7.png

さいごに

本日は CloudFront のマルチテナントディストリビューションとテナントを CloudFormation でデプロイしてみました。

マルチテナントディストリビューション用にいくつかプロパティが追加されていますので、通常のディストリビューションを作成する際に見慣れないパラメータで混乱しないようにしましょう。
マルチテナントの観点でいうと、テナントオンボーディングの自動化などで特にディストリビューションテナントについては使う可能性が高いので使い方を抑えておきたいところです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.