Fargate＋WordPress構築　S3と連携 ③

# はじめに
・[Fargate＋WordPress構築 WordPressが表示されるまで ①](https://qiita.com/holdout0521/items/bde67b8334f3362c8009)
・[Fargate＋WordPress構築　HTTPS化 ②](https://qiita.com/holdout0521/items/2a199770cf14b6289bca)
の続きです。

現在の状態では、画像を保存しても、コンテナが停止するとなくなってしまいます。
WordPressのプラグインである[WP Offload Media Lite](https://ja.wordpress.org/plugins/amazon-s3-and-cloudfront/)を使用し、S3に画像を保存することで、コンテナが停止しても画像が表示されるようになります。
また、CloudFrontで画像をキャッシュする仕組みをつくります。

# 完成構築図
![スクリーンショット 2022-11-23 14.23.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/e7dce1b0-d1d4-4d1a-ef45-06cf46d95c97.png)

# 流れ
- ALBを設置
- Route53を作成
- Dockerfileを作成
- ECRを作成
- クラスターを作成
- タスク定義を作成
- サービスの作成
- ACM証明書を作成
- ELBに証明書を設置
- 証明書を設置したCloudFrontを作成
- Route53でCloudFrontへのルーティング設定
`↓ここから`
- IAMロール作成
- S3を作成し、Wordpressのプラグインで連携
- CloudFrontで画像等のキャッシュ設定
- キャッシュの確認

# IAMロール作成
`S3FullAccess`ポリシーを持ったIAMロールを作成し、タスク定義の`タスクロール`にアタッチします。
これによってFargateは、S3へのアクセス権限を持つことができます。

タスク定義を更新しましたので、必ず`サービスのタスク定義を最新`にし、タスクを再起動しましょう

![スクリーンショット 2021-10-25 23.18.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/39fa50b3-09a6-ec76-d337-20987368c978.png)




# S3を作成し、Wordpressのプラグインで連携
S3を作成し、プラグインでメディアファイルをS3に保存します。


まず、S3バケットを作成します。`名前`を記述し、`パブリックアクセスをすべてブロック`のチェックを外し、`ACL有効`にし、他はデフォルトで作成します。

<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/6675d0c1-c55f-9e84-3088-9e0f581ca912.png">

<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/7044ee69-af85-c445-dd5b-47c46e519f1f.png">


そして、URL:`https://xxxx.work/wp-admin/install.php`にアクセスして、言語やサイト名を適当に入力し、`WordPressインストール`をクリックします。
<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/58f9fa5b-a4a4-a047-7439-ffb6ee0f418f.png">

WordPressのプラグインに移動後、`WP Offload Media Lite`のバージョンを更新し、`有効化します。`
<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/ec3577e8-81ef-1328-74f8-0851cf0aca53.png">

`use IAM Poles`を選択します。
先程、IAMロールをアタッチしましたので、OKです。


![スクリーンショット 2021-10-25 23.14.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/db7c9964-8492-f85a-cae6-8c40b8d73d52.png)


先ほど作成したバケット名を記入し、保存します。

<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/4dc7432c-869c-7843-f570-cf899a1bc40c.png">

Pathは`wp-content/uploads/`になっております。
DELIVERYのAmazon S3の`Change`をクリックします。
<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/cd783514-6425-fb4e-aed5-0b24cdc23df8.png">

CloudFrontを選択し、保存します。

<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/a081c5d9-c4c9-c206-417a-24a11c6cbdfb.png">

`Custom Domain (CNAME)`にドメイン`xxxx.work`を入力し、保存します。

<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/70a64f5c-4624-3a8f-7bfd-0588ed0d682c.png">
画像のURLは、`https://ドメイン/wp-content/uploads/s3保存先/`になっていることを確認します。

<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/46a7f82e-332e-b662-32bf-bba5c8592c01.png">

画像を添付した記事を投稿し、コンテナを停止、起動しても画像が表示されていることを確認します。
また、S3にも保存されていることを確認します。

### エラー①
`WP Offload Media Lite`をインストール後以下のエラー分が発生

```
サイトで技術的な問題が発生しています。サイト管理者のメールを確認して指示に従ってください。
```

**CloudFrontをキャッシュを削除、chromeのキャッシュ削除すると、コンテナを再起動すると解決しました。**

### エラー②
投稿するため、画像を添付すると、`この画像にはalt属性が指定されておらず、ファイル名はx.jpgです`と表示される。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/898839de-ed78-eb0a-e804-e1501a2712f9.png">

**コンテナを再起動すると、解決しました**


# CloudFrontで、画像等のキャッシュ設定
・オリジンを1つ作成
・ビヘイビアの3つ作成します。

## オリジンの作成
現在1つオリジンがあり、ALB経由でコンテナ内にアクセスしますが、画像はS3にありますので、S3用のオリジンを作成します。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/4fbf2294-3736-f75b-340f-60c024cb7f43.png">

### オリジンの作成
　・オリジンドメイン：`[S3で作成したバケットを選択]`
　・オリジンパス：`なし`
　・S3バケットアクセス：`はい、OAIを使用します。`
　・オリジンアクセスアイデンティティ：`新しいOAIを作成`
　・バケットポリシー：`はい、自動で更新します。`

![スクリーンショット 2021-10-25 23.27.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/f7bb7154-cafa-025c-f93e-738d96b8dd5e.png)

#### S3のバケットポリシーにOAIが反映
`新しいOAIを作成`を選択してオリジン作成しました。
作成後、S3バケットポリシーを確認すると、以下の通り、S3のオブジェクトは、CloudFrontのみが取得することができることがが分かります。

```json
{
    "Version": "2008-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity E1JRJRKHE5P02C"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::wordpress-s3-20211006/*"
        }
    ]
}
```

オリジンが2つになりました。
<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/d74f4ab4-ca93-f5db-858e-2bd4526b8fe7.png">

## ビヘイビア作成
WordPressでは、　`phpファイル`と`wp-adminディレクトリ配下`の2つは、キャッシュしません。
キャッシュするものは静的な画像やhtmlファイルであり、動的なファイルをキャッシュすると不具合が出てしまいます。

ALB経由でコンテナ内にアクセスするオリジンに対して、`phpファイル`と`wp-adminディレクトリ配下`をキャッシュしないようにします。
また、S3経由でS3の画像にアクセスオリジンに対して、画像などの`/wp-contet/uploads配下`全てキャッシュするようにします。
<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/efb11a0b-e5cc-de6b-7d96-651a48edd22d.png">

### オリジンがALBの`phpファイル`のビヘイビアを作成

設定
　・パスパターン：`*.php`
　・オリジンとオリジングループ:`[作成したALBを選択]`
　・オブジェクトを自動的に圧縮:`No`
　・ビューワープロトコルポリシー:`Redirect HTTP to HTTPS`
　・許可されたHTTPメソッド：`GET,HEAD,OPTION,PUT,POST,PATCH,DELETE`
 ビューワーのアクセスを制限する：`No`
　・`Cache policy and origin request policy (recommended)`:
`キャッシュポリシー`：`CachingDisabled`
`オリジンリクエストポリシー`：`AllViewer`

![スクリーンショット 2021-11-05 22.40.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/a91dfade-27ba-4a7c-c98d-cda60becbea5.png)

### オリジンがALBの`wp-adminディレクトリ配下`のビヘイビアを作成
設定
　・パスパターン：`/wp-admin/*`
　・オリジンとオリジングループ:`[作成したALBを選択]`
　・オブジェクトを自動的に圧縮:`No`
　・ビューワープロトコルポリシー:`Redirect HTTP to HTTPS`
　・許可されたHTTPメソッド：`GET,HEAD,OPTION,PUT,POST,PATCH,DELETE`
 ビューワーのアクセスを制限する：`No`
　・`Cache policy and origin request policy (recommended)`:
 `キャッシュポリシー`：`CachingDisabled`
 `オリジンリクエストポリシー`：`AllViewer`

![スクリーンショット 2021-11-05 22.43.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/c4af4d59-6e5d-f752-b938-ae15dc0df742.png)

### オリジンがALBの`wp-jsonディレクトリ配下`のビヘイビアを作成

`wp-admin`ディレクトリ配下と同じ設定で作成します。

### オリジンがS3の`/wp-contet/uploads配下`のビヘイビアを作成
設定
　・パスパターン：`//wp-content/uploads/*`
　・オリジンとオリジングループ:`[作成したS3を選択]`
　・オブジェクトを自動的に圧縮:`Yes`
　・ビューワープロトコルポリシー:`Redirect HTTP to HTTPS`
　・許可されたHTTPメソッド：`GET,HEAD`
 ビューワーのアクセスを制限する：`No`
　・`Cache policy and origin request policy (recommended)`: `キャッシュポリシー`：`CachingDisabled`、 `オリジンリクエストポリシー`：`なし`

<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/90a6f631-43af-a2ec-5991-66913208a300.png">





ビヘイビアは4つできました。優先順位は画像の通りです。
![スクリーンショット 2021-11-05 22.49.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/3b200a9d-be00-6a9e-d324-6a3b23ea6f04.png)


### オリジンがALBの`デフォルト (*)`のビヘイビアについて
前回作成した`デフォルト (*)`のビヘイビアは、キャッシュしない設定にしています。
というのも、`phpファイル`と`wp-adminディレクトリ配下`以外にもキャッシュすると不具合が出る可能性があるためです。
（プラグインの影響やjsファイルなど）
ただし、ネットでは問題ないという記事もあるため、`デフォルト (*)`に対してキャッシュする設定にしてもいいかもしれません。
その場合は、`デフォルト (*)`に対して以下の設定をするとキャッシュできます。
設定
　・パスパターン：`デフォルト (*)`
　・オリジンとオリジングループ:`[作成したALBを選択]`
　・オブジェクトを自動的に圧縮:`Yes`
　・ビューワープロトコルポリシー:`Redirect HTTP to HTTPS`
　・許可されたHTTPメソッド：`GET,HEAD`
 ビューワーのアクセスを制限する：`No`
　・`Cache policy and origin request policy (recommended)`: `キャッシュポリシー`：`CachingDisabled`、 `オリジンリクエストポリシー`：`AllViewer`


# キャッシュの確認
画像に対してキャッシュできているか確認します。
画像のリンクをコピーしアクセスします。URLはこちらのようになっているはずです。
`https://xxxx.work/wp-content/uploads/2021/10/06222544/%E3%82%A2%E3%83%8F%E3%82%99%E3%82%BF%E3%83%BC%E7%94%A8.jpg`
<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/01e628bb-2539-57f0-6638-5b3e0a91d75f.png">
<img width="800" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/988747/0d872650-eb57-2b71-cfe9-b5b285bec30e.png">


ターミナルの以下のコマンドでキャッシュできているか確認できます。

```
$ curl -I <http://cloudfrontのドメインネーム/>

$ curl -I https://xxxx.work/wp-content/uploads/2021/10/06222544/%E3%82%A2%E3%83%8F%E3%82%99%E3%82%BF%E3%83%BC%E7%94%A8.jpg

HTTP/2 200 
content-type: image/jpeg
content-length: 34450
date: Wed, 06 Oct 2021 14:39:45 GMT
last-modified: Wed, 06 Oct 2021 13:25:45 GMT
cache-control: max-age=31536000
expires: Thu, 06 Oct 2022 13:25:44 GMT
accept-ranges: bytes
server: AmazonS3
x-cache: Hit from cloudfront
```
**キャッシュできていない**
`x-cache: Miss from cloudfront`

**キャッシュできている**
`x-cache: Hit from cloudfront`


ついに完成しました!

この記事では、CodePipelineを利用したECSのローリングデプロイの方法を紹介しています。

https://qiita.com/holdout0521/items/3aeeb9c9f9e663778ed7


こちらではコンテナ内にアクセスするECS Execを紹介しています。

https://qiita.com/holdout0521/items/0725a476f587e1d64253





# 参考

https://blog.freamap.co.jp/wordpress-cloudfront

https://qiita.com/Ichiro_Tsuji/items/38592e737257cb45ca13

https://inaba-serverdesign.jp/blog/20200609/wp_offload_media_lite_cloudfront_s3.html