AWS 기술 블로그

AWS Backup를 활용하여 백업 데이터 복원 테스트를 구현하기

미션 크리티컬 애플리케이션은 전자상거래부터 의료에 이르기까지 다양한 분야를 지원하므로, 견고한 백업 전략은 단순한 모범 사례가 아닌 필수 요소입니다. 랜섬웨어와 같은 위협이 점점 더 정교해지는 상황에서 AWS 사용자에게는 백업 보유만으로는 충분하지 않습니다. 조직들은 재해가 발생했을 때 이러한 안전장치가 제대로 작동할 것이라는 확신이 필요합니다. 수동 테스트는 필수적이지만 IT 리소스를 소모합니다. 정기적인 자동화된 복원 테스트를 통해 조직은 효율성 향상뿐만 아니라 백업 무결성 검증, 규정 준수 보고 간소화, 인력 리소스 확보를 실현하는 시스템을 구축할 수 있으며, 필요한 순간에 보호 전략이 효과적으로 작동할 것이라는 확신을 얻을 수 있습니다.

이전 게시물인 AWS Backup 복원 테스트로 복구 준비 상태 검증하기에서는 내부 재해 복구(DR) 정책 및 규제 요구 사항을 충족하기 위해 AWS Backup 복원 테스트가 중요한 이유를 살펴보았습니다. 유럽 연합의 디지털 운영 복원력 법(DORA) 및 뉴욕 금융 서비스부(NYDFS) 사이버보안 규정과 같은 규제가 형성하는 디지털 환경에서 복원력은 단순한 목표가 아닌 필수 요건입니다. AWS Backup 복원 테스트는 이러한 규정에서 요구하는 증거를 제공할 수 있으며, 테스트 및 감사 기능을 통해 조직의 복원력 검증 및 보고를 위한 다양한 옵션을 제공합니다.

이 게시물에서는 AWS Backup 복원 테스트 구성 방법과 자체 계획 수립 시 고려해야 할 모범 사례를 알아봅니다. 또한 엔드 투 엔드 복원 테스트가 실제로 어떻게 작동하는지 보여주는 예제를 제공합니다.

AWS Backup 복원 테스트 작동 방식

AWS Backup 복원 테스트를 통해 사용자는 미리 정의된 일정에 따라 데이터 복원을 테스트하고 복원된 데이터를 검증할 수 있습니다. 일정을 설정하고 데이터 복원을 확인하는 자동화된 프로세스를 생성하는 기능은 수동 작업을 줄이고 규정 준수 요구 사항을 충족하는 데 도움이 됩니다. 자동화된 복원 테스트가 없으면 담당자가 시스템과 복구 지점을 선택하고, 수동으로 복원을 완료한 다음, 애플리케이션 팀이 복원된 데이터를 검증해야 할 수 있습니다. 이는 여러 팀의 시간과 리소스를 소모하며, 이러한 리소스는 애플리케이션 개선에 더 유용하게 사용될 수 있습니다. 이 프로세스를 자동화하면 복원을 정기적으로 검증하는 데이터 검증 파이프라인을 만들 수 있습니다.

AWS Backup 복원 테스트 계획은 두 단계로 구성됩니다. 첫 번째 단계에서는 복원 테스트 계획을 생성하고, 두 번째 단계에서는 복원 테스트 계획에 의해 복원될 보호 대상 리소스를 선택합니다. AWS Backup이 복원을 완료하면 Amazon EventBridge에 의해 트리거되는 AWS Lambda 함수를 통해 복원 테스트 검증을 구현할 수 있습니다. Lambda 함수는 연결성 확인, Amazon S3에서 객체 검색 또는 실제 데이터 검증을 위한 암호화 키 상태 확인 등 다양한 검증 활동을 수행한 다음, 검증 성공 또는 실패 여부를 AWS Backup에 보고합니다. 복원 테스트 완료 후에는 필요에 따라 AWS Backup Audit Manager 보고서를 활용하여 규정 준수 상태를 입증할 수 있습니다.

