🦒

OACを使用してCloudFront経由でS3のコンテンツを公開する

2024/09/23に公開

はじめに

表題の通り、本記事はOACを用いてCloudFront経由でS3のコンテンツを公開することが目的ですが、CloudFrontを使用しない場合との差を確認しながら進める形をとります。

  • CloudFrontを経由せずにS3のコンテンツを公開する
  • CloudFrontを経由してS3のコンテンツを公開する
  • S3からのアクセスを拒否する
    といった流れで進ます。また、必要最低限の設定のみを行います。

CloudFrontを経由せずにS3のコンテンツを公開する

はじめは、CloudFrontを経由せずにS3の静的ウェブサイトホスティング機能を用いて、コンテンツを公開します。

S3バケットの作成

test-oac.comというバケットを作成します。

次に「パブリックアクセスをすべてブロック」をオフにします。
「パブリックアクセスのブロックをすべてオフにすると、このバケットとバケット内のオブジェクトが公開される可能性があります。」といったメッセージが表示されると思いますが、気にせずにチェックをします。
その後、「バケットを作成」をクリックします。他の設定はデフォルトの値で問題ありません。

S3バケットにコンテンツを配置

S3バケットにアクセスするコンテンツを配置します。

今回はテスト用のページとして、HTML/CSS/JavaScriptの3ファイルを配置しました。私が使用したのは以下のようなファイルです。

index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>テストページ</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div class="container">
        <h1>ようこそ、テストページへ!</h1>
        <button id="messageButton">クリックしてメッセージを表示</button>
        <p id="message" class="hidden">こんにちは!ボタンをクリックしました。</p>
    </div>

    <script src="script.js"></script>
</body>
</html>
style.css
body {
  font-family: Arial, sans-serif;
  background-color: #f0f0f0;
  margin: 0;
  padding: 0;
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
}

.container {
  text-align: center;
  background-color: #ffffff;
  padding: 20px;
  border-radius: 10px;
  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}

button {
  padding: 10px 20px;
  font-size: 16px;
  border: none;
  background-color: #3498db;
  color: white;
  border-radius: 5px;
  cursor: pointer;
}

button:hover {
  background-color: #2980b9;
}

.hidden {
  display: none;
}

#message {
  margin-top: 20px;
  color: #2ecc71;
  font-size: 18px;
}
script.js
document.getElementById("messageButton").addEventListener("click", function() {
  var message = document.getElementById("message");
  message.classList.remove("hidden");
});

静的ウェブサイトホスティングの設定

S3バケットの「プロパティ」>「静的ウェブサイトホスティング >「編集」の順にクリックします。

「静的ウェブサイトホスティング」を有効にします。
「インデックスドキュメント」にWebページのホームとなるファイル名を入力します。私の例だとindex.htmlファイルになります。
その後、設定を保存してください。

S3バケットの「プロパティ」タブの画面の最下に、http://test-oac.com.s3-website-ap-northeast-1.amazonaws.comのようにURLが表示されるようになったと思います。これで静的ウェブサイトホスティングの設定は完了です。

S3バケットポリシーの設定

静的ウェブサイトホスティングの設定は完了しましたが、この状態でURLにアクセスしても403エラー(AccessDenied)となるはずです。これは、S3バケット自体へのアクセスを許可していないことが原因です。

S3バケットポリシーに以下の設定を加えることで、パブリックな読み取りを明示的に許可します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::test-oac.com/*"
            ]
        }
    ]
}

これにより、http://test-oac.com.s3-website-ap-northeast-1.amazonaws.comを閲覧することが可能になりました。

CloudFrontを経由してS3のコンテンツを公開する

次に、S3バケットに直接アクセスするのではなく、CloudFrontを経由してアクセスするように設定していきます。
初めにCloudFront > ディストリビューション > 「ディストリビューションを作成」とクリックします。

様々な設定値がありますが今回は簡略化のため以下のように設定しました。その他はデフォルトの設定のままにしました。

  • Origin domain => test-oac.com.s3.ap-northeast-1.amazonaws.com
  • オリンジンアクセス=>Origin access control settingsを選択後、「Create new OAC」を選択して「create」を実行
  • 許可された HTTP メソッド => GET, HEAD
  • ウェブアプリケーションファイアウォール (WAF) => セキュリティ保護を有効にしないでください
  • デフォルトルートオブジェクト => index.html


    設定が完了するとディストリビューションが追加されていることが分かります。

このドメインにアクセスすると画面が表示されました。(私は設定が反映されるのに1分程度かかりました。)

以上でCloudFront経由でS3のファイルにアクセスする設定は完了です。

S3からのアクセスを拒否する

次にS3バケットから直接アクセスできないように設定をします。

S3バケットポリシーを編集する

現状のバケットポリシーでは、外部からのアクセスを全て許可している状態です。
これをCloudFront経由のみS3バケットへのアクセスを許可する設定に変更します。

{
    "Version": "2008-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Sid": "AllowCloudFrontServicePrincipal",
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudfront.amazonaws.com"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::test-oac.com/*",
            "Condition": {
                "StringEquals": {
                    "AWS:SourceArn": "arn:aws:cloudfront::<アカウントID>:d1bgqmmu07kzsl.cloudfront.net"
                }
            }
        }
    ]
}

パブリックアクセスを無効にする

以下のようにしてブロックします。

アクセスして確認

これで設定完了です。S3の静的ウェブサイトホスティングのURLを叩いた場合、権限エラーが表示されるようになっていることが確認できました。

おわりに

OACを用いてCloudFront経由でS3のコンテンツを公開することができました!

Discussion