データベースのダンプをAmazonS3にアップロード

オンプレミスで動かしているデータベースサーバのバックアップを誰も取っていなかった。
簡単なシェルスクリプトで、AWSのオンラインストレージ、**S3バケット**にバックアップするようにしたので、手順を紹介する。

# 準備
## グループにポリシーをアタッチ
グループを作成し、ポリシーをアタッチする。
ただし、IAMユーザから直接ポリシーにアタッチする場合は、本作業は不要である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/e70499a6-88de-c982-08f2-4e79cfc35ebc.png)
今回は、AWSが標準で提供するポリシー（`AmazonS3FullAccess`）にアタッチする。
バケットを限定したい等の要件があれば、次のようなポリシーを作成しても良い。

```json:JSON
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::your-bucket1",
                "arn:aws:s3:::your-bucket2"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::your-bucket1/*",
                "arn:aws:s3:::your-bucket2/*"
            ]
        }
    ]
}
```

なお、後述する WinSCP 等のファイル転送ソフトを使う場合で、バケットの一覧を表示するには `ListAllMyBuckets` 権限も付与すること。

:book: [S3バケットのオブジェクトへの読み取りおよび書き込みアクセスを許可する](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_examples_s3_rw-bucket.html)

## S3専用IAMユーザ作成
IAMユーザを作成し、先ほどのグループに所属させるか、ポリシーに直接アタッチする。
[プログラムによるアクセス] にチェックを入れること。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/fe4feccb-9a73-7993-7cfd-90fcd4b6742d.png)
アクセスキーをダウンロードする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/bedeb237-2213-d1d4-03ef-5b7fe7a6bc1f.png)

## AWS CLIのインストール
**AWS CLI**（*AWS Command Line Interface*）は、マネジメントコンソールで提供されるすべての機能をコマンドベースでも利用できるようにしたツールだ。
`apt`や`yum`などのリポジトリで参照できるが古い場合があるので、そのときはPythonのパッケージ管理ツール`pip`でインストールしよう。

```
# apt -y install awscli

# aws --version
aws-cli/1.11.13 Python/3.5.2 Linux/4.4.0-145-generic botocore/1.4.70
```

## 認証情報の設定
ダウンロードしたアクセスキーを入力する。
デフォルトのリージョンには、一番安いオレゴン（月あたり 0.023USD/GB）を選択した。

```
# aws configure
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Default region name [None]: us-west-2
Default output format [None]: json

# aws configure list
```

## S3バケットの作成
バケット名はそのままURLになるため、すべてのS3ユーザでユニークなものとなる。

```
# aws s3 mb s3://mindwood
make_bucket: mindwood
```

```:バケットの一覧表示
# aws s3 ls
2019-08-18 00:00:00 mindwood
```

# スクリプトの作成
環境が準備できたのでスクリプトを設置する。
**MySQL**のダンプを圧縮し、`aws s3 cp`コマンドでアップロードするだけのシンプルなスクリプトだ。
一応、曜日をキーにすることで7世代まで対応させた。

```bash
#!/bin/bash
FILE=/tmp/dump`date +%w`.gz
mysqldump -u ユーザ名 -pパスワード データベース名 --hex-blob | gzip > $FILE  # -pとパスワードの間に空白を入れないこと。バイナリカラムが無ければ--hex-blob不要
aws s3 cp $FILE s3://mindwood                                 # テスト時は--dryrunオプション推奨
rm $FILE
```

あとは、このシェルを`cron`に仕掛けておけばOKだ。
アップロードされたファイルは次のコマンドで確認できる。`--recursive`を付けると再帰的にリストされる。

```
aws s3 ls s3://mindwood
```

# WinSCPでS3を使うには
Windows で scp を使うときの定番ソフト **WinSCP** が、バージョン5.13からAmazon S3プロトコルに対応している。
![winscp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236222/17efcac3-9f90-d7d4-c4e4-4253221c12c5.png)

# さいごに
アクセスキーを、ソースコードや環境定義ファイルに残したままGitHubに公開し、サーバをクラッカーに乗っ取られるという事件が後を絶たない。アクセスキーの管理にはくれぐれも気を付けよう。