2011年4月19日火曜日

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 = <<< 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 < $count; $i++) {
                    $snp_rsp = $rds->delete_db_snapshot($snapshotnames[$i]);
                    if(!$snp_rsp->isOK()) {
                        fputs(STDERR, $snp_rsp->body->Error->Message . "\n");
                    }
                }
            }
        }
    }
}

exit(0);

JSONを設定ファイル化すれば、引き継げるぞ...
--------
http://www.suz-lab.com

0 コメント: