AWS Backup을 사용하여 ASG 인스턴스 중 한 대 백업하기

장크리수탉·2023년 9월 25일
0

AWS

목록 보기
4/4

람다 부분에 대한 설명 위주로 합니다.
AWS Backup vault를 만드는 것은 안다룹니다.

IAM

01. 람다 함수 내부에서 사용되는 Role setting

01-1. policy 생성

아래 정책은 AWS Backup job을 생성하기 위해서 필요로 함.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "backup:StartRestoreJob",
                "backup:DescribeRestoreJob",
                "backup:ListBackupVaults",
                "backup:ListRecoveryPointsByBackupVault",
                "backup:GetRecoveryPointRestoreMetadata"
            ],
            "Resource": "*"
        }
    ]
}

01-2. role에 위 정책 추가

  • AWSBackupDefaultServiceRole에 위에 만든 정책을 추가하였음.
  • 새로 Role을 생성해서 해도 무방함.

02. 람다 함수 자체 Permissions를 위한 role 생성

02-1. policy 생성

  • 함수 내에서 AWSBackupDefaultServiceRole 을 사용하도록 하였기에, PassRole을 AWSBackupDefaultServiceRole 대상으로 붙였음.
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "StartBackupJobPermission",
            "Effect": "Allow",
            "Action": "backup:StartBackupJob",
            "Resource": "*"
        },
        {
            "Sid": "PassRolePermission",
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": [
                "arn:aws:iam::xxxxxxxxxxxx:role/service-role/AWSBackupDefaultServiceRole"
            ]
        }
    ]
}

02-2. EC2 읽기 권한 부여

  • AmazonEC2ReadOnlyAccess

Lambda

01. 전체 소스

import boto3

ec = boto3.client('ec2')
backup_client = boto3.client('backup')

def get_instances_with_asg_name_tag():
    reservations = ec.describe_instances(
        Filters=[
            {
                'Name': 'tag:Name',
                'Values': ['2nd-asg-img']
            },
        ]
    ).get('Reservations', [])
    
    instances = sum([[i for i in r['Instances']] for r in reservations], [])
    
    return instances

def start_backup_job(backup_vault_name, iam_role_arn, resource_arn):
    response = backup_client.start_backup_job(
        BackupVaultName=backup_vault_name,
        ResourceArn=resource_arn,
        IamRoleArn=iam_role_arn
    )
    
    backup_job_id = response['BackupJobId']
    print(f"Started backup job with ID: {backup_job_id}")
    return backup_job_id


def lambda_handler(event, context):
    instances_to_backup = get_instances_with_asg_name_tag()
    if instances_to_backup:
        instance_arn = f"arn:aws:ec2:ap-northeast-2:xxxxxxxxxxxx:instance/{instances_to_backup[0]['InstanceId']}"
        backup_vault_name = "2nd-mission-backup-vault"
        iam_role_arn = "arn:aws:iam::xxxxxxxxxxxx:role/service-role/AWSBackupDefaultServiceRole"
        start_backup_job(backup_vault_name, iam_role_arn, instance_arn)

    return {
        'message': 'Backup job initiated successfully.'
    }

02. 전체 소스 분석

02-1. Backup 할 asg 인스턴스 정보 불러오기

def get_instances_with_asg_name_tag():
    reservations = ec.describe_instances(
        Filters=[
            {
                'Name': 'tag:Name',
                'Values': ['2nd-asg-img']
            },
        ]
    ).get('Reservations', [])
    
    instances = sum([[i for i in r['Instances']] for r in reservations], [])
    
    return instances
  • autoscaling group 의 Tag를 Values 값에 넣는다.
  • 위 코드에서 나의 asg Tag는 '2nd-asg-ing' 이다.
  • instances에는 위와 같은 정보들이 저장된다. 인스턴스 정보들을 하나의 리스트로 합친다.

02-2. Backup job 생성하기

  • 람다 핸들러에서 호출하는 모양을 먼저 보자.
def lambda_handler(event, context):
    instances_to_backup = get_instances_with_asg_name_tag()
    if instances_to_backup:
        instance_arn = f"arn:aws:ec2:ap-northeast-2:xxxxxxxxxxxx:instance/{instances_to_backup[0]['InstanceId']}"
        backup_vault_name = "2nd-mission-backup-vault"
        iam_role_arn = "arn:aws:iam::xxxxxxxxxxxx:role/service-role/AWSBackupDefaultServiceRole"
        start_backup_job(backup_vault_name, iam_role_arn, instance_arn)

    return {
        'message': 'Backup job initiated successfully.'
    }
  • asg 태그가 붙은 인스턴스들을 모두 받아다가 instances_to_backup에 넣는다.
  • instance_arn을 생성한다.
  • instances_to_backup[0] 은 태그를 가진 여러 인스턴스 중 첫번째 인스턴스에 대한 것만 가져오고, 그 인스턴스의 InstanceID를 넣는다.
  • 미리 생성한 Backup vault의 name을 backup_vault_name에 넣는다.
def start_backup_job(backup_vault_name, iam_role_arn, resource_arn):
    response = backup_client.start_backup_job(
        BackupVaultName=backup_vault_name,
        ResourceArn=resource_arn,
        IamRoleArn=iam_role_arn
    )
    
    backup_job_id = response['BackupJobId']
    print(f"Started backup job with ID: {backup_job_id}")
    return backup_job_id

EventBridge


  • 필요에 따라 구성하시면 됩니다.

결과 (AWS Backup)

  • 람다가 실행회면 AWS Backup > Jobs에 가면 아래와 같이 생성됨.

  • 성공이 되면 Backup vaults에 저장됨.

profile
4차 산업시대 핵심인재로 매일 반보씩 걷는 장크리수탉의 Dictionary

0개의 댓글