2012-03-12 24 views
5

Tôi đang thử một tập lệnh để tự động sao lưu âm lượng.Làm thế nào để tự động chụp nhanh một thể tích của một cá thể Amazon EC2?

Tôi làm theo EBS-Snapshot.sh kịch bản này như tìm thấy trên 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 

Tôi có hai tập tin để xác thực X509, instance ID nhưng tôi không hiểu kịch bản và làm thế nào để parameterise khối lượng mà tôi muốn để sao lưu.

Tôi không hiểu dòng đầu tiên (nguồn) và EC2_BIN. Với cấu hình đó, nó liệt kê tất cả các tập và tạo ảnh chụp nhanh của tất cả các ...

Để nhận xét về ảnh chụp nhanh, làm cách nào tôi có thể thay đổi dòng này để thêm văn bản?

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

Tôi xin lỗi là một người mới bắt đầu nhưng tôi không hiểu toàn bộ kịch bản

EDIT:

tôi nhận được lỗi này bằng mã mới này:

Tạo Ảnh chụp nhanh cho âm lượng: ([ec2-description-volume]) với mô tả: -03-13-2012 Thông tin chụp nhanh bên dưới: Client.InvalidParame terValue: Giá trị (([ec2-description-volumes])) cho tham số volumeId không hợp lệ. Dự kiến: 'vol -...'. Quá trình kết thúc vào lúc 03-13-2012-08: 11: 35 -

Và đây là đoạn code:

#!/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 

Trả lời

4

Ok tốt,

  1. Dòng đầu tiên nơi ông chạy (nguồn). Thats giống như./etc/environment. Dù sao tất cả những gì anh ta đang làm là tải một tập tin có một danh sách các biến môi trường mà amazon yêu cầu. Ít nhất đây là những gì tôi giả định.
  2. Anh ấy làm cho tập lệnh này phức tạp hơn nhiều so với nhu cầu cần thiết. Anh ta không cần chạy lệnh ec2-describe-instances và lưu đầu ra vào một tệp rồi grep đầu ra, v.v.
  3. Bạn có thể đặt bất cứ thứ gì bạn muốn cho DESC. Bạn chỉ có thể thay thế mọi thứ ở bên phải của = thành bất kỳ văn bản nào bạn muốn. Chỉ cần chắc chắn để đặt dấu ngoặc kép xung quanh nó.

Tôi sẽ thay đổi hai điều về tập lệnh này.

  1. Lấy InstanceId khi chạy trong tập lệnh. Đừng viết mã nó vào kịch bản. Dòng này sẽ hoạt động bất kể nơi tập lệnh đang chạy.

    MY_INSTANCE_ID=`curl http://169.254.169.254/1.0/meta-data/instance-id` 
    
  2. Thay vì gọi EC2-mô tả-khối lượng và tiết kiệm đầu ra vào một tập tin tạm thời vv ... Chỉ cần sử dụng một bộ lọc trên lệnh và nói với nó mà dụ id mà bạn muốn.

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

ok hơn nhiều nhờ cho lời giải thích, tôi đã tìm kiếm tất cả các ngày và tôi yêu cầu bản thân mình cho các câu hỏi về "toàn cầu" vars :-) Cảm ơn improvments chút về id cá thể và danh sách khối lượng, danh sách khối lượng gây ra cho tôi một số rắc rối. Tôi sẽ sửa đổi mô tả và tôi sẽ sửa "Client.InvalidParameterValue: Value (([ec2-describe-volume])) cho tham số volumeId không hợp lệ. Dự kiến: 'vol -...'. ' lỗi đó vẫn còn :-) – clement

+0

Hãy cẩn thận với việc thay đổi mô tả Hãy chắc chắn rằng bạn thêm dấu ngoặc kép xung quanh nó để cẩn thận.Nếu bạn đang nhận được một lỗi Client.InvalidParameterValue thì đó là vì một trong hai khối lượng-id là trống hoặc văn bản của bạn sử dụng cho mô tả có không gian và phần đọc của mô tả cho volume-id – bwight

+0

Tôi lại gặp phải vấn đề đó. Đây là toàn bộ quá trình được in trên màn hình: Tạo Ảnh chụp nhanh cho ổ đĩa: ([ec2-describe-volumes]) với mô tả: -03-13-2012 Thông tin chụp nhanh bên dưới: Client.InvalidParameterValue: Giá trị (([ec2-description-volume])) cho tham số volumeId không hợp lệ. Dự kiến: 'vol -...'. Quá trình kết thúc tại 03-13-2012-08: 11: 35 – clement

