静的ウェブサイトをCloudFront経由のアクセスしか許可しないようにしてみる

# 概要

本記事は [AWSでWebアプリを構築してみる](https://qiita.com/ti_and6id/items/9670ee60965a4d10bec7) シリーズの3回目の記事です。
前回の記事は[こちら](https://qiita.com/ti_and6id/items/c257f9d011f84b97ac3e)。

# 本記事で作成する構成

本記事では静的ウェブサイトをCloudFront経由のアクセスしか許可しないようにしてみます。
![AWS.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630916/7a173c6e-0ddb-d0a2-b410-283908b3b5ca.png)
ここでは図のようにCloudFrontを経由した間接的なアクセスのみ可能な状態で、S3でホスティングした静的ウェブサイトに直接アクセスすることができなくなります。

# 静的ウェブサイトをCloudFront経由のアクセスしか許可しないようにする

## 1. S3の設定を変更する

1. [静的ウェブサイトホスティングでホスティングしてみる](https://qiita.com/ti_and6id/items/fe652f89d8919052c91c)で作成したバケットを開き、プロパティタブから「静的ウェブサイトホスティング」の「編集」をクリックし、静的ウェブサイトホスティングを無効にする

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630916/5fb0d4d2-5988-8a75-d812-2c21a802ac51.png)

1. [静的ウェブサイトホスティングでホスティングしてみる](https://qiita.com/ti_and6id/items/fe652f89d8919052c91c)で作成したバケットを開き、アクセス許可タブから「ブロックパブリックアクセス（バケット設定）」の「編集」をクリックし、パブリックアクセスをすべてブロックする

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630916/1a18c8dc-f8b1-846d-5e63-3dd583f630cd.png)

## 2. CloudFrontでOACを作成する

1. マネジメントコンソールからCloudFrontを開き、セキュリティのオリジンアクセスを開き、「コントロール設定を作成」をクリック

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630916/3a1ed2d3-9cf9-08a9-cdb1-235531d74a0c.png)

1. 「名前」に例えば ``S3バケット名-oac`` のよう名前を入力してコントロール設定を作成する

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630916/8aa381e4-5019-0ff2-bb98-3bd1f793be37.png)

1. [静的ウェブサイトホスティングにCloudFrontを経由してアクセスしてみる](https://qiita.com/ti_and6id/items/c257f9d011f84b97ac3e)で作成したCloudFrontのディストリビューションを開き、オリジンタブから作成したオリジンを選択して「編集」をクリック

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630916/ed1b2efb-b45d-3693-bd2f-cc05ca558462.png)

1. 「Origin domain」で[静的ウェブサイトホスティングでホスティングしてみる](https://qiita.com/ti_and6id/items/fe652f89d8919052c91c)で作成したバケットを選択し、「オリジンアクセス」を「Origin access control setting(recommended)」を選択し、「Origin access control」にさきほど作成したコントロール設定を選択して変更を保存します。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630916/a07f120a-7a8e-a1ba-7e32-42d0a190be38.png)

1. [静的ウェブサイトホスティングにCloudFrontを経由してアクセスしてみる](https://qiita.com/ti_and6id/items/c257f9d011f84b97ac3e)で作成したCloudFrontのディストリビューションを開き、一般タブから「設定」の「編集」をクリック
    
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630916/f215724e-d17d-7b9b-7ecf-fb7925df2550.png)

1. 「デフォルトルートオブジェクト」に「index.html」を設定する

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630916/509b2d35-3242-8ff5-adec-c87d2d95c4bc.png)


## 3. S3のバケットポリシーにOAIを設定する

1. [静的ウェブサイトホスティングでホスティングしてみる](https://qiita.com/ti_and6id/items/fe652f89d8919052c91c)で作成したバケットを開き、アクセス許可タブから「バケットポリシー」の「編集」をクリックし、[静的ウェブサイトホスティングにCloudFrontを経由してアクセスしてみる](https://qiita.com/ti_and6id/items/c257f9d011f84b97ac3e)で作成したCloudFrontのディストリビューションのIDをPrincipalにOAIにしてバケットポリシーを設定する

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630916/d260b890-4449-30e3-e7c8-ace1fb3fa118.png)


    ```
    {
        "Version": "2012-10-17",
        "Statement": {
            "Sid": "AllowCloudFrontServicePrincipalReadOnly",
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudfront.amazonaws.com"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::<S3 バケット名>/*",
            "Condition": {
                "StringEquals": {
                    "AWS:SourceArn": "arn:aws:cloudfront::<AWS アカウント ID>:distribution/<CloudFront ディストリビューションID>"
                }
            }
        }
    }
    ```

## 4. アクセスを確認する

1. [静的ウェブサイトホスティングにCloudFrontを経由してアクセスしてみる](https://qiita.com/ti_and6id/items/c257f9d011f84b97ac3e)で作成したディストリビューションの一般タブを開き、「ディストリビューションドメイン名」をコピーしてブラウザで開き、アクセスできることを確認する

1. [静的ウェブサイトホスティングでホスティングしてみる](https://qiita.com/ti_and6id/items/fe652f89d8919052c91c)で作成したバケットから「index.html」のオブジェクトを開きプロパティタブにあるオブジェクトURLを開いてもアクセスが拒否されることを確認する