2012-03-12 66 views
5

我在尝试脚本来自动备份卷。如何自动快照Amazon EC2实例的卷?

我按照这个EBS-Snapshot.sh脚本上github如发现:

#!/bin/bash 

# export EC2_HOME='/etc/ec2' # Make sure you use the API tools, not the AMI tools 
# export EC2_BIN=$EC2_HOME/bin 
# export PATH=$PATH:$EC2_BIN 
# I know all of the above is good to have solution, but not re-usable 
# I have captured all of the above in a particular file and lemme execute it 
source /etc/environment 

PURGE_SNAPSHOT_IN_DAYS=10 

EC2_BIN=$EC2_HOME/bin 

# store the certificates and private key to your amazon account 
MY_CERT='/path/to/certificate-file' 
MY_KEY='/path/to/private-file' 
# fetching the instance-id from the metadata repository 
MY_INSTANCE_ID='your ec2-instance-id' 

# temproary file 
TMP_FILE='/tmp/rock-ebs-info.txt' 

# get list of locally attached volumes via EC2 API: 
$EC2_BIN/ec2-describe-volumes -C $MY_CERT -K $MY_KEY > $TMP_FILE 
VOLUME_LIST=$(cat $TMP_FILE | grep ${MY_INSTANCE_ID} | awk '{ print $2 }') 

sync 

#create the snapshots 
echo "Create EBS Volume Snapshot - Process started at $(date +%m-%d-%Y-%T)" 
echo "" 
echo $VOLUME_LIST 
for volume in $(echo $VOLUME_LIST); do 
    NAME=$(cat $TMP_FILE | grep Name | grep $volume | awk '{ print $5 }') 
    DESC=$NAME-$(date +%m-%d-%Y) 
    echo "Creating Snapshot for the volume: $volume with description: $DESC" 
    echo "Snapshot info below:" 
    $EC2_BIN/ec2-create-snapshot -C $MY_CERT -K $MY_KEY -d $DESC $volume 
    echo "" 
done 

echo "Process ended at $(date +%m-%d-%Y-%T)" 
echo "" 

rm -f $TMP_FILE 

#remove those snapshot which are $PURGE_SNAPSHOT_IN_DAYS old 

我对X509的身份验证,实例ID这两个文件,但我不明白的脚本,以及如何进行参数我想要的音量备份。

我不明白第一行(源)和EC2_BIN。 使用该配置,它列出了所有卷,并对所有这些卷进行了快照...

对于快照的评论,如何更改此行以添加文本?

DESC=$NAME-$(date +%m-%d-%Y) 

对不起,是一个初学者,但我不明白整个脚本

编辑:

我得到这个错误与这个新代码:

为卷创建快照:([ec2-describe-volumes])与 描述:-03-13-2012快照信息如下: Client.InvalidParame terValue:值(([ec2-describe-volumes])) 参数volumeId无效。预计:'vol -...'。 11:在过程 03-13-2012-08结束35 -

这是代码:

#!/bin/bash 

#Java home for debian default install path: 
export JAVA_HOME=/usr 
#add ec2 tools to default path 
#export PATH=~/.ec2/bin:$PATH 


#export EC2_HOME='/etc/ec2' # Make sure you use the API tools, not the AMI tools 
export EC2_BIN=/usr/bin/ 
#export PATH=$PATH:$EC2_BIN 
# I know all of the above is good to have solution, but not re-usable 
# I have captured all of the above in a particular file and lemme execute it 
source /etc/environment 

PURGE_SNAPSHOT_IN_DAYS=60 

#EC2_BIN=$EC2_HOME/bin 

# store the certificates and private key to your amazon account 
MY_CERT='cert-xx.pem' 
MY_KEY='pk-xx.pem' 
# fetching the instance-id from the metadata repository 

MY_INSTANCE_ID=`curl http://169.254.169.254/1.0/meta-data/instance-id` 

# temproary file 
TMP_FILE='/tmp/rock-ebs-info.txt' 

# get list of locally attached volumes via EC2 API: 
$EC2_BIN/ec2-describe-volumes -C $MY_CERT -K $MY_KEY > $TMP_FILE 

#VOLUME_LIST=$(cat $TMP_FILE | grep ${MY_INSTANCE_ID} | awk '{ print $2 }') 
VOLUME_LIST=(`ec2-describe-volumes --filter attachment.instance-id=$MY_INSTANCE_ID | awk '{ print $2 }'`) 

sync 

