我正在尝试使用脚本自动备份卷。
我遵循github上的EBS-Snapshot.sh
脚本:
#!/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])with 描述:-03-13-2012以下快照信息: Client.InvalidParameterValue:Value(([ec2-describe-volumes]))for 参数volumeId无效。预期:' vol -...'。流程结束于 03-13-2012-08:11: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
答案 0 :(得分: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
中设置了一个cronjob01 * * * * ubuntu /home/ubuntu/.ec2/myscriptname
这对我来说非常有用......: - )
希望这对你有帮助, 塞巴斯蒂安
答案 1 :(得分:4)
好吧,
我会改变关于这个脚本的两件事。
在脚本中运行时获取InstanceId。不要硬编码到脚本中。无论脚本在何处运行,此行都将起作用。
MY_INSTANCE_ID=`curl http://169.254.169.254/1.0/meta-data/instance-id`
而不是调用ec2-describe-volumes并将输出保存到临时文件等...只需在命令上使用过滤器并告诉它您想要的实例ID。
VOLUME_LIST=(`ec2-describe-volumes --filter attachment.instance-id=$MY_INSTANCE_ID | awk '{ print $2 }'`)
答案 2 :(得分:1)
我遇到很多人在寻找管理EBS快照的工具。我在互联网上找到了几个工具但它们只是脚本和不完整的解决方案。最后,我决定创建一个更灵活,集中且易于管理的程序。
我们的想法是建立一个集中程序来统治所有EBS快照(实例或远程控制器的本地)
我创建了一个小型Perl程序, https://github.com/sciclon/EBS_Snapshots
一些功能: *程序以守护进程模式或脚本模式(crontab)运行
您也可以只选择本地附加卷或遥控器
您可以定义日志文件
您可以为每个卷的快照量定义
您可以为每个卷定义其中的频率
频率和数量在达到删除最旧快照的限制时将像“循环”一样工作。
如果您有6个快照,并且您在3中修改了数量,那么您可以在一步中重新调整数量。过程将自动重新调整。
您可以定义“预定”执行,您可以在执行快照之前添加要执行的代码,例如您想尝试卸载卷或停止某些服务,或者可能检查实例加载。 父进程将等待退出代码,“0”表示成功,您可以根据退出代码定义是否继续。
您可以定义“postscript”执行以在拍摄快照后执行任何脚本(例如电子邮件告诉您)
您可以添加“受保护的快照”以跳过您定义的快照,我的意思是它们将处于“只读”状态,并且它们永远不会被删除。
您可以在守护程序模式下运行时“动态”重新配置脚本,脚本接受信号和IPC。
它有一个“本地缓存”,以避免多次请求API。 您可以在配置文件中添加或修改任何配置并重新加载,而不会终止进程。
答案 3 :(得分:0)
这是我在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
答案 4 :(得分:0)
我不了解你,但我更喜欢让AMI代替快照。这个脚本来自亚马逊员工Craig的想法。他们正在开发一个名为Arche的快照脚本。这个脚本很简单 - 你在EC2实例中标记一个标签,标签Ec2是AMIed。我在我的环境中测试过它。您也可以更改此脚本中的命令以备份快照。
在运行之前,使用cert和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
答案 5 :(得分:0)
我认为现在最好的方法是使用AWS Lambda来拍摄EC2实例的快照。你可以从这个链接找到更多细节
http://www.iwss.co.uk/ec2-instance-snapshot-through-aws-lambda-function-using-phyton-2-7/
答案 6 :(得分:0)
创建一个按计划拍摄快照的规则。您可以使用速率表达式或cron表达式来指定计划。对于more information
更多信息 创建规则
在https://console.aws.amazon.com/cloudwatch/打开CloudWatch控制台。
在导航窗格中,选择“事件”,“创建规则”。
对于“事件来源”,请执行以下操作:
a. Choose Schedule.
b. Choose Fixed rate of and specify the schedule interval (for example, 5 minutes). Alternatively, choose Cron expression and specify a cron expression (for example, every 15 minutes Monday through Friday, starting at the current time).
对于Targets,选择Add target,然后选择EC2 Create Snapshot API call。
对于Volume ID,键入目标Amazon EBS卷的卷ID。
对于AWS权限,请选择创建新角色的选项。新角色授予内置目标权限以代表您访问资源。
选择配置详细信息。
对于规则定义,键入规则的名称和描述。
选择创建规则