복원 테스트 계획 구축하기

복원 테스트 구현의 첫 번째 단계는 복원 테스트 계획 수립입니다. 테스트 빈도와 테스트 대상에 대한 다양한 고려 사항이 있으므로, 여기서는 모범 사례와 권장 사항을 중심으로 설명합니다. 복원 테스트 계획은 다음 세 가지 요소로 구성됩니다:

  • 테스트 빈도
  • 시작 시간 범위
  • 복구 지점 선택 기준

테스트 빈도의 경우, 중요 리소스는 일일 또는 주간 테스트를 권장합니다. 리소스는 보존 기간 내에 테스트되어야 하므로, 복구 지점을 14일 동안 보존하는 경우 테스트는 14일보다 짧은 주기로 실행되어야 합니다. 시작 시간 범위는 테스트할 복구 지점 수와 각 복원이 완료되는 데 걸리는 시간에 따라 달라집니다. 각 서비스에는 최대 동시 복원 허용 개수가 있으므로, 이 제한을 초과하지 않도록 계획을 적절히 분산해야 합니다.

Figure 1: Example restore testing plan configuration

그림 1: 복원 테스트 계획 구성 예제

복구 지점 선택 시 모든 볼트 또는 특정 볼트, 적격 복구 지점의 시간 범위, 그리고 특정 시점 복구(PITR) 리소스 유형 포함 여부 등을 지정할 수 있습니다. 계정당 단일 볼트를 사용하거나, 애플리케이션 유형이나 계층에 따라 여러 볼트를 구성할 수 있습니다. 중앙 백업 계정으로 복제하는 경우, 소스 계정별로 논리적으로 에어갭된(LAG) 볼트를 생성하는 것이 권장됩니다.

Figure 2: Sample AWS Backup recovery point selection criteria

그림 2: AWS Backup 복구 지점 선택 기준 예시

복원 테스트 계획을 생성한 후에는 2단계인 보호 대상 리소스 선택으로 넘어갑니다: 각 리소스 선택 시 Amazon S3 또는 Amazon Relational Database Service(Amazon RDS)와 같은 단일 리소스 유형을 지정해야 합니다. 리소스 유형 선택 후에는 복원 테스트 대상이 될 특정 리소스를 추가로 지정할 수 있습니다. 복원 테스트 계획당 최대 30개의 보호 대상 리소스를 선택할 수 있습니다. 리소스 할당 생성 시 기본 AWS Backup IAM 역할을 선택할 수 있으며, 기본 역할이 없는 경우 적절한 권한으로 자동 생성됩니다.

팁: Lambda 테스트를 사용하는 경우, 보존 기간을 데이터 검증이 완료되는 데 필요한 시간보다 길게 설정하세요. 

Figure 3: Sample resource assignment for S3

그림 3: S3에 대한 리소스 할당 예시

리소스는 개별 선택 또는 태그를 통해 필터링할 수 있으며, 이를 통해 요구 사항에 맞는 특정 리소스를 테스트 대상으로 지정할 수 있습니다. 그림 4에서는 리소스 유형으로 S3를 선택한 후 태그 필터링을 통해 특정 버킷을 선택합니다.

각 서비스는 복원 테스트를 성공적으로 수행하기 위한 고유한 복원 메타데이터 세트를 가지고 있으며, AWS Backup은 최소한의 복원 메타데이터를 자동으로 추론합니다. 또한 기본값을 변경할 수 있는 재정의 가능 메타데이터도 제공됩니다. 추론 메타데이터 및 재정의 가능 메타데이터에 대한 자세한 내용은 AWS Backup 문서에서 확인할 수 있습니다.

Figure 4: Example protected resources selection filtered using tags

그림 4: 태그를 사용하여 필터링된 보호된 리소스 선택 예시

전체 계획과 리소스 선택을 정의한 후, 그림 5와 같이 완전히 운영 가능한 계획이 완성됩니다.

Figure 4: Example protected resources selection filtered using tags

그림 5: AWS Backup 복원 테스트 계획의 완성된 구성 예시

복원 검증 구현하기

복원 테스트 계획 구성만으로는 충분하지 않으며, 복원된 데이터의 사용 가능 여부도 검증해야 합니다. AWS Backup은 복원 작업 상태 변경 시 Amazon EventBridge 이벤트를 전송합니다. 이 이벤트를 활용하여 복원 테스트 작업이 완료 상태가 되면 AWS Lambda 함수를 트리거할 수 있으며, 애플리케이션 팀은 이를 통해 데이터 검증 코드를 작성할 수 있습니다. 테스트 코드는 보호 대상 서비스에 따라 달라지며, S3 버킷에서 객체를 검색하거나 Amazon DynamoDB를 쿼리하는 등의 작업을 포함할 수 있습니다. Lambda 함수 실행 후에는 검증 성공 또는 실패 여부를 AWS Backup에 보고합니다. 그림 6은 이러한 복원 검증 워크플로의 예시를 보여줍니다.

Figure 6: Workflow of AWS Backup restore testing validation

그림 6: AWS Backup 복원 테스트 검증 워크플로우

여러 복원 테스트 계획이 있는 경우, 복원 테스트 계획 Amazon 리소스 이름(ARN)을 포함시켜 특정 이벤트를 특정 함수로 전송하도록 EventBridge 규칙을 조정할 수 있습니다(그림 7과 같이). 복원 테스트 계획 ARN을 사용하면 수동 복원을 필터링할 수도 있습니다.

Figure 7: Example of EventBridge event pattern for restore job

그림 7: 복원 작업을 위한 EventBridge 이벤트 패턴 예시

이벤트 패턴 생성 후 이벤트를 전송할 대상을 선택합니다. 서로 다른 테스트 기준이 필요한 여러 리소스 유형이 있는 경우, Lambda 코디네이터를 사용하여 각 리소스 유형의 이벤트를 적절한 검증 함수로 전달할 수 있습니다. Lambda 코디네이터는 리소스 유형을 확인하고 해당 이벤트를 올바른 데이터 검증 Lambda 함수로 라우팅합니다. 여러 보호 대상 리소스 유형이 있는 경우, 그림 8과 같이 이 Lambda 코디네이터를 EventBridge 이벤트의 대상으로 지정합니다.

Figure 8: Sample target selection for EventBridge rule

그림 8: EventBridge 규칙의 대상 선택 예시

다음은 샘플 복원 Lambda 코디네이터 코드입니다.

import json
import boto3
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
lambda_client = boto3.client('lambda')
def handler(event, context):
    logger.info("Handling event: %s", json.dumps(event))
    resource_type = event.get('detail', {}).get('resourceType', '')
    function_name = None
    try:
        if resource_type == "RDS":
            function_name = "RDSRestoreValidation"
            logger.info("Resource is an RDS instance. Invoking Lambda function: %s", function_name)
        elif resource_type == "S3":
            function_name = "S3RestoreValidation"
            logger.info("Resource is an S3 bucket. Invoking Lambda function: %s", function_name)
        else:
            raise ValueError(f"Unsupported resource type: {resource_type}")
        # Invoke the appropriate Lambda function
        response = lambda_client.invoke(
            FunctionName=function_name,
            Payload=json.dumps(event),
            InvocationType="RequestResponse"
        )
        logger.info("Lambda invoke response: %s", response)
    except Exception as e:
        logger.error("Error during Lambda invocation: %s", str(e))
        raise e
    logger.info("Finished processing event for resource type: %s", resource_type)

복원 Lambda 코디네이터 코드를 보면, 리소스 유형이 S3와 일치하는 경우 전체 이벤트를 S3RestoreValidation Lambda 함수로 전달합니다. 다음의 S3RestoreValidation 함수는 S3 리소스의 복원 검증을 수행하고 검증의 성공 또는 실패 여부를 AWS Backup에 보고합니다.

import json
import boto3
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
s3_client = boto3.client('s3')
backup_client = boto3.client('backup')
def handler(event, context):
    logger.info("Handling event: %s", json.dumps(event))
    restore_job_id = event.get('detail', {}).get('restoreJobId', '')
    resource_type = event.get('detail', {}).get('resourceType', '')
    created_resource_arn = event.get('detail', {}).get('createdResourceArn', '')
    validation_status = "SUCCESSFUL"
    validation_status_message = "Restore validation completed successfully"
    try:
        if resource_type == "S3":
            bucket_name = get_bucket_name_from_arn(created_resource_arn)
            # List objects in the bucket
            response = s3_client.list_objects_v2(Bucket=bucket_name)
            # Check if the bucket contains more than 1 object
            object_count = response.get('KeyCount', 0)
            if object_count > 1:
                logger.info(f"Bucket {bucket_name} contains more than 1 object. Validation successful.")
            else:
                logger.info(f"Bucket {bucket_name} contains 1 or fewer objects. Validation failed.")
                validation_status = "FAILED"
                validation_status_message = f"Bucket {bucket_name} contains only       {object_count} object(s)."
        else:
            validation_status = "FAILED"
            validation_status_message = f"Unsupported resource type: {resource_type}"
        # Report validation result to AWS Backup
        backup_client.put_restore_validation_result(
            RestoreJobId=restore_job_id,
            ValidationStatus=validation_status,
            ValidationStatusMessage=validation_status_message
        )
        logger.info("Restore validation result sent successfully")
    except Exception as e:
        logger.error("Error during restore validation: %s", str(e))
        validation_status = "FAILED"
        validation_status_message = f"Restore validation encountered an error: {str(e)}"
        # Report failure result to AWS Backup
        backup_client.put_restore_validation_result(
            RestoreJobId=restore_job_id,
            ValidationStatus=validation_status,
            ValidationStatusMessage=validation_status_message
        )
    logger.info("Finished processing restore validation for job ID: %s", restore_job_id)
def get_bucket_name_from_arn(arn):
    arn_parts = arn.split(":")
    resource_parts = arn_parts[-1].split("/")
    return resource_parts[-1]

S3RestoreValidation 코드는 버킷에 하나 이상의 객체가 존재하는지 확인하여 S3 복원을 검증합니다. 검증 완료 후 복원 성공 여부를 AWS Backup에 보고합니다. 복원 및 검증이 모두 성공하면 그림 9와 같은 결과가 표시됩니다. 작업 상태는 Completed, 검증 상태는 Successful로 나타나야 합니다. Lambda 코드에서 검증 상태를 설정할 때 검증 메시지를 선택적으로 포함할 수 있으며, 이 메시지는 AWS Backup 콘솔 및 API에 표시됩니다. 복원 검증 및 샘플에 대한 자세한 내용은 문서를 참조하세요.

 Figure 9: Example of AWS Backup restore testing completion

그림 9: AWS Backup 복원 테스트 완료 예시

AWS Backup은 검증이 완료되거나 정리 기간이 만료되면 복원된 리소스의 삭제 프로세스를 자동으로 시작합니다. 삭제 소요 시간은 리소스 유형에 따라 달라집니다. 대부분의 리소스는 신속하게 삭제되지만, 일부 리소스는 더 오래 걸릴 수 있습니다. 예를 들어, S3 버킷 삭제는 2단계 프로세스로 진행됩니다. 먼저 객체 삭제를 위한 수명 주기 규칙이 추가되고, 버킷이 비워진 후 삭제가 완료됩니다. 이러한 수명 주기 규칙은 실행에 며칠이 소요될 수 있습니다.

AWS Backup 복원 테스트 고려사항

복원 테스트 계획 생성 및 검증의 모범 사례를 살펴보았으니, 이제 구현 시 고려해야 할 몇 가지 추가 사항을 알아보겠습니다.

비용 최적화

비용 최적화는 복원 테스트를 포함한 백업 수명 주기 전반에 걸쳐 중요합니다. 다음은 비용을 효과적으로 관리하는 방법입니다.

  • 테스트 대상 리소스 선택하기: 태그 또는 리소스 선택 기능을 활용하여 중요 리소스만 테스트합니다. 규정 준수 요구 사항이 없는 한 비프로덕션 리소스는 제외하는 것을 권장합니다.
  • 중요도에 따라 테스트 일정 계획하기: 리소스의 중요도에 따라 테스트 빈도를 차등 적용합니다:(중요 리소스는 매일 또는 매주, 기타 리소스는 분기별 또는 반년마다) 이는 정책 및 보존 기간과 일치해야 합니다:(예: 보존 기간이 14일이면 14일 이내에 테스트)
  • 복원 데이터 보존 기간 최적화하기: 복원된 데이터의 보존 기간을 최소화하여 비용을 절감합니다. 자동화된 테스트 완료 시점을 기준으로 삭제 시간을 설정합니다.

복원 테스트에 대한 가격 정보는 AWS Backup 요금 페이지에서 확인할 수 있습니다.

AWS Backup 감사 및 보고

AWS Backup Audit Manager는 백업 정책과 리소스가 내부 또는 규제 표준을 준수하는지 확인할 수 있도록 지원합니다. 이는 리소스가 백업되었는지, 백업 빈도, 볼트가 논리적으로 에어갭되었는지, 그리고 복원 시간이 목표를 충족하는지를 추적합니다. AWS Backup audit manager 감사 프레임워크는 기본 제공되는 컨트롤 또는 사용자 지정 옵션을 통해 리소스를 정책에 맞게 조정할 수 있습니다.

감사 보고서는 공유를 위한 규정 준수 증거를 제공합니다. 보고서는 두 가지 유형으로 제공됩니다: 작업 보고서는 최근 24시간 동안 완료되거나 진행 중인 작업을 표시하며(예: 최근 복원 작업 보고서), 규정 준수 보고서는 리소스 상태 또는 프레임워크 컨트롤을 모니터링합니다. 관리 계정을 사용하면 조직 전체의 다중 계정 보고서를 확인할 수 있습니다. 보고서 생성 방법과 프레임워크 사용에 대한 자세한 내용은 문서를 참조하세요.

복원 테스트 계획 할당량

복원 테스트 계획을 생성할 때, 계획이 테스트 요구사항을 충족하고 예정된 시간 내에 완료될 수 있도록 계획을 수립해야 합니다. 각 리소스 유형은 테스트 계획에서 동시에 실행할 수 있는 복원 작업 수에 제한이 있습니다(온디맨드 복원은 해당되지 않음). 1단계의 ‘지정된 시간 범위 내에서 시작(Start within window)’ 창이 핵심입니다. 이 설정은 복원 테스트 계획의 모든 리소스 선택이 지정된 시간 범위 내에 시작되어야 함을 의미하며, 동시 실행 제한을 초과하지 않도록 주의가 필요합니다. 예를 들어, Amazon S3는 30개의 동시 복원 작업을 지원하므로, 1시간 시간 범위에서 90개의 버킷을 선택하면 지연이 발생할 수 있습니다. 효과적인 계획 수립을 위해서는 더 긴 시작 시간 범위를 설정하거나, 시작 시간을 분산한 여러 개의 계획을 생성하는 것을 권장합니다. 특히 빈번한(일일/주간) 테스트와 주기적인(월간/분기별) 테스트가 함께 실행되는 경우 더욱 중요합니다. 문서에서 조정 가능한 제한을 확인하고 필요한 경우 증가를 요청하시기 바랍니다.

엔드 투 엔드 복원 테스트 시각화

