AWS: EC2インスタンスをスナップショットから復元するスクリプト
スナップショットのリストアに伴う一連の操作をスクリプト化。
デバイスが EBS 1個だけの場合にのみ対応。
- 対象のインスタンスID、スナップショットIDを引数に指定するので事前に確認
こちらを参照
mog project: AWS: More Listings of EC2 Information
コード
#!/usr/bin/env python # -*- coding: utf-8 -*- import sys import subprocess import time try: import json except ImportError: print('You need python 2.6 or later to run this script.') sys.exit(1) def usage(): print('Usage: %s <instance-id> <snapshot-id>' % sys.argv[0]) sys.exit(2) def run_command(*args): output = subprocess.check_output(['aws', 'ec2'] + list(args)) return json.loads(output) def get_volume_id(instance): assert(len(instance['BlockDeviceMappings']) == 1) return instance['BlockDeviceMappings'][0]['Ebs']['VolumeId'] def get_zone(instance): return instance['Placement']['AvailabilityZone'] def get_device(instance): assert(len(instance['BlockDeviceMappings']) == 1) return instance['BlockDeviceMappings'][0]['DeviceName'] def is_running(instance): return instance['State']['Code'] == 16 def is_stopped(instance): return instance['State']['Code'] == 80 def get_instance(instance_id): j = run_command('describe-instances', '--instance-ids', instance_id) return j['Reservations'][0]['Instances'][0] def start_instance(instance_id): sys.stdout.write('Starting instance: %s ...' % instance_id) run_command('start-instances', '--instance-ids', instance_id) for i in range(20): sys.stdout.write('.') time.sleep(10) if is_running(get_instance(instance_id)): break else: raise(RunTimeError('Timed out for waiting.')) print('OK') def stop_instance(instance_id): sys.stdout.write('Stopping instance: %s ...' % instance_id) run_command('stop-instances', '--instance-ids', instance_id) for i in range(20): sys.stdout.write('.') time.sleep(10) if is_stopped(get_instance(instance_id)): break else: raise(RunTimeError('Timed out for waiting.')) print('OK') def detach_volume(volume_id): sys.stdout.write('Detaching volume: %s ...' % volume_id) run_command('detach-volume', '--volume-id', volume_id) print('OK') def create_volume(zone, snapshot): sys.stdout.write('Creating volume from snapshot: %s ...' % snapshot) j = run_command( 'create-volume', '--availability-zone', zone, '--snapshot-id', snapshot) print('OK') return j['VolumeId'] def attach_volume(volume_id, instance_id, device): sys.stdout.write('Attaching volume: %s ...' % volume_id) run_command( 'attach-volume', '--volume-id', volume_id, '--instance-id', instance_id, '--device', device) print('OK') def delete_volume(volume_id): sys.stdout.write('Deleting volume: %s ...' % volume_id) run_command('delete-volume', '--volume-id', volume_id) print('OK') if __name__ == '__main__': if len(sys.argv) != 3: usage() instance_id = sys.argv[1] snapshot = sys.argv[2] sys.stdout.write('Checking instance: %s ...' % instance_id) ins = get_instance(instance_id) old_vol = get_volume_id(ins) print('OK') stop_instance(instance_id) detach_volume(old_vol) new_vol = create_volume(get_zone(ins), snapshot) attach_volume(new_vol, instance_id, get_device(ins)) start_instance(instance_id) delete_volume(old_vol)
実行例
$ ./aws_restore.py i-xxxxxxxx snap-XXXXXXXX Checking instance: i-xxxxxxxx ...OK Stopping instance: i-xxxxxxxx .......OK Detaching volume: vol-yyyyyyyy ...OK Creating volume from snapshot: snap-XXXXXXXX ...OK Attaching volume: vol-zzzzzzzz ...OK Starting instance: i-xxxxxxxx .....OK Deleting volume: vol-yyyyyyyy ...OK
0 件のコメント:
コメントを投稿