#create the snapshots 
echo "Create EBS Volume Snapshot - Process started at $(date +%m-%d-%Y-%T)" 
echo "" 
echo $VOLUME_LIST 
echo "-------------" 
for volume in $(echo $VOLUME_LIST); do 
    NAME=$(cat $TMP_FILE | grep Name | grep $volume | awk '{ print $5 }') 
    DESC=$NAME-$(date +%m-%d-%Y) 
    echo "Creating Snapshot for the volume: $volume with description: $DESC" 
    echo "Snapshot info below:" 
    $EC2_BIN/ec2-create-snapshot -C $MY_CERT -K $MY_KEY -d $DESC $volume 
    echo "" 
done 

echo "Process ended at $(date +%m-%d-%Y-%T)" 
echo "" 

rm -f $TMP_FILE 

#remove those snapshot which are $PURGE_SNAPSHOT_IN_DAYS old 

回答

4

好不好,

  1. 他跑在第一线(资源)。这就像一样。在/ etc /环境。无论如何,他所做的只是加载一个具有亚马逊需要的环境变量列表的文件。至少这是我所假设的。
  2. 他让这个脚本比它所需要的复杂得多。他不需要运行ec2-describe-instances命令并将输出结果保存到文件中,然后grep输出结果等等。
  3. 你可以把任何你想要的DESC。您可以将所有内容全部替换为=的右边,以表示您想要的任何文本。只要确保将引号放在它周围。

我会改变这个脚本的两件事。

  1. 在运行时在脚本中获取InstanceId。不要硬编码到脚本中。无论脚本在哪里运行,这条线都可以工作。

    MY_INSTANCE_ID=`curl http://169.254.169.254/1.0/meta-data/instance-id` 
    
  2. 与其说EC2-描述体积和保存输出到一个临时文件等...只需使用该命令的过滤器,并告诉它你想要的实例ID。

    VOLUME_LIST=(`ec2-describe-volumes --filter attachment.instance-id=$MY_INSTANCE_ID | awk '{ print $2 }'`) 
    
+0

确定多少感谢的解释,我找遍了所有的一天发现更多的细节,我问我自己,因为“整体”的问题瓦尔:-) 谢谢你的小改进措施关于实例ID和卷列表,卷列表给我带来了一些麻烦。我将修改描述,并且将修复参数volumeId的“Client.InvalidParameterValue:Value(([ec2-describe-volumes]))无效预期:'vol -...'。'错误,仍然:-) – clement 2012-03-12 16:38:04

+0

小心改变描述。确保你加引号要小心。如果你得到一个错误Client.InvalidParameterValue那么这是因为无论是卷为空或你使用的文本因为描述中有空格,并且它的读取部分描述为volume-id – bwight 2012-03-12 17:53:37

+0

我再次遇到这个问题,这是整个过程打印在屏幕上:为卷创建快照:([ec2-describe-volumes])与描述:-03-13-2012 以下快照信息: Client.InvalidParameterValue:参数volumeId的值(([ec2-describe-volumes]))无效预期:'vol -...' 过程结束在03-13-2012-08:11:35 – clement 2012-03-13 08:12:01

9

上述方案并没有为我工作完全。与亚马逊支持我小时聊天后,我现在这个工作脚本,它总是会创建一个附加到当前实例的所有卷的快照:

#!/bin/bash 

# Set Environment Variables as cron doesn't load them 
export JAVA_HOME=/usr/lib/jvm/java-6-sun 
export EC2_HOME=/usr 
export EC2_BIN=/usr/bin/ 
export PATH=$PATH:$EC2_HOME/bin 
export EC2_CERT=/home/ubuntu/.ec2/cert-SDFRTWFASDFQFEF.pem 
export EC2_PRIVATE_KEY=/home/ubuntu/.ec2/pk-SDFRTWFASDFQFEF.pem 
export EC2_URL=https://eu-west-1.ec2.amazonaws.com # Setup your availability zone here 

# Get instance id of the current server instance 
MY_INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id) 
# get list of locally attached volumes 
VOLUMES=$(ec2-describe-volumes | grep ${MY_INSTANCE_ID} | awk '{ print $2 }') 
echo "Instance-Id: $MY_INSTANCE_ID" 

    # Create a snapshot for all locally attached volumes 
    LOG_FILE=/home/ubuntu/ebsbackup/ebsbackup.log 
    echo "********** Starting backup for instance $MY_INSTANCE_ID" >> $LOG_FILE 
    for VOLUME in $(echo $VOLUMES); do 
     echo "Backup Volume: $VOLUME" >> $LOG_FILE 
     ec2-consistent-snapshot --aws-access-key-id ASDASDASDASD --aws-secret-access-key asdfdsfasdfasdfasdfasdf --mysql --mysql-host localhost --mysql-username root --mysql-password asdfasdfasdfasdfd --description "Backup ($MY_INSTANCE_ID) $(date +'%Y-%m-%d %H:%M:%S')" --region eu-west-1 $VOLUME 
