6
3

More than 1 year has passed since last update.

AWS CloudFormationで独自ドメインホスティング環境構築を自動化してみた

Last updated at Posted at 2022-02-27

img

AWS CloudFormationで独自ドメインホスティング環境構築を自動化してみました :tada:


以前の記事内容をAWS CloudFormationで実現する方法をためしてみました!


今回の作成したテンプレートをGitHubで公開したのでぜひご利用ください!

certificate-create.yml

AWSTemplateFormatVersion: 2010-09-09
# テンプレート概要
Description: Certificate creation
# パラメータ
Parameters:
  # ドメイン名入力
  DomainName:
    Description: Domain Name
    Type: String
  # ホストゾーンID入力
  HostedZoneId:
    Description: Host Zone ID
    Type: String
# リソース
Resources:
  # Certificate Manager設定
  CertificateManagerCertificate:
    # リソースタイプ
    Type: AWS::CertificateManager::Certificate
    # プロパティ
    Properties:
      # ドメイン指定
      DomainName: !Sub ${DomainName}
      # 検証ドメイン設定
      DomainValidationOptions:
        -
          # ドメイン指定
          DomainName: !Sub ${DomainName}
          # ホストゾーンID指定
          HostedZoneId: !Sub ${HostedZoneId}
      # 検証方法指定
      ValidationMethod: DNS

hosting.yml

AWSTemplateFormatVersion: 2010-09-09
# テンプレート概要
Description: Build a Unique Domain Hosting Environment with Amazon Route 53, Amazon CloudFront, and Amazon S3
# パラメータ
Parameters:
  # ドメイン名入力
  DomainName:
    Description: Domain Name
    Type: String
  # ホストゾーンID入力
  HostedZoneId:
    Description: Host Zone ID
    Type: String
  # 証明書ID入力
  CertificateId:
    Description: Certificate ID
    Type: String
