Skip to content

Instantly share code, notes, and snippets.

@Twinuma
Last active August 29, 2015 14:06
Show Gist options
  • Select an option

  • Save Twinuma/1cb4ce7642df5db36a2f to your computer and use it in GitHub Desktop.

Select an option

Save Twinuma/1cb4ce7642df5db36a2f to your computer and use it in GitHub Desktop.

Revisions

  1. Twinuma revised this gist Sep 5, 2014. 1 changed file with 1 addition and 0 deletions.
    1 change: 1 addition & 0 deletions crontab
    Original file line number Diff line number Diff line change
    @@ -0,0 +1 @@
    0 0 * * * /usr/bin/php /opt/aws/php/backup/ami-ebs-backup.php &> /opt/aws/php/backup/log/aws-backup-`date +\%Y\%m\%d\%H\%M\%S`.log
  2. Twinuma revised this gist Sep 5, 2014. 1 changed file with 162 additions and 1 deletion.
    163 changes: 162 additions & 1 deletion ami-ebs-backup.php
    Original file line number Diff line number Diff line change
    @@ -1 +1,162 @@
    #!/usr/bin/php<?php// 初期設定require_once("/opt/aws/AWSSDKforPHP/sdk.class.php");date_default_timezone_set("Asia/Tokyo");$ec2 = new AmazonEC2(array( "key" => "YOUR ACCESS KEY", "secret" => "YOUR SECRET KEY"));$ec2->set_region(AmazonEC2::REGION_APAC_NE1);error_log(date("Y/m/d H:i:s") . " [Info] Begin create images.");// 対象EC2(runnning)の取得$response = $ec2->describe_instances(array( "Filter" => array( array("Name" => "instance-state-name", "Value" => "running") )));if(!$response->isOK()) { error_log(date("Y/m/d H:i:s") . " [" . $response->body->Errors->Error->Code . "] " . $response->body->Errors->Error->Message);}// 対象EC2に対するバックアップ処理if(isset($response->body->reservationSet->item)) { foreach($response->body->reservationSet->item as $reservation) { foreach($reservation->instancesSet->item as $instance) { error_log(date("Y/m/d H:i:s") . " [Info] Begin execute instance(" . $instance->instanceId . ")."); $is_backup = false; $instance_id = $instance->instanceId; $image_tag = $instance_id; // バックアップ条件の確認 if(isset($instance->tagSet->item)) { foreach($instance->tagSet->item as $tag) { if($tag->key == "Name" && $tag->value != null && trim($tag->value) != "") { $image_tag = $tag->value; } if($tag->key == "Backup-Generation" && is_numeric($tag->value->to_string()) && intval($tag->value) > 0) { $is_backup = true; $generation = intval($tag->value); } } } // バックアップと世代管理の実施 if($is_backup) { // AMI名の作成 $image_name = $image_tag . "-" . date("YmdHis"); // AMIの作成 $image_id = create_image($ec2, $image_name, $instance_id); // 削除対象AMIの取得 $images = find_delete_images($ec2, $image_tag, $generation); // AMIとスナップショットの削除 delete_images($ec2, $images); // AMIにタグ付け tag_image($ec2, $image_id, $image_tag); // スナップショットにタグ付け tag_snapshots($ec2, $image_id); } else { error_log(date("Y/m/d H:i:s") . " [Info] Skip create image from " . $instance->instanceId . "."); } error_log(date("Y/m/d H:i:s") . " [Info] End execute instance(" . $instance->instanceId . ")."); } }}error_log(date("Y/m/d H:i:s") . " [Info] End create images.");exit(0);// AMIの作成function create_image($ec2, $image_name, $instance_id) { error_log(date("Y/m/d H:i:s") . " [Info] Begin create image(" . $image_name . ") from " . $instance_id . "."); $response = $ec2->create_image( $instance_id, $image_name, array( "Description" => "Create from " . $instance_id . ".", "NoReboot" => true ) ); if(!$response->isOK()) { error_log(date("Y/m/d H:i:s") . " [" . $response->body->Errors->Error->Code . "] " . $response->body->Errors->Error->Message); } error_log(date("Y/m/d H:i:s") . " [Info] End create image(" . $image_name . ") from " . $instance_id . "."); return $response->body->imageId;}// 削除対象AMIの取得function find_delete_images($ec2, $image_tag, $generation) { $response = $ec2->describe_images(array("Filter" => array( array("Name" => "tag:Name" , "Value" => $image_tag), array("Name" => "tag:Backup-Type", "Value" => "auto") ))); if(!$response->isOK()) { error_log(date("Y/m/d H:i:s") . " [" . $response->body->Errors->Error->Code . "] " . $response->body->Errors->Error->Message); } $images = array(); foreach($response->body->imagesSet->item as $image) { $images["$image->name"] = array( "id" => $image->imageId, "snapshots" => $image->blockDeviceMapping ); } krsort($images); return array_slice($images, $generation - 1);}// AMIとスナップショットの削除function delete_images($ec2, $images) { foreach($images as $image_name => $image) { error_log(date("Y/m/d H:i:s") . " [Info] Begin delete image(" . $image_name . ")."); $image_id = $image["id"]; $response = $ec2->deregister_image($image_id); if(!$response->isOK()) { error_log(date("Y/m/d H:i:s") . " [" . $response->body->Errors->Error->Code . "] " . $response->body->Errors->Error->Message); } error_log(date("Y/m/d H:i:s") . " [Info] End delete image(" . $image_name . ")."); foreach($image["snapshots"]->item as $snapshot) { $snapshot_id = $snapshot->ebs->snapshotId; error_log(date("Y/m/d H:i:s") . " [Info] Begin delete snapshot(" . $snapshot_id . ")."); $response = $ec2->delete_snapshot($snapshot_id); if(!$response->isOK()) { error_log(date("Y/m/d H:i:s") . " [" . $response->body->Errors->Error->Code . "] " . $response->body->Errors->Error->Message); } error_log(date("Y/m/d H:i:s") . " [Info] End delete snapshot(" . $snapshot_id . ")."); } }}// AMIにタグ付けfunction tag_image($ec2, $image_id, $image_tag) { error_log(date("Y/m/d H:i:s") . " [Info] Begin tag(" . $image_tag . ") image to " . $image_id . "."); $response = $ec2->create_tags($image_id, array( array("Key" => "Name" , "Value" => $image_tag), array("Key" => "Backup-Type", "Value" => "auto"), )); if(!$response->isOK()) { error_log(date("Y/m/d H:i:s") . " [" . $response->body->Errors->Error->Code . "] " . $response->body->Errors->Error->Message); } error_log(date("Y/m/d H:i:s") . " [Info] End tag(" . $image_tag . ") image to " . $image_id . ".");}// スナップショットにタグ付けfunction tag_snapshots($ec2, $image_id) { $response = $ec2->describe_images(array("ImageId" => $image_id)); foreach($response->body->imagesSet->item as $image) { foreach($image->blockDeviceMapping->item as $snapshot) { $snapshot_id = $snapshot->ebs->snapshotId; $snapshot_tag = $image->name . "-" . basename($snapshot->deviceName); error_log(date("Y/m/d H:i:s") . " [Info] Begin tag(" . $snapshot_tag . ") snapshot to " . $snapshot_id . "."); $response = $ec2->create_tags($snapshot_id, array( array("Key" => "Name" , "Value" => $snapshot_tag), array("Key" => "Backup-Type", "Value" => "auto") )); if(!$response->isOK()) { error_log(date("Y/m/d H:i:s") . " [" . $response->body->Errors->Error->Code . "] " . $response->body->Errors->Error->Message); } error_log(date("Y/m/d H:i:s") . " [Info] End tag(" . $snapshot_tag . ") snapshot to " . $snapshot_id . "."); } }}?>
    #!/usr/bin/php
    <?php
    // 初期設定
    require_once("/opt/aws/AWSSDKforPHP/sdk.class.php");
    date_default_timezone_set("Asia/Tokyo");
    $ec2 = new AmazonEC2(array(
    "key" => "YOUR ACCESS KEY",
    "secret" => "YOUR SECRET KEY"
    ));
    $ec2->set_region(AmazonEC2::REGION_APAC_NE1);
    error_log(date("Y/m/d H:i:s") . " [Info] Begin create images.");

    // 対象EC2(runnning)の取得
    $response = $ec2->describe_instances(array(
    "Filter" => array(
    array("Name" => "instance-state-name", "Value" => "running")
    )
    ));
    if(!$response->isOK()) {
    error_log(date("Y/m/d H:i:s") . " [" . $response->body->Errors->Error->Code . "] " . $response->body->Errors->Error->Message);
    }

    // 対象EC2に対するバックアップ処理
    if(isset($response->body->reservationSet->item)) {
    foreach($response->body->reservationSet->item as $reservation) {
    foreach($reservation->instancesSet->item as $instance) {
    error_log(date("Y/m/d H:i:s") . " [Info] Begin execute instance(" . $instance->instanceId . ").");
    $is_backup = false;
    $instance_id = $instance->instanceId;
    $image_tag = $instance_id;

    // バックアップ条件の確認
    if(isset($instance->tagSet->item)) {
    foreach($instance->tagSet->item as $tag) {
    if($tag->key == "Name" && $tag->value != null && trim($tag->value) != "") {
    $image_tag = $tag->value;
    }
    if($tag->key == "Backup-Generation" && is_numeric($tag->value->to_string()) && intval($tag->value) > 0) {
    $is_backup = true;
    $generation = intval($tag->value);
    }
    }
    }

    // バックアップと世代管理の実施
    if($is_backup) {
    // AMI名の作成
    $image_name = $image_tag . "-" . date("YmdHis");
    // AMIの作成
    $image_id = create_image($ec2, $image_name, $instance_id);
    // 削除対象AMIの取得
    $images = find_delete_images($ec2, $image_tag, $generation);
    // AMIとスナップショットの削除
    delete_images($ec2, $images);
    // AMIにタグ付け
    tag_image($ec2, $image_id, $image_tag);
    // スナップショットにタグ付け
    tag_snapshots($ec2, $image_id);
    } else {
    error_log(date("Y/m/d H:i:s") . " [Info] Skip create image from " . $instance->instanceId . ".");
    }
    error_log(date("Y/m/d H:i:s") . " [Info] End execute instance(" . $instance->instanceId . ").");
    }
    }
    }

    error_log(date("Y/m/d H:i:s") . " [Info] End create images.");
    exit(0);

    // AMIの作成
    function create_image($ec2, $image_name, $instance_id) {
    error_log(date("Y/m/d H:i:s") . " [Info] Begin create image(" . $image_name . ") from " . $instance_id . ".");
    $response = $ec2->create_image(
    $instance_id,
    $image_name,
    array(
    "Description" => "Create from " . $instance_id . ".",
    "NoReboot" => true
    )
    );
    if(!$response->isOK()) {
    error_log(date("Y/m/d H:i:s") . " [" . $response->body->Errors->Error->Code . "] " . $response->body->Errors->Error->Message);
    }
    error_log(date("Y/m/d H:i:s") . " [Info] End create image(" . $image_name . ") from " . $instance_id . ".");
    return $response->body->imageId;
    }

    // 削除対象AMIの取得
    function find_delete_images($ec2, $image_tag, $generation) {
    $response = $ec2->describe_images(array("Filter" => array(
    array("Name" => "tag:Name" , "Value" => $image_tag),
    array("Name" => "tag:Backup-Type", "Value" => "auto")
    )));
    if(!$response->isOK()) {
    error_log(date("Y/m/d H:i:s") . " [" . $response->body->Errors->Error->Code . "] " . $response->body->Errors->Error->Message);
    }
    $images = array();
    foreach($response->body->imagesSet->item as $image) {
    $images["$image->name"] = array(
    "id" => $image->imageId,
    "snapshots" => $image->blockDeviceMapping
    );
    }
    krsort($images);
    return array_slice($images, $generation - 1);
    }

    // AMIとスナップショットの削除
    function delete_images($ec2, $images) {
    foreach($images as $image_name => $image) {
    error_log(date("Y/m/d H:i:s") . " [Info] Begin delete image(" . $image_name . ").");
    $image_id = $image["id"];
    $response = $ec2->deregister_image($image_id);
    if(!$response->isOK()) {
    error_log(date("Y/m/d H:i:s") . " [" . $response->body->Errors->Error->Code . "] " . $response->body->Errors->Error->Message);
    }
    error_log(date("Y/m/d H:i:s") . " [Info] End delete image(" . $image_name . ").");
    foreach($image["snapshots"]->item as $snapshot) {
    $snapshot_id = $snapshot->ebs->snapshotId;
    error_log(date("Y/m/d H:i:s") . " [Info] Begin delete snapshot(" . $snapshot_id . ").");
    $response = $ec2->delete_snapshot($snapshot_id);
    if(!$response->isOK()) {
    error_log(date("Y/m/d H:i:s") . " [" . $response->body->Errors->Error->Code . "] " . $response->body->Errors->Error->Message);
    }
    error_log(date("Y/m/d H:i:s") . " [Info] End delete snapshot(" . $snapshot_id . ").");
    }
    }
    }

    // AMIにタグ付け
    function tag_image($ec2, $image_id, $image_tag) {
    error_log(date("Y/m/d H:i:s") . " [Info] Begin tag(" . $image_tag . ") image to " . $image_id . ".");
    $response = $ec2->create_tags($image_id, array(
    array("Key" => "Name" , "Value" => $image_tag),
    array("Key" => "Backup-Type", "Value" => "auto"),
    ));
    if(!$response->isOK()) {
    error_log(date("Y/m/d H:i:s") . " [" . $response->body->Errors->Error->Code . "] " . $response->body->Errors->Error->Message);
    }
    error_log(date("Y/m/d H:i:s") . " [Info] End tag(" . $image_tag . ") image to " . $image_id . ".");
    }

    // スナップショットにタグ付け
    function tag_snapshots($ec2, $image_id) {
    $response = $ec2->describe_images(array("ImageId" => $image_id));
    foreach($response->body->imagesSet->item as $image) {
    foreach($image->blockDeviceMapping->item as $snapshot) {
    $snapshot_id = $snapshot->ebs->snapshotId;
    $snapshot_tag = $image->name . "-" . basename($snapshot->deviceName);
    error_log(date("Y/m/d H:i:s") . " [Info] Begin tag(" . $snapshot_tag . ") snapshot to " . $snapshot_id . ".");
    $response = $ec2->create_tags($snapshot_id, array(
    array("Key" => "Name" , "Value" => $snapshot_tag),
    array("Key" => "Backup-Type", "Value" => "auto")
    ));
    if(!$response->isOK()) {
    error_log(date("Y/m/d H:i:s") . " [" . $response->body->Errors->Error->Code . "] " . $response->body->Errors->Error->Message);
    }
    error_log(date("Y/m/d H:i:s") . " [Info] End tag(" . $snapshot_tag . ") snapshot to " . $snapshot_id . ".");
    }
    }
    }
    ?>
  3. Twinuma created this gist Sep 5, 2014.
    1 change: 1 addition & 0 deletions ami-ebs-backup.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1 @@
    #!/usr/bin/php<?php// 初期設定require_once("/opt/aws/AWSSDKforPHP/sdk.class.php");date_default_timezone_set("Asia/Tokyo");$ec2 = new AmazonEC2(array( "key" => "YOUR ACCESS KEY", "secret" => "YOUR SECRET KEY"));$ec2->set_region(AmazonEC2::REGION_APAC_NE1);error_log(date("Y/m/d H:i:s") . " [Info] Begin create images.");// 対象EC2(runnning)の取得$response = $ec2->describe_instances(array( "Filter" => array( array("Name" => "instance-state-name", "Value" => "running") )));if(!$response->isOK()) { error_log(date("Y/m/d H:i:s") . " [" . $response->body->Errors->Error->Code . "] " . $response->body->Errors->Error->Message);}// 対象EC2に対するバックアップ処理if(isset($response->body->reservationSet->item)) { foreach($response->body->reservationSet->item as $reservation) { foreach($reservation->instancesSet->item as $instance) { error_log(date("Y/m/d H:i:s") . " [Info] Begin execute instance(" . $instance->instanceId . ")."); $is_backup = false; $instance_id = $instance->instanceId; $image_tag = $instance_id; // バックアップ条件の確認 if(isset($instance->tagSet->item)) { foreach($instance->tagSet->item as $tag) { if($tag->key == "Name" && $tag->value != null && trim($tag->value) != "") { $image_tag = $tag->value; } if($tag->key == "Backup-Generation" && is_numeric($tag->value->to_string()) && intval($tag->value) > 0) { $is_backup = true; $generation = intval($tag->value); } } } // バックアップと世代管理の実施 if($is_backup) { // AMI名の作成 $image_name = $image_tag . "-" . date("YmdHis"); // AMIの作成 $image_id = create_image($ec2, $image_name, $instance_id); // 削除対象AMIの取得 $images = find_delete_images($ec2, $image_tag, $generation); // AMIとスナップショットの削除 delete_images($ec2, $images); // AMIにタグ付け tag_image($ec2, $image_id, $image_tag); // スナップショットにタグ付け tag_snapshots($ec2, $image_id); } else { error_log(date("Y/m/d H:i:s") . " [Info] Skip create image from " . $instance->instanceId . "."); } error_log(date("Y/m/d H:i:s") . " [Info] End execute instance(" . $instance->instanceId . ")."); } }}error_log(date("Y/m/d H:i:s") . " [Info] End create images.");exit(0);// AMIの作成function create_image($ec2, $image_name, $instance_id) { error_log(date("Y/m/d H:i:s") . " [Info] Begin create image(" . $image_name . ") from " . $instance_id . "."); $response = $ec2->create_image( $instance_id, $image_name, array( "Description" => "Create from " . $instance_id . ".", "NoReboot" => true ) ); if(!$response->isOK()) { error_log(date("Y/m/d H:i:s") . " [" . $response->body->Errors->Error->Code . "] " . $response->body->Errors->Error->Message); } error_log(date("Y/m/d H:i:s") . " [Info] End create image(" . $image_name . ") from " . $instance_id . "."); return $response->body->imageId;}// 削除対象AMIの取得function find_delete_images($ec2, $image_tag, $generation) { $response = $ec2->describe_images(array("Filter" => array( array("Name" => "tag:Name" , "Value" => $image_tag), array("Name" => "tag:Backup-Type", "Value" => "auto") ))); if(!$response->isOK()) { error_log(date("Y/m/d H:i:s") . " [" . $response->body->Errors->Error->Code . "] " . $response->body->Errors->Error->Message); } $images = array(); foreach($response->body->imagesSet->item as $image) { $images["$image->name"] = array( "id" => $image->imageId, "snapshots" => $image->blockDeviceMapping ); } krsort($images); return array_slice($images, $generation - 1);}// AMIとスナップショットの削除function delete_images($ec2, $images) { foreach($images as $image_name => $image) { error_log(date("Y/m/d H:i:s") . " [Info] Begin delete image(" . $image_name . ")."); $image_id = $image["id"]; $response = $ec2->deregister_image($image_id); if(!$response->isOK()) { error_log(date("Y/m/d H:i:s") . " [" . $response->body->Errors->Error->Code . "] " . $response->body->Errors->Error->Message); } error_log(date("Y/m/d H:i:s") . " [Info] End delete image(" . $image_name . ")."); foreach($image["snapshots"]->item as $snapshot) { $snapshot_id = $snapshot->ebs->snapshotId; error_log(date("Y/m/d H:i:s") . " [Info] Begin delete snapshot(" . $snapshot_id . ")."); $response = $ec2->delete_snapshot($snapshot_id); if(!$response->isOK()) { error_log(date("Y/m/d H:i:s") . " [" . $response->body->Errors->Error->Code . "] " . $response->body->Errors->Error->Message); } error_log(date("Y/m/d H:i:s") . " [Info] End delete snapshot(" . $snapshot_id . ")."); } }}// AMIにタグ付けfunction tag_image($ec2, $image_id, $image_tag) { error_log(date("Y/m/d H:i:s") . " [Info] Begin tag(" . $image_tag . ") image to " . $image_id . "."); $response = $ec2->create_tags($image_id, array( array("Key" => "Name" , "Value" => $image_tag), array("Key" => "Backup-Type", "Value" => "auto"), )); if(!$response->isOK()) { error_log(date("Y/m/d H:i:s") . " [" . $response->body->Errors->Error->Code . "] " . $response->body->Errors->Error->Message); } error_log(date("Y/m/d H:i:s") . " [Info] End tag(" . $image_tag . ") image to " . $image_id . ".");}// スナップショットにタグ付けfunction tag_snapshots($ec2, $image_id) { $response = $ec2->describe_images(array("ImageId" => $image_id)); foreach($response->body->imagesSet->item as $image) { foreach($image->blockDeviceMapping->item as $snapshot) { $snapshot_id = $snapshot->ebs->snapshotId; $snapshot_tag = $image->name . "-" . basename($snapshot->deviceName); error_log(date("Y/m/d H:i:s") . " [Info] Begin tag(" . $snapshot_tag . ") snapshot to " . $snapshot_id . "."); $response = $ec2->create_tags($snapshot_id, array( array("Key" => "Name" , "Value" => $snapshot_tag), array("Key" => "Backup-Type", "Value" => "auto") )); if(!$response->isOK()) { error_log(date("Y/m/d H:i:s") . " [" . $response->body->Errors->Error->Code . "] " . $response->body->Errors->Error->Message); } error_log(date("Y/m/d H:i:s") . " [Info] End tag(" . $snapshot_tag . ") snapshot to " . $snapshot_id . "."); } }}?>