CloudFrontキャッシュからのレスポンス確認

# はじめに
AWS初心者がVPC周りのリソースは一通り作ったけど、もう少しだけ凝ったものを作りたい。けど、難易度高すぎると手につかない。

ということで、CloudFrontを使ってコンテンツ配信し、キャッシュからのリクエスト確認を行ってみました！

今回のハンズオンでは、以下のAWSハンズオン教材を参考に行いました。

https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-StaticWebsiteHosting-2022-reg-event.html?trk=aws_introduction_page

# 準備
- 簡易的なHTMLファイル 
- S3バケット
- CloufFrontディストリビューション
- ブラウザ(今回はGoogle Chrome)
# 作成手順
## S3バケットの作成
まず初めに、S3バケットの作成を行います。
基本はデフォルトに沿った形で作成し、変更点のみ記述します。
今回、バケット名は「test-bucket-clf」とします。

![ap-northeast-1.console.aws.amazon.com_s3_bucket_create_region=ap-northeast-1&bucketType=general (1) - コピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843867/c5c3a56e-4f9b-1370-c50e-5fc3e848daf0.png)


本来はセキュリティ上の理由からアクセス制限を行った方が良いですが、今回の場合はパブリックアクセスを許可し、黄色枠の注意書き部分にあるチェックボックスをチェックします。

![ap-northeast-1.console.aws.amazon.com_s3_bucket_create_region=ap-northeast-1&bucketType=general (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843867/f2b1fe17-7b34-5569-acfe-9304b6e67f71.png)

その他の項目に関しては、デフォルトの設定とします。
記載の項目を変更した後、バケット作成を行います。
これにて、S3のバケット作成は完了となります。

![ap-northeast-1.console.aws.amazon.com_s3_bucket_create_region=ap-.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843867/a85b2dcc-72ac-8328-16dd-a60c39961079.png)


## 静的ウェブサイトホスティングの有効
この項目では、S3の機能である静的ウェブサイトホスティングを用いて、表示させたいコンテンツを表示します。
前項目で作成したS3のバケットを選択し、以下の設定を行います。
- コンテンツ(HTML)ファイルのアップロード
- 静的ウェブサイトホスティングの有効
- バケットポリシーの設定

![ap-northeast-1.console.aws.amazon.com_s3_buckets_region=ap-northeast-1&bucketType=general.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843867/4c99e2fc-8fed-0a90-1291-af199bcaf5a8.png)

### コンテンツファイルのアップロード
ここでは、S3にコンテンツをアップロードします。
コンテンツ内容に関しては、個人の趣向に合わせて適当に作成してください。 

:::note info
余談
今回は、ChatGPTで作成したHTMLファイルと用意した画像をアップロードしていきます。ファイルを用意するのが面倒な方は、ChatGPTを使用することをお勧めします！
:::

作成したバケットのオブジェクトを選択し、アップロードボタンを押すことで、バケットにオブジェクトをアップロードすることができます。

![ap-northeast-1.console.aws.amazon.com_s3_buckets_test-bucket-clf_region=ap-northeast-1&bucketType=general&tab=objects (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843867/68f437c1-4b04-1899-4b82-c9d7c0eac6ef.png)


### 静的ウェブサイトホスティングの有効
次に先ほどアップロードしたファイルを配信するために、静的ウェブサイトホスティングを有効化します。作成したバケット内のプロパティを選択した後、最下に設定項目があります。

静的ウェブサイトホスティングの有効にし、ホスティングタイプを静的ウェブサイトのホストに指定します。次に、インデックスドキュメントにアップロードしたコンテンツ(HTML)ファイル名を記述し、変更の保存するとこの項目は完了となります。

![ap-northeast-1.console.aws.amazon.com_s3_bucket_test-bucket-clf_property_website_edit_region=ap-northeast-1&bucketType=general.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843867/bb8f519b-5c02-2fe9-36c2-a769aad153ce.png)

### バケットポリシーの変更
ここでは、作成したバケットに対してパブリックアクセスが可能となるよう設定します。以下のコードをバケットポリシーに記入します。

```
{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Sid": "PublicReadGetObject",
          "Effect": "Allow",
          "Principal": "*",
          "Action": [
              "s3:GetObject"
          ],
          "Resource": [
              "arn:aws:s3:::xxxxxxxxx/*"
          ]
      }
  ]
}
```

記述内容のResource部分に作成したバケットのARNをコピペし、変更を保存します。
バケットARNについては、以下画像の赤枠部分に記載があります。

:::note warn
注意
Resource部分にバケットARNをコピペする際,「"/*"」部分は残した状態でコピペしてください。コンテンツにアクセスする際、エラーが発生します。
:::

![ap-northeast-1.console.aws.amazon.com_s3_bucket_test-bucket-clf_property_policy_edit_region=ap-northeast-1&bucketType=general (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843867/7b658b32-6d30-d3ec-07d4-9bdcf609ddb4.png)

今回は、バケットポリシーの内容については省きます。気になる方は以下のリンクを参照してください。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/access-policy-language-overview.html

### S3からのアクセス確認
この段階で問題なくコンテンツが見られるか確認します。プロパティを開き、最下にある静的ウェブサイトホスティングのリンクからアクセスします。無事コンテンツが表示されたら完了です。

![ap-northeast-1.console.aws.amazon.com_s3_buckets_test-bucket-clf_region=ap-northeast-1&bucketType=general&tab=properties (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843867/ee439fa1-02af-88ab-cc54-6683c94b6736.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843867/618c0a42-08d6-2b2c-1443-b8e757765d02.png)

::: note alert
注意
ここで変更して頂きたい項目が３つあります。この設定を行った後、次のステップに進んでください。

・S3のパプリックアクセスブロックを有効化
・バケットポリシーをリセット
・静的ウェブサイトホスティングを無効化

これまで静的ウェブサイトホスティングのための設定でした。CloudFrontを用いる際には、S3からの直接アクセスが必要ではないため、設定を戻します。
:::

## CloudFrontディストリビューションの作成
この項目では、コンテンツデリバリサービスであるCloudFrontを使い、S3より配信するコンテンツのキャッシュ場所を作ります。これにより２度目のアクセス以降、CloudFrontのキャッシュよりレスポンスされるようになります。

まず初めに、CloudFrontを検索し、ディストリビューションを作成を押し、作成を始めます。

![us-east-1.console.aws.amazon.com_cloudfront_v4_home_retheast-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843867/5c9cc144-01b5-8172-2771-2b797a50114d.png)

Origin domainについて、先ほどのバケット名にて検索し選択します。

ここで、オリジンアクセスを設定します。オリジンアクセスをOrigin access control settingに変更し、Create new OACをクリックして、OACの作成を行います。

![us-east-1.console.aws.amazon.com_cloudfront_v4_home_region=ap-northeast-1 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843867/6b8a1331-c557-3105-43dc-6ba0d9eb15e4.png)


ここは特に変更せず、そのままOACを作成してください。作成すると自動で設定に反映されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843867/0f60fc5f-6213-4817-1417-5b4af01353f0.png)


OAC作成後、以下の画像の通り、バケットポリシーの変更の必要があると報告されます。こちらはポリシーをコピーして、先程作成したバケットのバケットポリシーに張り付け保存してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843867/425df8c4-750d-660d-df5c-85da187be2c5.png)


![us-east-1.console.aws.amazon.com_cloudfront_v4_home_region=ap-northeast-1 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843867/ebb22674-3665-c8c7-0c91-6e3f198872f8.png)

ウェブアプリケーションファイアーウォール(WAF)について、今回はセキュリティ保護を有効にしない設定とします。本来は、WAFを有効にすることが推奨されます。

その他設定はデフォルトとし、ディストリビューションを作成します。

![us-east-v4_home_region=ap-northeast-1 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843867/75c502f2-be50-d412-bf5b-13e7b14d87eb.png)

この段階で、準備完了となります。次の項目よりコンテンツのレスポンス元の確認に入ります。

# CloudFrontキャッシュの確認
　CloudFrontからアクセスを行います。初めに新規タブを開き、デベロッパーツールを開いた状態にしておきます。作成したCloudFrontディストリビューションを開き、一般にあるディストリビューションドメイン名を用いて、先程用意したページ上でアクセスします。

![コメント 2024-07-25 103706.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843867/1e55d9f2-b4c7-f352-477a-12c5ce4eed20.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843867/5f891a88-c837-a02a-d616-eee0b33111cc.png)

アクセスできたら、デベロッパーツールから動物画像とコンテンツファイルのNetwork部分を確認します。

赤枠で囲われたレスポンス部分を見てみると、S3のサーバーからレスポンスが来ていることが分かります。また、X-cashを見てみるとmiss from CloudFrontと記載があります。これはCloudFrontのキャッシュが用いられていないことを意味します。


![コメント 2024-07-26 111521.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843867/435c0510-0ce9-f8fd-7c7f-3da462226794.png)
![コメント 2024-07-26 111517.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843867/cf69ef88-2c7f-1f44-09eb-1732fff7d649.png)


では次に、この状態でページを更新してもう一度デベロッパーツールを確認していきます。

レスポンス部分の最下を見ると、S3と比べX-cashが追加されていて、Hit from Cloudfrontと記載されています。これより、CloudFrontのキャッシュからレスポンスされていることが分かります。

:::note warn
注意
X-cashにmiss form CloudFrontと記載された場合、ブラウザ側のキャッシュからレスポンスを受けている可能性があります。その場合は、ブラウザのキャッシュを消して再度更新を行うと解決します。
:::

![コメント 2024-07-26 105417.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843867/a71defb0-6e9b-9d44-8310-bda92b8f7173.png)
![コメント 2024-07-26 105501.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3843867/89e56dff-93f1-3a6b-edfb-48caff33e62c.png)
# おわりに
今回は、CloufFrontキャッシュからのレスポンス確認を行いました。知識としては知っていた内容でしたが、実際の操作機能などを知らない状況でした。ハンズオンを行うことで、内容についての理解度向上や操作の把握に繋がりました。

座学ではなく手を動かすことによって、興味や理解の深まりを得ることができるという点で非常に良かったです。

もしVPC周りのリソースは一通り作ったけど、程よい難易度で少し凝ったものを作りたいという方がいらっしゃいましたらお勧めです。是非やってみてください！