概要

AWS の理解向上を兼ねて、CloudFront で S3 上の HTML を配信する構成のサンプルを terraform で構成してみました。

AWS Certificate Manager (ACM) で証明書を発行し、CloudFront に割り当てて、カスタムドメインで配信します。

実際のソース

下記に配置しています。

https://github.com/hirokimatsueda/aws-cf-s3-terraform-sample

実行時の前提

  • CloudFront に割り当てる親ドメインを管理する DNS 名前解決が可能な Route 53 がすでに構築されていること

実装ポイント

  • CloudFront の制約上、ACM を us-east-1 に構築する必要があるため、コードの簡素化のため全てのリソースを us-east-1 に構築しています

    provider "aws" {
      region     = "us-east-1" # CloudFront用のACMの要件に沿って設定
      access_key = var.aws_access_key
      secret_key = var.aws_secret_key
    }
    
  • S3 は CloudFront 以外からパブリックなアクセスをさせたくないため、IAM ポリシーを使用して CloudFront のみからアクセス可能にしています

    data "aws_iam_policy_document" "static_site" {
      statement {
        sid    = "AllowCloudFront"
        effect = "Allow"
    
        principals {
          type = "AWS"
          identifiers = [
            var.cloudfront_origin_access_identity_iam_arn,
          ]
        }
    
        actions = [
          "s3:GetObject"
        ]
    
        resources = [
          "${aws_s3_bucket.static_site.arn}/*"
        ]
      }
    }
    
  • モジュールを S3 の構築部分と CloudFront + ACM の構築部分で分離していて、こうするとコードの見通しが良いように個人的には思います。

Azure との比較

Azure の場合、証明書は KeyVault に配置して、Front Door に割り当てることをしますが、KeyVault のリージョンが限定されることはないので ACM のリージョン縛りはハマりました。。

ただ、それ以外の要素は AWS の良さに気づかされました。

例えば ACM で気軽に証明書を作成できるのがいいですね。 Azure で似たような構成を考えると CloudFront の代わりに Front Door になり、Front Door の場合はマネージド証明書を使えば気軽に証明書を使えるので十分お手軽ではあります。ただ、Front Door 以外のリソース、例えば Application Gateway で証明書を扱いたいときはちょっと手間だったりします。

あとは IAM を使って CloudFront からしか S3 に取りに行けないようにできるのもキレイな権限管理に思いました。