覚え書き。S3バケットを独自ドメインで公開するために作った。

  • 実際に動いた構成をブログ用にまとめたものなので、そのままだと動かないかも。
  • 具体的な設定値を乗せたいので、あまりパラメータに出してない。必要ならパラメータにする。
  • タグは適当。とりあえず、タグをつけられる箇所だということを示すためにつけてる。

以下の記事を参考にさせていただきました。

AWSTemplateFormatVersion: "2010-09-09"
Transform: AWS::Serverless-2016-10-31
Description: "example"

Parameters:
  ServiceName:
    Description: "サービス名"
    Type: String
  
Resources:
  # CloudFrontディストリビューション
  MyCloudFrontDistribution:
    Type: "AWS::CloudFront::Distribution"
    Properties:
      DistributionConfig:
        Enabled: true
        Origins:
          # S3をオリジンにする
          - Id: "S3Origin"
            DomainName: "xxxxx.s3.amazonaws.com"  # バケットのドメイン名
            S3OriginConfig:
              OriginAccessIdentity: !Sub "origin-access-identity/cloudfront/${MyOriginAccessIdentity}"
        Aliases:
          # 画面のドメイン名
          - "example.com"
        ViewerCertificate:
          # 証明書はバージニア北部 (us-east-1) リージョンのものしか使用できないので注意
          AcmCertificateArn: "arn:aws:acm:us-east-1:999999999999:certificate/99999999-9999-9999-9999-999999999999"
          MinimumProtocolVersion: "TLSv1.1_2016"
          SslSupportMethod: "sni-only"
        DefaultRootObject: "index.html"  # SPAとかで全てのアクセスをindex.htmlに集約したい場合は設定する
        DefaultCacheBehavior:
          TargetOriginId: "S3Origin"
          ViewerProtocolPolicy: "redirect-to-https"
          ForwardedValues:
            QueryString: false
          # キャッシュをさせたくない場合は0を指定
          # ※その場合、S3側のオブジェクトのメタデータにも Cache-Control=no-cache が必要なので注意
          DefaultTTL: 0
          MaxTTL: 0
          MinTTL: 0
        IPV6Enabled: true
        Comment: "S3の前に置くCloudFront"
        Logging:
          # S3バケットにアクセスログを保存
          Bucket: "yyyyy.s3.amazonaws.com"  # バケットのドメイン名
          Prefix: "cf"  # 設定すると、このフォルダ以下にログを保存する
      Tags:
        - Key: "Service"
          Value: !Ref ServiceName

  # OAI (Object Access Identity)
  MyOriginAccessIdentity:
    Type: "AWS::CloudFront::CloudFrontOriginAccessIdentity"
    Properties:
      CloudFrontOriginAccessIdentityConfig:
        Comment: "画面用バケットにアクセスする用"