VPSサーバー上のWordPressをAWS S3にバックアップ

## やりたいこと
さくらのVPSサーバー上にあるWordPressのバックアップを取りたい
１日に１回バックアップを取りたい
バックアップデータの保持先はAWS S3上にする

## 私の技術レベル
 - さくらのVPS/さくらのクラウドのようなIaaS環境でのWebサーバー構築は何度か行っていて、Linux操作には慣れている
 - AWSは精通していないが業務でなんとなく使っている
 - S3は「安くファイルをおける場所。読み書きのためにAWSキーとAWS CLIコマンドが必要」というくらいの理解だった。

## 設計
 - MySQL DB dumpデータとWordPressディレクトリをgzip圧縮し、awsコマンドでS3にPUT
 - AWS S3アクセスキーはVPSサーバー上に保持
 - VPSサーバー上でcronで毎日AM02:00にバッチ実行
 - S3上には過去10日分だけ保持

## TODO
 - 1.AWS S3バケットの作成
 - 2.適切な権限のアクセスキー発行
 - 3.ライフサイクルポリシーの設定
 - 4.「MySQL DB dumpデータとWordPressディレクトリをgzip圧縮し、awsコマンドでS3にPUT」を行うshファイルを作成
 - 5.shファイルを手動実行し、バックアップ成功することを確認
 - 6.shファイルを毎日実行するようcron設定

### 1.AWS S3バケットの作成
<img width="1095" alt="スクリーンショット 2020-08-09 15.39.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31318/9cda21e3-5431-d053-29a1-dd4f3c4a5b8d.png">
バージョニングだけチェックを入れて、他はデフォルトのまま、バケット作成。過去10日分のバックアップを同じファイル名で済ますためのバージョニング

### 2.IAM設定をし、適切な権限のアクセスキー発行
作成したS3バケットに対してのみ操作可能というポリシーを作成→その権限だけを持つユーザー作成、と進める。

まずAWS IAM画面設定にて、「作成したS3バケットに対してのみ操作可能」というポリシーを作る。[ポリシーの作成]から作っていく。
<img width="1165" alt="スクリーンショット 2020-08-09 15.46.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31318/af546cc9-b8ea-34b4-92dd-b8abc36fff2f.png">

<img width="1032" alt="スクリーンショット 2020-08-09 22.51.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31318/8b62591c-bdd7-ed72-7223-0af9619fb166.png">
`サービス=S3`
`アクション=*(全て)`
`リソース=object -> ARNの追加でさっき作成したS3バケットのARNを指定`

<img width="752" alt="スクリーンショット 2020-08-09 22.25.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31318/bfd5397b-219f-e606-449d-494cac21c9d4.png">
**（はじめ、リソース=bucketと指定してしまい後で詰まった。画像のようにobjectリソースを指定しないといけないよう。）**

　
　
次にIAMユーザーを作成する。そのユーザーはAWS Webダッシュボードにログインさせたいユーザーではなく、CLI用ユーザーなので `アクセスの種類:プログラムによるアクセス` を選択。
<img width="989" alt="スクリーンショット 2020-08-09 22.26.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31318/8b5c094c-0955-5131-18a4-583916dd83cd.png">

ユーザーに、先ほど作成したポリシーのみをアタッチしユーザー作成。
適切な権限のアクセスキーが発行完了。

### 3.ライフサイクルポリシーの設定
<img width="1150" alt="スクリーンショット 2020-08-09 16.00.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31318/57e2fa4e-3226-a7d4-e9fd-dc7541932e5d.png">
[+ライフサイクルルールの追加]をする

バックアップデータ置き場専用のバケットのため、バケット内のすべてのオブジェクトに適用
<img width="691" alt="スクリーンショット 2020-08-09 16.01.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31318/8b465cf2-20ee-9134-4d2f-7f9755a4accc.png">

S3にPUTされた最新バージョンのファイルは削除して欲しくないので「現行バージョン」にはチェックを入れない。
最新バージョン以前のバージョンのファイルは10日分保持させればよい、つまりバックアップファイルは10日分保持されてればよいので「以前のバージョン」をチェックし、10日と設定。
<img width="685" alt="スクリーンショット 2020-08-09 18.57.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31318/dd0f41c0-f6aa-0b60-4a91-a23776925c07.png">

### 4.shファイルを作成。「MySQL DB dumpデータとWordPressディレクトリをgzip圧縮し、awsコマンドでS3にPUT」を行う

python3,pip,aws-cliのインストールについては省略
awsコマンドのインストール完了後、 `aws configure` して、作成したIAMユーザーのアクセスキー+シークレットキーを設定する。

ブラウザでAWS S3コンソール上でバケットに適当なファイルをアップロードし、

```
aws s3 ls s3://yourbacketname
```
でバケット内のファイル表示できることを確認する。

### 5.shファイルを手動実行し、バックアップ成功することを確認
```~/backup/backup.sh
#!/bin/sh#

# WordPressのディレクトリをコピー。管理画面からアップロードされた画像などをバックアップ
\cp -rf /var/www/mywordpress.com ~/backup
# DBdumpデータをバックアップ
mysqldump -u MYSQL_USER -pMYSQL_PASS -h MYSQL_HOST MYSQL_DB > ~/backup/mywordpressdb_dump.sql

# ディレクトリやsqlファイルを圧縮
tar czf ~/backup/mywordpress.com.tar.gz ~/backup/mywordpress.com
tar czf ~/backup/mywordpressdb_dump.tar.gz ~/backup/mywordpressdb_dump.sql

# S3にPUT
aws s3 cp ~/backup/mywordpress.com.tar.gz s3://yourbacketname/mywordpress.com.tar.gz
aws s3 cp ~/backup/mywordpressdb_dump.tar.gz 
s3://yourbacketname/mywordpressdb_dump.tar.gz 
```
試行錯誤しながら、↑のようになった。tarでアラームでるが

```
sh ~/backup/backup.sh
```
アップロード成功を確認
<img width="1096" alt="スクリーンショット 2020-08-09 22.37.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31318/47a2a593-855c-435c-cef9-559d1ea141ca.png">

### 6.shファイルを毎日実行するようcron設定

```
crontab -e
```

```
0 2 * * * /home/yourname/backup/backup.sh
```

多分動くので10日後確認します