OACによるCloudFrontからS3への接続制御: Route53とACMを用いて、独自ドメインで静的サイトをホストする

AWS

2024.3.21

Topics

はじめに

こんにちは、Shunです。

この記事では、Amazon S3に静的コンテンツを保存し、Amazon CloudFrontとOrigin Access Control (OAC) を使用して、そのコンテンツにアクセスする方法について説明します。

指定の CloudFront ディストリビューションにのみ S3 バケットへのアクセスを許可することによって、CloudFront ユーザーが S3 オリジンを簡単に保護できるようにする新機能です。S3 バケットへの CloudFront のリクエストで AWS Signature Version 4 (SigV4) を有効にして、CloudFront がリクエストに署名するタイミングと場合を設定できるようになりました。
出典: Amazon CloudFront launches Origin Access Control (OAC)

前提

  • 独自ドメインを保有していること
  • Route53のホストゾーンへ独自ドメインの登録が完了していること

構成図

本記事で説明する構成は以下の通りです。

環境構築

1. S3の作成

S3はすべてデフォルト値で作成して、問題ございません。

S3のアクセス制御はOACによって行われるため、パブリックアクセスのブロックも有効にします。

アクセスを確認するため、適当なファイルをS3にアップロードしておきます。

2. CloudFrontディストリビューションの作成

次にCloudFrontディストリビューションを作成します。

Origin domain: 先ほど作成したS3
オリジンアクセス: Origin access control settings (recommended)

「Create new OAC」ボタンを押し、デフォルト設定でOACを作成します。

S3バケットポリシーを更新する必要があるという警告が表示されますが、これは後ほど更新します。

今回は検証目的なので、WAFは無効にします。「代替ドメイン名」と「カスタムSSL証明書」は後ほど設定します。

作成すると、画面上部へS3バケットポリシーの「ポリシーをコピー」というボタンが出ます。

これをS3のバケットポリシーへ貼り付けます。

バケットポリシーは以下です。ハイライト箇所が下記の環境によって書き換わります。

{
        "Version": "2008-10-17",
        "Id": "PolicyForCloudFrontPrivateContent",
        "Statement": [
            {
                "Sid": "AllowCloudFrontServicePrincipal",
                "Effect": "Allow",
                "Principal": {
                    "Service": "cloudfront.amazonaws.com"
                },
                "Action": "s3:GetObject",
                "Resource": "arn:aws:s3:::xxxxx/*",
                "Condition": {
                    "StringEquals": {
                      "AWS:SourceArn": "arn:aws:cloudfront::xxxxxxx:distribution/xxxxxxx"
                    }
                }
            }
        ]
      }

3. Route53のレコード作成

Route 53にCloudFrontのレコードを以下のように登録します。

レコードタイプ: A
トラフィックのルーティング先: CloudFront ディストリビューションへのエイリアス
ディストリビューション: ディストリビューションドメイン名(https://は除く)

4. ACMの作成

続いて、ACMを作成します。

ACMを作成します。CloudFrontはバージニア北部(グローバル)のサービスなので、ACMもバージニア北部で作成します。

証明書タイプ: パブリック証明書をリクエスト
完全修飾ドメイン名: 独自ドメイン
検証方法: DNS検証

作成した証明書を見てみると、ステータスが保留中となっています。「Route 53でレコードを作成」を押すことで、Route 53にACMのCNAMEが登録され、DNS検証が完了します。

これでACMの発行が完了します。

5. CloudFrontの追加登録

Route 53へのレコード登録とACMの発行が完了したので、先ほどスキップしたCloudFrontディストリビューションの追加設定を行います。

代替ドメイン名: Route53へ登録したレコード名
カスタムSSL証明書: ACMで発行した証明書
デフォルトルートオブジェクト: index.html

これで設定は完了です。

デプロイが完了するまで数分かかることがあります。完了する前にアクセスしても接続は拒否されるので、しばらく待つ必要があります。

僕はせっかちなので、何度もデプロイが終わる前に見に行ってしまい、頭を抱えました。

確認

CloudFrontの代替ドメイン名に設定したドメインにアクセスすると、「Hello World!」を確認できました。

S3のオブジェクトURLからアクセスすると、アクセスが拒否されました。

さいごに

OACの概念は以前から知っていましたが、実際に操作してみると、簡単に設定できることに驚きました。

OACをTerraformで実施されたい方は、以下の記事を参考にしてみてください。

関連記事
【アップデート】Amazon CloudFront で Origin Access Control (OAC) が利用開始されました!

CloudFrontにあまり触れる機会がなかったため、これからはCloudFront関連の記事をもっと多く書いていきたいと思います。

最後まで読んでいただきありがとうございます!

Shun

好きな言葉は生ビール199円です。日本ビール協会認定1冠、AWS12冠、Google Cloud11冠

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら