
AWS의 주요 관리형 백업 서비스로, 다양한 AWS 리소스의 백업을 중앙에서 관리할 수 있게 해줍니다.
이 포스트에서는 AWS Backup의 기본 개념을 넘어 실제 엔터프라이즈 환경에서 활용할 수 있는 심화 내용을 다루겠습니다.
다음은 태그 기반으로 백업 정책을 동적으로 적용하는 Lambda 함수입니다.
import boto3
import json
from datetime import datetime
def lambda_handler(event, context):
backup_client = boto3.client('backup')
ec2_client = boto3.client('ec2')
def get_instances_by_backup_tag():
instances = []
response = ec2_client.describe_instances(
Filters=[
{
'Name': 'tag:BackupPolicy',
'Values': ['Daily', 'Weekly', 'Monthly']
}
]
)
for reservation in response['Reservations']:
for instance in reservation['Instances']:
instances.append({
'InstanceId': instance['InstanceId'],
'Tags': instance['Tags']
})
return instances
def create_backup_selection(instances, plan_id):
resources = []
for instance in instances:
resources.append(f"arn:aws:ec2:{boto3.session.Session().region_name}:{boto3.client('sts').get_caller_identity()['Account']}:instance/{instance['InstanceId']}")
try:
response = backup_client.create_backup_selection(
BackupPlanId=plan_id,
BackupSelection={
'SelectionName': f'DynamicSelection-{datetime.now().strftime("%Y%m%d")}',
'IamRoleArn': 'arn:aws:iam::YOUR_ACCOUNT_ID:role/service-role/AWSBackupDefaultServiceRole',
'Resources': resources,
'ListOfTags': [
{
'ConditionType': 'STRINGEQUALS',
'ConditionKey': 'BackupPolicy',
'ConditionValue': 'Daily'
}
]
}
)
return response
except Exception as e:
print(f"Error creating backup selection: {str(e)}")
return None
instances = get_instances_by_backup_tag()
plan_id = 'YOUR_BACKUP_PLAN_ID'
return create_backup_selection(instances, plan_id)
import boto3
import json
def lambda_handler(event, context):
sns_client = boto3.client('sns')
backup_client = boto3.client('backup')
def check_backup_job_status():
response = backup_client.list_backup_jobs(
ByState='FAILED'
)
failed_jobs = []
for job in response['BackupJobs']:
failed_jobs.append({
'JobId': job['BackupJobId'],
'ResourceType': job['ResourceType'],
'ResourceArn': job['ResourceArn'],
'State': job['State'],
'CreationDate': str(job['CreationDate'])
})
return failed_jobs
failed_jobs = check_backup_job_status()
if failed_jobs:
message = "다음 백업 작업이 실패했습니다:\n\n"
for job in failed_jobs:
message += f"Job ID: {job['JobId']}\n"
message += f"Resource: {job['ResourceType']} ({job['ResourceArn']})\n"
message += f"생성일: {job['CreationDate']}\n\n"
sns_client.publish(
TopicArn='arn:aws:sns:REGION:ACCOUNT_ID:BackupAlerts',
Subject='AWS Backup 작업 실패 알림',
Message=message
)
return {
'statusCode': 200,
'body': json.dumps('백업 상태 확인 완료')
}
import boto3
import json
def lambda_handler(event, context):
source_region = 'ap-northeast-2' # 서울 리전
destination_region = 'ap-northeast-1' # 도쿄 리전
source_backup = boto3.client('backup', region_name=source_region)
destination_backup = boto3.client('backup', region_name=destination_region)
def copy_backup_across_region(recovery_point_arn):
try:
response = source_backup.copy_into_backup_vault(
RecoveryPointArn=recovery_point_arn,
SourceBackupVaultName='Default',
DestinationBackupVaultArn=f'arn:aws:backup:{destination_region}:{boto3.client("sts").get_caller_identity()["Account"]}:backup-vault:Default',
IamRoleArn=f'arn:aws:iam::{boto3.client("sts").get_caller_identity()["Account"]}:role/service-role/AWSBackupDefaultServiceRole'
)
return response
except Exception as e:
print(f"Error copying backup: {str(e)}")
return None
def get_latest_successful_backup():
response = source_backup.list_recovery_points_by_backup_vault(
BackupVaultName='Default',
ByStatus='COMPLETED',
MaxResults=1
)
if response['RecoveryPoints']:
return response['RecoveryPoints'][0]['RecoveryPointArn']
return None
recovery_point_arn = get_latest_successful_backup()
if recovery_point_arn:
return copy_backup_across_region(recovery_point_arn)
else:
return {
'statusCode': 404,
'body': json.dumps('No completed backup found')
}
import boto3
from datetime import datetime, timedelta
def lambda_handler(event, context):
backup_client = boto3.client('backup')
def update_lifecycle_policy():
try:
response = backup_client.update_backup_plan(
BackupPlanId='YOUR_BACKUP_PLAN_ID',
BackupPlan={
'BackupPlanName': 'OptimizedBackupPlan',
'Rules': [
{
'RuleName': 'DailyBackups',
'TargetBackupVaultName': 'Default',
'ScheduleExpression': 'cron(0 0 * * ? *)',
'StartWindowMinutes': 60,
'CompletionWindowMinutes': 120,
'Lifecycle': {
'MoveToColdStorageAfterDays': 30,
'DeleteAfterDays': 90
}
}
]
}
)
return response
except Exception as e:
print(f"Error updating backup plan: {str(e)}")
return None
return update_lifecycle_policy()
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyDeleteRecoveryPoint",
"Effect": "Deny",
"Principal": "*",
"Action": [
"backup:DeleteRecoveryPoint"
],
"Resource": "*",
"Condition": {
"StringNotLike": {
"aws:PrincipalArn": [
"arn:aws:iam::*:role/BackupAdminRole"
]
}
}
},
{
"Sid": "DenyBackupVaultDelete",
"Effect": "Deny",
"Principal": "*",
"Action": [
"backup:DeleteBackupVault",
"backup:DeleteBackupVaultAccessPolicy",
"backup:DeleteBackupVaultNotifications",
"backup:UpdateBackupVault"
],
"Resource": "*"
}
]
}
import boto3
import json
def create_backup_dashboard():
cloudwatch = boto3.client('cloudwatch')
dashboard_body = {
"widgets": [
{
"type": "metric",
"properties": {
"metrics": [
["AWS/Backup", "NumberOfBackupJobsCompleted", "BackupVaultName", "Default"],
[".", "NumberOfBackupJobsFailed", ".", "."]
],
"period": 300,
"stat": "Sum",
"region": "ap-northeast-2",
"title": "백업 작업 상태"
}
},
{
"type": "metric",
"properties": {
"metrics": [
["AWS/Backup", "NumberOfRecoveryPointsCreated", "BackupVaultName", "Default"]
],
"period": 300,
"stat": "Sum",
"region": "ap-northeast-2",
"title": "생성된 복구 지점"
}
}
]
}
try:
response = cloudwatch.put_dashboard(
DashboardName='BackupMonitoring',
DashboardBody=json.dumps(dashboard_body)
)
return response
except Exception as e:
print(f"Error creating dashboard: {str(e)}")
return None
def lambda_handler(event, context):
return create_backup_dashboard()
AWS Backup은 엔터프라이즈급 백업 솔루션으로서, 적절한 자동화와 모니터링을 통해 안정적인 백업 환경을 구축할 수 있습니다.
위에서 다룬 예제들을 기반으로 각 조직의 요구사항에 맞는 백업 전략을 수립하시기 바랍니다.