# リソース
Resources:
  # S3バケット設定
  S3Bucket:
    # リソースタイプ
    Type: AWS::S3::Bucket
      # プロパティ
    Properties:
      # バケット名指定
      BucketName: !Sub ${AWS::StackName}-${AWS::Region}-${AWS::AccountId}
  # S3バケットポリシー設定
  S3BucketPolicy:
    # リソースタイプ
    Type: AWS::S3::BucketPolicy
    # 処理順設定
    DependsOn:
      - CloudFrontOriginAccessIdentity
    # プロパティ
    Properties:
      # S3バケット指定
      Bucket: !Sub ${S3Bucket}
      # CloudFront用バケットポリシー指定
      PolicyDocument:
        Statement:
          -
            Sid: PolicyForCloudFrontPrivateContent
            Effect: Allow
            Principal:
              AWS: !Sub arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity ${CloudFrontOriginAccessIdentity}
            Action: s3:GetObject
            Resource: !Sub arn:aws:s3:::${S3Bucket}/*
  # CloudFrontOAI設定
  CloudFrontOriginAccessIdentity:
    # リソースタイプ
    Type: AWS::CloudFront::CloudFrontOriginAccessIdentity
    # プロパティ
    Properties:
      CloudFrontOriginAccessIdentityConfig:
        Comment: Unique Domain Hosting Environment
  # CloudFront設定
  CloudFrontDistribution:
    # リソースタイプ
    Type: AWS::CloudFront::Distribution
    # 処理順設定
    DependsOn:
      - S3Bucket
      - CloudFrontOriginAccessIdentity
    # プロパティ
    Properties:
      DistributionConfig:
        # ドメイン指定
        Aliases:
          - !Sub ${DomainName}
        Origins:
          -
            # S3ドメイン名指定
            DomainName: !Sub ${S3Bucket}.s3.${AWS::Region}.amazonaws.com
            # オリジン名指定
            Id: !Sub ${S3Bucket}.s3.${AWS::Region}.amazonaws.com
            # オリジンアクセスアイデンティティ指定
            S3OriginConfig:
              OriginAccessIdentity: !Sub origin-access-identity/cloudfront/${CloudFrontOriginAccessIdentity}
        # キャッシュビヘイビア設定
        DefaultCacheBehavior:
          # オリジンID指定
          TargetOriginId: !Sub ${S3Bucket}.s3.${AWS::Region}.amazonaws.com
          # 自動圧縮有無指定
          Compress: true
          # HTTPメソッド指定
          AllowedMethods:
            - HEAD
            - GET
          CachedMethods:
            - HEAD
            - GET
          # ビューアプロトコルポリシー指定
          ViewerProtocolPolicy: redirect-to-https
          # キャッシュポリシー指定 (CachingOptimized)
          CachePolicyId: 658327ea-f89d-4fab-a63d-7e88639e58f6
        # SPA対応設定
        CustomErrorResponses:
          -
            ErrorCode: 403
            ResponsePagePath: /index.html
            ResponseCode: 200
            ErrorCachingMinTTL: 0
          -
            ErrorCode: 404
            ResponsePagePath: /index.html
            ResponseCode: 200
            ErrorCachingMinTTL: 0
        # 料金クラス指定
        PriceClass: PriceClass_All
        # ディストリビューション有効無効指定
        Enabled: true
        # SSL証明書設定
        ViewerCertificate:
          # 証明書ID指定
          AcmCertificateArn: !Sub arn:aws:acm:us-east-1:${AWS::AccountId}:certificate/${CertificateId}
          # セキュリティポリシー指定
          MinimumProtocolVersion: TLSv1.2_2021
          SslSupportMethod: sni-only
        # 配信制限設定
        Restrictions:
          GeoRestriction:
            # 地理的制限指定
            RestrictionType: none
        # HTTPバージョン指定
        HttpVersion: http2
        # ルートURL指定
        DefaultRootObject: index.html
        # IPv6有無指定
        IPV6Enabled: true
  # Route53レコード設定
  Route53RecordSet:
    # リソースタイプ
    Type: AWS::Route53::RecordSet
    # 処理順設定
    DependsOn:
      - CloudFrontDistribution
    # プロパティ
    Properties:
      # ドメイン指定
      Name: !Sub ${DomainName}
      # ホストゾーンID指定
      HostedZoneId: !Sub ${HostedZoneId}
      # レコードタイプ指定
      Type: A
      # エイリアスターゲット設定
      AliasTarget:
        # CloudFrontドメイン指定
        DNSName: !GetAtt CloudFrontDistribution.DomainName
        # ホストゾーンID指定 (固定)
        HostedZoneId: Z2FDTNDATAQYW2

事前準備

  • Amazon Route 53による独自ドメインの取得
  • 対象の「ドメイン名」と「ホストゾーンID」をメモしておく

img


構築の流れ

  1. 指定リージョンでSSL証明書を自動デプロイ
  2. 任意リージョンで独自ドメインホスティング環境を自動デプロイ

指定リージョンでSSL証明書を自動デプロイ

はじめに、指定リージョンでSSL証明書を自動デプロイします。SSL証明書をCloudFrontで利用するためには、リージョンを「us-east-1」で作成する必要があります。

リージョン「us-east-1」でCloudFormationにアクセス。スタック → スタックの作成 → 「新しいリソースを使用」をクリック。
img

前提条件は「テンプレートの準備完了」を選択。テンプレートの指定は「テンプレートファイルのアップロード」を選択しファイルをアップロード → 「次へ」をクリック。
CloudFormationテンプレートは「certificate-create.yml」を利用。
img

任意のスタック名・ドメイン名・ホストゾーンIDを設定 → 「次へ」をクリック。
img

スタックオプションは今回デフォルトで設定 → 「次へ」をクリック。
img

設定を確認 → 「スタックの作成」をクリック。
img

スタックが作成されたのを確認。
img

「us-east-1」リージョンのAWS Certificate Managerを確認すると、SSL証明書が自動作成されているのを確認できる。次のテンプレートで利用するため対象の「証明書ID」をメモ。
img


任意リージョンで独自ドメインホスティング環境を自動デプロイ

最後に、任意リージョンで独自ドメインホスティング環境を自動デプロイします。

デプロイしたいリージョンでCloudFormationにアクセス。
スタック → スタックの作成 → 「新しいリソースを使用」をクリック。
img

前提条件は「テンプレートの準備完了」を選択。テンプレートの指定は「テンプレートファイルのアップロード」を選択しファイルをアップロード → 「次へ」をクリック。
CloudFormationテンプレートは「hosting.yml」を利用。
img

任意のスタック名・証明書ID・ドメイン名・ホストゾーンIDを設定 → 「次へ」をクリック。
img

スタックオプションは今回デフォルトで設定 → 「次へ」をクリック。
img

設定を確認 → 「スタックの作成」をクリック。
img

スタックが作成されたのを確認。
img

Amazon CloudFrontに自動でデプロイされているのを確認します。
img

Amazon S3に自動でデプロイされているのを確認します。
img

デプロイされたS3バケットに公開したいファイル一式をアップロードします。
img

独自ドメインにアクセスするとアップロードしたWebSiteが表示されます。
img


AWS CloudFormationを利用することで、独自ドメインホスティング等のさまざまなリソース構築を自動化することが可能です :bulb:

今後は、AWS CDK等で各サービス構成をどの範囲まで定義できるかも試していければと思います。


AWS CloudFormationについて、他にも記事を書いています。よろしければぜひ :bow:
tags - AWS CloudFormation

やってみたシリーズ :grinning:
tags - Try



book

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3