9

giải pháp trên không làm việc hoàn toàn cho tôi. Sau khi tôi giờ trò chuyện với sự hỗ trợ amazon, tôi có bây giờ kịch bản làm việc này, mà sẽ luôn luôn tạo ra những bức ảnh của tất cả các khối gắn liền với các trường hợp hiện tại:

#!/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" 

tôi thiết lập một cronjob trong /etc/cron.d/ebsbackup

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

này hoạt động khá tốt cho tôi ... :-)

Hope this helps cho bạn, Sebastian

0

Heres một hàm i viết i n Ruby để chụp tất cả các tập trên tất cả các trường hợp trong tất cả các vùng.

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

Tôi không biết về bạn, nhưng tôi muốn làm cho AMI thay vì chụp nhanh. Kịch bản này xuất phát từ một ý tưởng từ Craig, một nhân viên của Amazon. Họ đã phát triển một kịch bản chụp nhanh được gọi là Arche. Kịch bản này rất đơn giản - bạn đánh dấu một thẻ trong EC2 Instance và thẻ Ec2 là AMIed. Tôi đã thử nghiệm nó trong môi trường của tôi. Bạn cũng có thể thay đổi các lệnh trong tập lệnh này để sao lưu ảnh chụp nhanh.

Trước khi bạn chạy điều này, hãy định cấu hình biến môi trường Linux bằng các phím cert và pk.

#!/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

Tôi bắt gặp nhiều người đang tìm kiếm công cụ quản trị ảnh chụp nhanh EBS. Tôi tìm thấy một số công cụ trên internet nhưng chúng chỉ là các tập lệnh và giải pháp không hoàn chỉnh. Cuối cùng tôi quyết định tạo một chương trình linh hoạt hơn, tập trung và dễ quản trị hơn.

Ý tưởng là để có một chương trình tập trung để cai trị tất cả các bức ảnh chụp EBS (địa phương đến dụ hoặc điều khiển từ xa)

Tôi đã tạo ra một chương trình Perl nhỏ, https://github.com/sciclon/EBS_Snapshots

Một số tính năng: * Chương trình chạy trong chế độ daemon hoặc chế độ kịch bản (crontab)

  • Bạn có thể chọn duy nhất địa phương kèm theo khối lượng hoặc điều khiển từ xa cũng

  • Bạn có thể xác định tập tin log

  • Bạn có thể xác định cho từng khối lượng thể tích các bức ảnh chụp

  • Bạn có thể xác định cho từng khối lượng tần số trong đó

  • Tần số và số lượng sẽ làm việc như một "round-robin" khi đạt đến giới hạn xóa ảnh chụp cũ nhất.

  • bạn có thể điều chỉnh trong một bước số lượng có nghĩa là nếu bạn có 6 ảnh chụp nhanh và bạn sửa đổi số lượng trong 3 quy trình sẽ điều chỉnh tự động.

  • Bạn có thể xác định thực thi "quy tắc", Bạn có thể thêm mã để thực thi trước khi thực hiện ảnh chụp, ví dụ bạn muốn cố gắng tăng âm lượng hoặc dừng dịch vụ hoặc có thể kiểm tra tải mẫu. Quy trình gốc sẽ đợi mã thoát, "0" có nghĩa là thành công, bạn có thể xác định xem có tiếp tục hay không tùy thuộc vào mã thoát.

  • Bạn có thể xác định một "postscript" thực hiện để thực hiện bất kỳ scrip sau khi uống ảnh chụp (ví dụ như một email nói cho bạn về điều đó)

  • Bạn có thể thêm "Snapshots bảo vệ" để bỏ qua các ảnh chụp bạn xác định, Tôi có nghĩa là họ sẽ ở trong "chỉ đọc" và họ sẽ không bao giờ bị xóa.

  • bạn có thể định cấu hình lại tập lệnh "khi đang di chuyển" khi đang chạy ở chế độ daemon, tập lệnh chấp nhận tín hiệu và IPC.

  • Đô thị này có một "bộ nhớ cache cục bộ" để tránh yêu cầu API nhiều lần. Bạn có thể thêm hoặc sửa đổi bất kỳ cấu hình nào trong tệp cấu hình và tải lại mà không làm hỏng quy trình.

Các vấn đề liên quan