done 
echo "********** Ran backup: $(date)" >> $LOG_FILE 
echo "Completed" 

我设置在/etc/cron.d/ebsbackup一个cronjob

01 * * * * ubuntu /home/ubuntu/.ec2/myscriptname 

这个工作对我来说相当不错... :-)

希望这有助于你, 塞巴斯蒂安

0

继承人功能我写我n Ruby来快照所有区域中所有实例上的所有卷。

require 'aws-sdk' 

def snapshot_all_attached_volumes(region) 
    # For every instance in this region 
    AWS::EC2.new(:region => region).instances.each do |instance| 
    # get all the attached volumes 
    instance.attachments.each do |mountpoint, attachment| 
     # and create snapshots 
     attachment.volume.create_snapshot(description = "Automated snapshot #{HOSTNAME}:#{$0}") 
    end 
    end 
end 

regions = AWS::EC2.regions.map(&:name) 
regions.each do |region| 
    begin 
    snapshot_all_attached_volumes(region) 
    # delete_all_old_snapshots(region) 
    rescue 
    puts "#{$!}" 
    end 
end 
0

我不了解你,但我更喜欢用AMI来代替快照。这个剧本来自亚马逊员工Craig的想法。他们正在开发名为Arche的快照脚本。该脚本很简单 - 您在EC2实例中标记标签,并且标签Ec2为AMIed。我在我的环境中测试了它。您也可以更改此脚本中的命令以备份快照。

运行此之前,配置与证书和PK键的Linux环境变量。

#!/bin/bash 
echo "AMI Backup is starting..." 
echo "taking AMI Backup..." 

day_of_year=$(date +%j) 
week_of_year=$(date +%U) 
week_of_year=$(printf "%.0f" $week_of_year) 
year=$(date +%Y) 

for INST in $(ec2-describe-instances --region=sa-east-1 --filter "tag:Backup=On" | awk '/^INSTANCE/ {print $2}') 
do 
     start_time=$(date +%R) 
     ami=$(ec2-create-image $INST --name $INST$week_of_year --no-reboot | awk '{print $2}') 
     ec2-create-tags $ami --tag Day_Year=$day_of_year > /dev/null 
     ec2-create-tags $ami --tag Week_Year=$week_of_year > /dev/null 
     ec2-create-tags $ami --tag Src_Instance=$INST > /dev/null 
     ec2-create-tags $ami --tag Start_Time=$start_time > /dev/null 
     end_time=$(date +%R) 
     ec2-create-tags $ami --tag End_Time=$end_time > /dev/null 
     echo "Created AMI $ami for volume $INST" 
done 

year=$(date +%Y) 
expire_day=`expr $day_of_year - 2` 
expire_week=`expr $week_of_year - 2` 


echo "identifying AMI to be deleted" 
for delete in $(ec2-describe-images --filter "tag:Week_Year=$expire_week" | awk '{ print $2;exit;}') 
do 
     ec2dereg $delete 
     echo "deleted $delete" 
done 
1

我遇到了很多人在寻找管理EBS快照的工具。我在网上找到了几种工具,但它们只是脚本和不完整的解决方案。最后,我决定创建一个更灵活,集中且易于管理的程序。

的想法是有一个集中管理的程序,以排除

我创建了一个小型的Perl程序的所有EBS快照(本地实例或遥控器), https://github.com/sciclon/EBS_Snapshots

一些特点: *计划在守护进程模式或脚本模式(crontab中)运行

  • 你可以选择只本地连接的卷或遥控器以及

  • 您可以定义日志文件

  • 您可以定义

  • 您可以定义为每个卷它们之间的频率

  • 频率和数量会像一个快照每卷数量当它达到删除最早的快照的限制时,“循环”。

  • ,你可以一步,如果你有6个快照和修改的数量在3的过程中会自动调整它调整我指的是数量。

  • 您可以定义一个“prescript”执行,您可以在执行快照之前添加您的代码以执行快照,例如您想尝试卸下卷或停止某些服务,或者检查实例负载。 父进程将等待退出码,“0”表示成功,您可以根据退出码来定义是否继续。

  • 可以定义一个“后记”执行取快照(例如电子邮件,告诉你这件事)后执行任何以股代息

  • 您可以添加“保护快照”跳过您定义的快照,我的意思是他们将在“只读”,他们将永远不会被抹去。

  • 当它以守护程序模式运行时,脚本可以“随时”重新配置脚本,该脚本接受信号和IPC。

  • 它有一个“本地缓存”,以避免多次请求API。 您可以添加或修改配置文件中的任何配置并重新加载而不会终止进程。