【AWS】S3＋CloudFront オリジンデータ更新時のキャッシュ動作

## 意義
S3＋cloudfrontのサービスでS3データ(オリジン）更新時にユーザーの見え方についてどのような動作になるのかを確認するために実施

## 前提として
今回は手動での動きや操作を確認したいが自動化の場合は下記URLのようなS3イベント通知→Lamdba実行→キャッシュ削除が一番効率は良いと思う。今回はあえて手動で実施する。
https://zenn.dev/collabostyle/articles/3e7866de979682

## 使用サービス
・S3
・CloudFront

## 準備作業
今回は事前に準備してある"index.html"ファイルを使用して作成。
一連の設定は下記の通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557022/da8ed794-d162-6440-2fe5-ee737ff0192e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557022/f7f478c2-d75b-33e3-5cae-22a6a9e3c69d.png)

ファイルをアップロード(index.html以外は任意)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557022/ed5069ea-369f-51b6-766a-e785f467bedd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557022/4f90428d-23ea-bbaf-6053-469ed82f9a58.png)

静的ウェブサイトホスティングの有効化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557022/b77ff4f4-f739-a519-2d1a-b9494a4c446d.png)

ポリシーの追加(Getobjectの有効化)
```
{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Sid": "PublicReadGetObject",
          "Effect": "Allow",
          "Principal": "*",
          "Action": [
              "s3:GetObject"
          ],
          "Resource": [
              "arn:aws:s3:::cache.test25/*"
          ]
      }
  ]
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557022/c9adf277-8cc6-09dc-65bb-46b8c617114a.png)

index.htmlファイルの中身は下記のように
※ping等は任意
```html
<!DOCTYPE html>

<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>キャッシュテスト</title>
  <link rel="icon" href="favicon.ico">
  <link rel="stylesheet" href="styles.css">
</head>
<body>
  <div>
  </div class="icon">
    <img src="lambda.png">
      まず初めにこの画面を確認します
    </div>
  </div>
</body>
</html>
```

これで以下のようにアクセスを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557022/34967e8d-e445-7c91-2cc5-801072cb6e08.png)

## CloudFrontの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557022/8cb4a03d-7908-f98c-80f7-9aa7f0d3ed8d.png)
オリジンが指定されていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557022/bd8bfdad-0cb1-452a-d8cd-a91f34b0d879.png)

cloudfrontのディストリビューションドメイン名からアクセスでF12→Network→サイトのリロードでファイルを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557022/b4d1c86c-36ae-0b4e-4f53-4b1ecd4e95c3.png)

x-cacheがcloudfrontで確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557022/caad588a-431c-764b-372c-6b4c3f03c8ea.png)

※Windows　cttl+F5でキャッシュ削除後にCloudFront(エッジ)からキャッシュをとれていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557022/84c38f4c-f5ad-72fb-3d7b-bf026cee0763.png)

### ここまでが事前作業！！

# 本題
indexファイル編集時にどういった挙動になるか確認
👇元画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557022/1f814cd7-5208-d898-82a2-7f8db0fc31a9.png)

ファイルを下記のように編集
```
<!DOCTYPE html>

<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>キャッシュテスト</title>
  <link rel="icon" href="favicon.ico">
  <link rel="stylesheet" href="styles.css">
</head>
<body>
  <div>
  </div class="icon">
    <img src="lambda.png">
      次にこの画面が見えています
    </div>
  </div>
</body>
</html>
```
CLIでS3にあげる
```
aws s3 cp index.html s3://cache.test25
```
数秒後リロードすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557022/1990aa36-1b42-ffd7-3275-99090df9a2f8.png)

キャッシュが残っているので変わらない。。

cloudfrontの画面で全パス削除を作成
```
/*
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557022/81302f18-aa58-853e-2d7c-5a313cc6d25e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557022/8cc9d2c3-2688-8b13-f8a2-67c5285abb9f.png)

サイトをリロードすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557022/eb762275-a7ac-95ec-64d0-b57f6ffa9201.png)

更新されていることを確認

## 学習点
大型のサービスであればファイル更新→S3イベント通知→Lamdba→キャッシュ削除にすれば自動化できるが、更新頻度も少ない場合などはCloudFrontの設定でキャッシュ削除できることからケースごとで使い分けることで金額を抑えることも可能だと感じた。