엔드 투 엔드 복원 테스트의 작동 방식과 테스트 계획의 배포 및 통합 과정을 확인할 수 있도록 샘플 복원 테스트 계획을 제공합니다. 이 샘플 복원 테스트 계획은 프로세스의 각 단계를 시각화하여 이해하고 복원 및 검증이 어떻게 상호 작용하는지 확인할 수 있도록 도와줍니다.

일일 일정에 따라 자동으로 실행되도록 사전 구성된 AWS CloudFormation 스택을 사용합니다.

사전 요구 사항

이 솔루션을 구현하려면 다음 사전 요구 사항이 필요합니다.

  • 계정에 구성된 AWS Backup
  • Amazon S3 및/또는 Amazon RDS의 복구 지점
    • Amazon RDS 복원의 경우 Amazon RDS 서브넷 그룹 이름을 입력하거나 직접 입력하거나 자동으로 하나가 선택되도록 할 수 있습니다. 프로덕션 VPC에서 복원 테스트를 수행하는 것은 권장되지 않습니다. 대신 테스트 전용 VPC 또는 격리된 VPC를 사용하시기 바랍니다.

AWS CloudFormation 스택 시작하기

이 AWS CloudFormation 템플릿은 Amazon S3 및 Amazon RDS의 자동화된 복원 테스트에 필요한 모든 리소스를 배포합니다.

스택 시작하기

복원 테스트 계획 실행하기

배포가 완료되면 별도의 수동 작업 없이 복원 테스트 계획이 자동으로 실행됩니다. 복원 테스트 계획은 해당 계획에서 선택한 모든 리소스를 대상으로 매일 1회 실행됩니다. 그림 6과 같이 AWS Backup이 복원을 완료하면, Lambda 함수가 자동으로 실행되어 복원 결과를 검증합니다.

검증이 성공적으로 완료되면 그림 10과 같은 결과를 확인할 수 있습니다.

그림 10: AWS Backup 복원 테스트 완료 예시

그림 10: AWS Backup 복원 테스트 완료 예시

정리하기

복원 테스트 계획으로 완료된 모든 복원 리소스는 4시간 후 자동으로 삭제됩니다. Amazon S3 리소스의 경우, 데이터가 포함된 S3 버킷은 수명 주기 규칙이 적용되어 완전히 삭제되기까지 더 많은 시간이 소요될 수 있습니다. 추가 비용 발생을 방지하려면 CloudFormation 스택을 삭제하면 복원 테스트 계획이 삭제되고 추가 테스트가 중지됩니다. 자세한 내용은 CloudFormation 콘솔에서 스택 삭제하기를 참조하세요.

결론

AWS Backup 복원 테스트는 조직의 요구에 맞게 솔루션을 조정할 수 있는 유연하고 확장 가능한 기능입니다. 조직의 정책을 이해하는 것부터 시작하여 AWS Management Console에서 AWS Backup 복원 테스트 기능을 탐색하고 자동화된 테스트를 DR 및 사이버 복원력 전략에 통합하는 방법을 배울 수 있습니다. 환경에서 AWS Backup 복원 테스트를 구현하려면 AWS Backup 문서를 참조하세요. 또한 AWS 솔루션 아키텍트와 협력하여 조직의 요구에 맞는 종합적인 백업 검증 전략을 설계할 수도 있습니다.

결론은 명확합니다: 자동화된 백업 검증은 더 이상 선택 사항이 아니라 현대적인 비즈니스 연속성을 위한 필수 요구 사항입니다. 정기적인 복원 테스트는 내부 정책, 규제 요구 사항 및 사이버 복원력 요건을 충족하는 데 도움이 되며, AWS Backup 복원 테스트 기능은 복구 준비 상태를 보장하기 위한 확장 가능하고 효율적인 솔루션을 제공합니다.

Ion Kim

Ion Kim

김이온 Technical Account Manager는 클라우드 엔지니어 경험을 바탕으로 Enterprise On-Ramp 고객이 AWS 워크로드를 안정적으로 운영할 수 있도록 기술 지원을 포함한 다양한 정보와 서비스를 제공하고 있습니다.