PHP | AWS S3に保存された古いバックアップデータを自動削除する方法

AWS S3 に保存された古いバックアップデータを自動的に削除するためのPHPスクリプトとCronジョブの設定メモ。

前提条件

このスクリプトを実行する前に、以下の前提条件を満たしていることを確認してください。

  1. AWS SDK for PHP がインストールされている。
  2. config.php に必要なAWSの認証情報と設定が記載されている。

スクリプトの内容

以下は、AWS S3 に保存された古いバックアップデータを削除するためのPHPスクリプトです。このスクリプトは指定されたバケットのバックアップディレクトリ内の古いバージョンのバックアップデータを削除します。

<?php
require 'vendor/autoload.php';
require 'config.php';

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

$access_key_id     = AWS_ACCESS_KEY_ID;
$secret_access_key = AWS_SECRET_ACCESS_KEY;
$retention_period  = RETENTION_PERIOD; // 保持する世代数
$s3_buckets        = S3_BUCKETS;

$s3client = new S3Client([
    'credentials' => [
        'key'    => $access_key_id,
        'secret' => $secret_access_key,
    ],
    'region'  => 'ap-northeast-1',
    'version' => 'latest',
]);

foreach ($s3_buckets as $s3_bucket) {
    echo "=== Processing bucket: $s3_bucket ===" . PHP_EOL;

    // 古いバックアップの削除対象を取得
    try {
        $prefix = "backup/";
        $objects = $s3client->listObjectsV2([
            'Bucket' => $s3_bucket,
            'Prefix' => $prefix,
        ]);

        if (isset($objects['Contents']) && count($objects['Contents']) > 0) {
            echo "Found objects in bucket: $s3_bucket" . PHP_EOL;

            // バックアップバージョンを取得
            $backup_versions = [];
            foreach ($objects['Contents'] as $object) {
                echo "Checking object: " . $object['Key'] . PHP_EOL;
                $pattern = "/backup\/(\d{8}\d{2})\//";  // 01から99まで対応
                if (preg_match($pattern, $object['Key'], $matches)) {
                    $backup_versions[] = $matches[1];
                    echo "Matched version: " . $matches[1] . PHP_EOL;
                }
            }

            // 重複を排除
            $backup_versions = array_unique($backup_versions);

            // バージョンを新しい順にソート
            if (count($backup_versions) > 0) {
                rsort($backup_versions);
                // ソートされたバージョンを出力
                echo "Sorted versions: " . implode(', ', $backup_versions) . PHP_EOL;

                // 古いバージョンのディレクトリを削除
                foreach (array_slice($backup_versions, $retention_period) as $old_version) {
                    echo "Deleting directory: backup/{$old_version}/" . PHP_EOL;
                    $old_objects = $s3client->listObjectsV2([
                        'Bucket' => $s3_bucket,
                        'Prefix' => "backup/{$old_version}/",
                    ]);

                    if (isset($old_objects['Contents'])) {
                        foreach ($old_objects['Contents'] as $old_object) {
                            $s3client->deleteObject([
                                'Bucket' => $s3_bucket,
                                'Key'    => $old_object['Key'],
                            ]);
                            echo "Deleted from $s3_bucket: " . $old_object['Key'] . PHP_EOL;
                        }
                    } else {
                        echo "No objects found in directory: backup/{$old_version}/" . PHP_EOL;
                    }
                }
            } else {
                echo "No backup versions matched the pattern in bucket: $s3_bucket" . PHP_EOL;
            }
        } else {
            echo "No objects found in bucket: $s3_bucket with prefix $prefix" . PHP_EOL;
        }
    } catch (S3Exception $e) {
        echo "Error listing objects in bucket: $s3_bucket - " . $e->getMessage() . PHP_EOL;
    }

    echo "=== Finished processing bucket: $s3_bucket ===" . PHP_EOL;
}
?>

設定ファイル (config.php)

このスクリプトを動作させるには、以下のような config.php ファイルが必要です。

<?php
define('AWS_ACCESS_KEY_ID', 'your_access_key_id');
define('AWS_SECRET_ACCESS_KEY', 'your_secret_access_key');
define('RETENTION_PERIOD', 3); // 保持する世代数を設定
define('S3_BUCKETS', ['your-bucket-name1', 'your-bucket-name2']);
?>

Cronジョブの設定

このスクリプトを定期的に自動実行するために、Cronジョブを設定します。今回は毎週水曜日の深夜2時に実行するように設定します。

  1. ターミナルを開き、Cronジョブの設定を編集します。
   crontab -e
  1. 以下のCronジョブエントリを追加します。
   0 2 * * 3 /usr/bin/php /path/to/your/script/delete_old_backups.php >> /path/to/your/logs/delete_old_backups.log 2>&1

ここで、/usr/bin/php はPHPの実行パス、/path/to/your/script/delete_old_backups.php はスクリプトのパス、/path/to/your/logs/delete_old_backups.log はログファイルのパスです。

  1. 保存してエディタを終了します。

これで、スクリプトは毎週水曜日の深夜2時に実行され、ログファイルに実行結果が記録されます。Cronジョブの設定やスクリプトのパスは環境に合わせて調整してください。

この方法により、AWS S3 バケット内の古いバックアップデータを定期的に削除し、ストレージの効率的な管理が可能になります。

関連記事

コメント

タイトルとURLをコピーしました