2018년 3월 22일 목요일

lambda를 이용하여 모든 EC2의 volume을 주기적으로 snapshot으로 백업하기


각 계정에 EC2의 EBS를 백업하려 할때는 두가지방법이 있다. AMI를 이용하거나 EBS Volume을 snapshot으로 주기적으로 생성하는 방법 오늘은 그중에서 EBS volume을 lambda를 이용하여 백업하는 방법을 정리한다.

절차는 아래와 같다.
1. lambda를 생성하기 위한 role을 생성
2. lambda 생성 소스 추가 및 삭제 정책일 등록
3. cloud watch event추가 및 event 설정
4. 테스트
5. 완료


lambda source
#===================
import boto3
import datetime

import os

ec2 = boto3.resource('ec2')

def lambda_handler(event, context):
    print("\n\nAWS snapshot backups starting at %s" % datetime.datetime.now())
    instances = ec2.instances.filter(
        Filters=[{'Name': 'instance-state-name', 'Values': ['running']},{'Name': 'tag:BackupYN', 'Values': ['Y']}])
 
    for instance in instances:
        instance_name = filter(lambda tag: tag['Key'] == 'Name', instance.tags)[0]['Value']
        print("instance_name [%s]" % instance_name)
     
        for volume in ec2.volumes.filter(Filters=[{'Name': 'attachment.instance-id', 'Values': [instance.id]}]):
            description = 'scheduled-%s.%s-%s' % (instance_name, volume.volume_id,
                datetime.datetime.now().strftime("%Y%m%d-%H%M%S"))
         
            response = volume.create_snapshot(Description=description, VolumeId=volume.volume_id) 
         
            if response:
                print("Snapshot created with description [%s]" % description)
                ec2.create_tags( Resources=[response.snapshot_id],
                Tags=[
                    {'Key': 'Name', 'Value': description}
                ])
                #snapshot = ec2.Snapshot(response.snapshot_id)
                #snapshot.create_tags(Tags=[{'Key': 'Name','Value': description}])

        for snapshot in volume.snapshots.all():
            retention_days = int(os.environ['retention_days'])
            if snapshot.description.startswith('scheduled-') and ( datetime.datetime.now().replace(tzinfo=None) - snapshot.start_time.replace(tzinfo=None) ) > datetime.timedelta(days=retention_days):
                print("\t\tDeleting snapshot [%s - %s]" % ( snapshot.snapshot_id, snapshot.description ))
                snapshot.delete()

    print("\n\nAWS snapshot backups completed at %s" % datetime.datetime.now())
    return True
#==========

댓글 없음:

댓글 쓰기

EBS 볼륨 확장 정리: 수동 확장부터 자동 확장, 모니터링까지 (Linux 기준)

  Amazon Web Services 에서 EC2 인스턴스를 운영하다 보면 EBS 볼륨 용량을 늘려야 하는 상황은 자주 발생합니다.  하지만 EBS 볼륨 크기를 늘렸다고 해서 파일 시스템이 자동으로 확장되지는 않습니다. 볼륨 확장 이후에는 파일 ...