以前に紹介したAWSアカウントのRDS一覧を取得とスナップショット作成にて、特定のAWSアカウントのRDSすべてのスナップショットを作成するためのPHPスクリプトを作成しましたが、下記の機能を追加してみました。
○追加機能
・すべてのリージョンを対象
・JSONにアカウント情報を記述
・世代管理
・スキップするRDSが指定可能(JSONに記述)
・RDS毎にスナップショットの世代を指定(JSONに記述)
以上になります。
追加内容が多いため、前回に紹介したPHPスクリプトよりも長くなりましが、
参考になればと思います。
require_once("./sdk.class.php"); define("CP_SNAPSHOT_PREFIX" , "cp"); define("CP_SNAPSHOT_GENERATION", 2); // 設定情報 $json = { "key" : { "access": "AAAAAAAA", "secret": "SSSSSSSS" }, "default" : { "generation": 3 }, "ignore" : { "rds.us-east-1.amazonaws.com" : [ ], "rds.us-west-1.amazonaws.com" : [ ], "rds.eu-west-1.amazonaws.com" : [ ], "rds.ap-southeast-1.amazonaws.com": [ ], "rds.ap-northeast-1.amazonaws.com": [ "suzlab" ] }, "generation" : { "rds.us-east-1.amazonaws.com": { }, "rds.us-west-1.amazonaws.com": { }, "rds.eu-west-1.amazonaws.com": { }, "rds.ap-southeast-1.amazonaws.com": { "suzlab3": 4 }, "rds.ap-northeast-1.amazonaws.com": { } } } JSON; // 設定情報の読み込み $config = json_decode($json, true); if(json_last_error() != JSON_ERROR_NONE) { fputs(STDERR, json_last_error() . "n"); exit(1); } // 初期設定 define("AWS_KEY" , $config["key"]["access"]); define("AWS_SECRET_KEY", $config["key"]["secret"]); $rds = new AmazonRDS(); $regions = array( AmazonRDS::REGION_US_E1, AmazonRDS::REGION_US_W1, AmazonRDS::REGION_EU_W1, AmazonRDS::REGION_APAC_SE1, AmazonRDS::REGION_APAC_NE1 ); foreach($regions as $region) { // RDS一覧の取得 $rds->set_region($region); $ins_rsp = $rds->describe_db_instances(); if(!$ins_rsp->isOK()) { fputs(STDERR, $ins_rsp->body->Error->Message . "n"); } $instances = $ins_rsp->body->DescribeDBInstancesResult->DBInstances->DBInstance; // スキップRDSリストの作成 $ignore = array(); if(isset($config["ignore"][$region])) { $ignore = $config["ignore"][$region]; } foreach($instances as $instance){ $name = $instance->DBInstanceIdentifier->to_string(); if(!in_array($name, $ignore)) { // スナップショットの作成 $snp_rsp = $rds->create_db_snapshot(CP_SNAPSHOT_PREFIX . "-" . date("YmdHis") . "-" . $name, $name); if(!$snp_rsp->isOK()) { fputs(STDERR, $snp_rsp->body->Error->Message . "n"); } // スナップショット一覧の作成 $snp_rsp = $rds->describe_db_snapshots(array( "DBInstanceIdentifier" => $name )); if(!$snp_rsp->isOK()) { fputs(STDERR, $snp_rsp->body->Error->Message . "n"); } // スナップショット一覧のフィルターとソート $snapshots = $snp_rsp->body->DescribeDBSnapshotsResult->DBSnapshots->DBSnapshot; $snapshotnames = array(); foreach($snapshots as $snapshot) { if(strpos($snapshot->DBSnapshotIdentifier, CP_SNAPSHOT_PREFIX) === 0) { array_push($snapshotnames, $snapshot->DBSnapshotIdentifier); } } sort($snapshotnames, SORT_STRING); // 残す世代の決定 if(isset($config["generation"][$region][$name])) { $generation = $config["generation"][$region][$name]; } elseif($config["default"]["generation"]) { $generation = $config["default"]["generation"]; } else { $generation = CP_SNAPSHOT_GENERATION; } // 古いスナップショットを削除 $count = count($snapshotnames) - $generation; if($count > 0) { for($i = 0; $i $snp_rsp = $rds->delete_db_snapshot($snapshotnames[$i]); if(!$snp_rsp->isOK()) { fputs(STDERR, $snp_rsp->body->Error->Message . "n"); } } } } } } exit(0);
JSONを設定ファイル化すれば、誰にでも行うことが可能になると思います。