WordPressの記事や画像をS3にバックアップする方法

WordPressで保存された記事やアップロードされた画像を、S3にアップロードする方法を紹介します。なお、保存対象のWordPressは、EC2(Amazon Linux AMI)で動いているものとします。

S3にアクセスする権限の追加

IAMを使って、バックアップ先のS3に対して書き込みなどの権限を追加します。追加するPolicyの内容は以下の通りです。<BUCKET_NAME>には、バックアップ先のバケット名を指定します。

※Policyの設定方法に関しては、下の備考にまとめてあります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt000000001",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": [
                "arn:aws:s3:::<BUCKET_NAME>",
                "arn:aws:s3:::<BUCKET_NAME>/*"
            ]
        }
    ]
}

s3:DeleteObjectを設定しているのは、s3 syncコマンドに--deleteオプションを指定するからです。

バックアップ用スクリプト

バックアップ用のスクリプトは以下のようになります。<>で囲まれた部分を、環境に応じた内容に設定します。

#!/bin/sh
AWS_BIN=/usr/bin/aws
MYSQLDUMP_BIN=/usr/bin/mysqldump

# 保存先のバケット名
AWS_BUCKET_NAME=<BUCKET_NAME>

# MySQLのユーザ名
MYSQL_USER=<MYSQL_USERNAME>
# MySQLのホスト
MYSQL_HOST=<MYSQL_HOST>
# MySQLのパスワード
MYSQL_PASS=<MYSQL_PASSWORD>
# MySQLのDB名
MYSQL_DBNAME=<MYSQL_DBNAME>
# MySQLの、バックアップの一時保存先
MYSQL_TEMPPATH=/tmp/dump.sql
# MySQLの、S3の保存先パス
MYSQL_S3_DESTPATH=mysql/

# アップロードされた画像が保存されているディレクトリのパス
UPLOADED_IMAGE_DIR=<WORDPRESS_PATH>/wp-content/uploads/
# アップロードされた画像の、S3の保存先パス
UPLOADED_IMAGE_S3_DESTPATH=uploaded_images/

# MySQLをS3にバックアップ
$MYSQLDUMP_BIN -cu $MYSQL_USER -h $MYSQL_HOST --password=$MYSQL_PASS $MYSQL_DBNAME > $MYSQL_TEMPPATH
$AWS_BIN s3 cp $MYSQL_TEMPPATH s3://$AWS_BUCKET_NAME/$MYSQL_S3_DESTPATH

# 画像をS3にバックアップ
$AWS_BIN s3 sync --delete $UPLOADED_IMAGE_DIR s3://$AWS_BUCKET_NAME/$UPLOADED_IMAGE_S3_DESTPATH

※ソースコードはhttps://github.com/yusukemurayama/blog-samples/blob/master/wordpress_s3_backup/backup.shに公開してあります。

crontabに登録

バックアップ用スクリプトをサーバ上にアップロードしたら、後はcrontabにそれを登録するだけです。例えばスクリプトを/home/ec2-user/scripts/下に置いて、毎日3時30分にバックアップを取る場合は以下のように設定します。

30 3 * * * /bin/sh /home/ec2-user/scripts/backup.sh

備考

Policyの設定手順

S3にアクセスするときに必要な、Policyの設定手順を紹介します。ここでは、IAM Roleを使ってS3へのアクセス権限を設定します。

※このやり方は2015年5月27日時点のものです。そのため、AWS Management Consoleがアップデートされた場合は、手順が変更される可能性があります。

  1. IAM Roleを作成する。
  2. 作成したIAM Roleを設定した、EC2インスタンスを起動する。
  3. 作成したIAM Roleに、S3へのアクセス権限を追加する。

※起動中のEC2インスタンスにIAM Roleが設定済みの場合、1と2番は不要です。

IAM Roleを作成

  1. AWS Management Consoleにログインして、「Services」から「IAM」をクリックします。
  2. サイドメニューの「Roles」をクリックして、「Create Role」をクリックします。
  3. 「Set Role Name」で、「Role Name」を入力して「Next Step」ボタンをクリックします。
  4. 「Select Role Type」で、「Amazon EC2」の「Select」ボタンをクリックします。
  5. 「Attach Policy」で、何も選択しないで「Next Step」ボタンをクリックします。
  6. 「Review」で「Create Role」ボタンをクリックしてIAM Roleを作成します。

wordpress_s3_backup00

wordpress_s3_backup01

wordpress_s3_backup02

wordpress_s3_backup03

wordpress_s3_backup04

wordpress_s3_backup05

EC2インスタンスを起動

作成したRoleを設定した、EC2インスタンスを起動します。

wordpress_s3_backup10

S3へのアクセス権限を追加

  1. IAMのサイドメニューから「Roles」を選択し、作成したRoleをクリックします。
  2. 「Inline Policies」をクリックし「click here.」をクリックします。
  3. 「Set Permissions」で「Custom Policy」を選択し、「Select」ボタンをクリックします。
  4. 「Review Policy」で「Policy Name」を入力し、「Policy Document」にS3へアクセスするためのPolicyを記述します。そして、「Apply Policy」ボタンをクリックしてPolicyを保存します。

wordpress_s3_backup20

wordpress_s3_backup21

wordpress_s3_backup22

wordpress_s3_backup23

この記事が役に立った場合、シェアしていただけると励みになります!!