AWS(S3)へWordPress定期自動バックアップする方法

WordPressのバックアップについて

WordPressバックアップは様々な方法があります。しかし、外部にバックアップデータを保管しようとすると、データサイズにもよりますが結構な時間が掛かる事があります。そこで今回は、外部ストレージであるAWSのS3サービスへ自動でバックアップする方法をご紹介します。

自動バックアップのおおまかな流れ

AWS S3サービスの設定を行う

バックアップ対象のpublic_htmlと同階層にプログラムファイル(PHP)を作成する

Cron設定にてファイルの実行処理を設定する

定期自動バックアップ実行

目次

1.AWS S3バケットの作成

2.バックアップ用のIAMユーザーの作成

3.PHPファイル作成の準備

4.バックアップファイルの作成

5.S3へのアップロード処理の実装

6.定期自動バックアップの設定

7.バックアップの確認

8.まとめ

1.AWS S3バケットの作成

バックアップデータ保存先のS3バケットを作成します。
※AWSのアカウントを所持していることを前提としています。

サービス一覧の中から「S3」を探しクリックします。

「バケットを作成」をクリックします。

バケット名の入力部分に任意のバケット名を入力します。リージョンは、特にこだわりが無ければアジアパシフィック(東京)で良いです。
バケット名」と「リージョン」は格納先情報として、ファイル作成時に必要となります。

パブリックアクセスを全てブロック」にチェックが入っていることを確認します。他のオプション設定は、特に変更する必要はありません。問題が無ければ「バケット作成」をクリックしてS3バケットを作成します。

2.バックアップ用のIAMユーザーの作成

まずは、AWS S3にアクセスする為のIAMユーザーを作成します。

ユーザ名の入力とアクセスの権限を選択します。アクセスの権限は「プログラムによるアクセス」を選択します。

ユーザーのアクセス権限を設定します。既存のポリシーを直接アタッチから→AmazonS3FullAccessを選択します。
※AmazonS3FullAccessがアタッチされているグループが存在する場合は、グループに追加設定でも問題ありません。

タグの入力は好きなものを入れてください。空欄でも構いません。

確認画面にて、内容問題がなければ「ユーザーの作成」をクリックします。

アクセスキーIDと「シークレットアクセスキー」が発行されます。S3Client作成の際に必要になりますので、大切に保存しておきましょう。

3.PHPファイル作成の準備

ここまでで、PHPコードを書く準備ができました。最後に「AWS SDK for PHP」をインストールします。

composer がシステムにグローバルにインストール済みの場合、プロジェクトのベースディレクトリで以下の操作を実行して、依存関係として AWS SDK for PHP をインストールします。

composer require aws/aws-sdk-php

composerがシステムにインストールされていない場合。以下のcurlコマンドを使ってインストールします。
※php7.0の部分は、使用しているPHPのバージョンに合わせる。

curl -s https://getcomposer.org/installer | /usr/bin/php7.0

4.バックアップファイルの作成

圧縮ファイルを作成する

大きいファイルだと時間かかるので、systemコマンドtarを使用して対象ファイルを圧縮します。以下では、public_htmlフォルダをまるごと圧縮しています。

system( "tar cfz backup.tar.gz /home/hoge/hoge.jp/public_html" , $ret );

tar cvfz 圧縮したファイル名.tar.gz 圧縮したいディレクトリ名

DBデータのバックアップファイルを作成する

MysqlのmysqldumpコマンドをPHPのsystem関数で実行します。

対象のDB情報を記述します。「DB名」「ホスト名」「アカウント名」「パスワード」wp-config.phpに記載されている情報を参考にされてください。

//DB情報
$database_name 		= 'DB名';
$database_host 		= '接続ホスト';
$acount_name 		= 'ユーザ名';
$acount_password 	= 'パスワード';

「保存先のパス」「保存ファイル名」を設定します。
実行コマンドで使用する$savePathを定義します。

$file_Path = './';	// 保存先パス
$file_Name = 'hoge.sql';	// ファイル名(SQLファイル)
$savePath = $file_Path . $file_Name;

実行コマンドを記述します。

// mysqldumpの実行コマンド
$command = 'mysqldump --single-transaction --default-character-set=binary ' . $database_name . ' --host=' . $database_host . ' --user=' . $acount_name . ' --password=' . $acount_password . ' > ' . $savePath;

// DBバックアップSYSTEM処理の実行
system($command,$retDB);
    if($retDB == 0){
        echo 'DBバックアップファイル生成が成功しました'."\n"; 
    }else{
        echo 'ファイル生成が失敗しました'."\n";
    }

以上で、アップロードを行うファイル作成処理が完成しました。今回の設定では、作成ファイルは実行ファイルが置かれているディレクトリに作成されます。

5.S3へのアップロード処理の実装

php スクリプトに自動ローダーを追加するスクリプトで AWS SDK for PHP を活用するには、次のようにスクリプトに自動ローダーを追加します。
また、PHPからS3を操作するためにS3Clientクラスを利用します。

<?php
   require '/path/to/vendor/autoload.php';

   use Aws\S3\S3Client;  
   use Aws\S3\Exception\S3Exception;
?>

S3Clientクラスからクライアントオブジェクトを作成します。
2.バックアップ用のIAMユーザーの作成で作成した「アクセスキーID」と「シークレットアクセスキー」を使用します。
regionには、バケット作成で指定したリージョンを記述します。※今回はアジアパシフィック(東京)

$s3client = S3Client::factory([
    'credentials' => [
        'key' => 'アクセスキーID',
        'secret' => 'シークレットアクセスキー',
    ],
    'region' => 'ap-northeast-1',
    'version' => 'latest',
]);

アップロードの本処理です。putObject()メソッドを利用します。
1.AWS S3バケットの作成で入力した「バケット名」、4.バックアップファイルの作成で、作成した「アップロードファイルのパス」を記述します。
‘Key’にて、S3フォルダ内のディレクトリを指定する事ができます。

$filePath = "フォルダ名/S3保存ファイル名; //フォルダ指定する存在しない場合は作成される
try {
    $result = $s3client->putObject([
        'Bucket' => 'バケット名',
        'Key' => $filePath, //ファイル絶対パス
        'SourceFile' => '/path/to/file',
        'ContentType' => mime_content_type('/path/to/file'),
    ]);
echo $result['ObjectURL'] . PHP_EOL;
} catch (S3Exception $e) {
    echo $e->getMessage() . PHP_EOL;
}

補足説明 S3のアップロード先のフォルダ指定について
以下例の場合

$date = date("Y_m_d");
$filePath = "hoge/backUp_".$date;
.
.
'Bucket' => 'test-backup',
'Key' => $filePath,
.
.

S3のtest-backupバケット内

hogeフォルダ

「backUp_日付」ファイルがアップロードされます。
※hogeフォルダが指定されたバケット内に存在しない場合、新規にhogeフォルダが作成されることになります。

6.定期自動バックアップの設定

今回は、エックスサーバーでの定期自動バックアップの設定についてのご説明します。上記で作成したファイルを、エックスサーバーのcronで時間設定をして、実行します。

エックスサーバーのcron設定
以下では、毎月1日の午前3にコマンドに設定した内容が実行されます。

コマンド内例)abc.phpをPHP 7.2 で実行する場合
 /usr/bin/php7.2 /home/サーバーID/独自ドメイン名/abc.php

/usr/bin/php7.2 /home/hoge/hoge.jp/monthly_backup_batch.php

※注意事項 /usr/bin/php7.2 ←半角スペースが必要 

7.バックアップの確認

下記の様に、S3管理画面にてフォルダとファイルが作成されている事が確認する事ができます。

8.まとめ

AWSサービスは、とても便利なサービスですが、バージョンによって方法が微妙に違ったりするため、迷う事があるかと思います。今回はプラグインを使用せず、WordPressの外部バックアップ方法をご紹介させて頂きました。この記事が少しでも開発の助けになれば幸いです。

以上です。