S3 Glacier 데이터 백업

coille·2023년 8월 29일
0

AWS S3 Glacier를 활용한 데이터 백업
PowerShell과 Python을 사용하여 데이터를 백업하는 시도하였고, 결론은 Python으로 진행하여 성공.

PowerShell로 진행하다 실패

우선, PowerShell을 이용하여 S3 Glacier에 데이터를 백업하는 시도를 해보았습니다. 다양한 명령어와 설정을 시도하였으나, 업로드 초기화 단계에서 MissingParameterValueException 오류와 부분 업로드 과정에서 발생한 Invalid Content-Length 오류로 인해 업로드가 실패하였고, 최종적으로는 성공하였지만 단계가 복잡하여 python으로 진행하기로함.

Python으로 진행하여 성공

이후 Boto3 라이브러리를 활용하여 Python 스크립트를 작성하여 S3 Glacier에 데이터를 백업하는 시도를 성공.
아래는 성공한 과정을 요약한 내용입니다.

1.AWS 클라이언트 설정 및 Glacier 저장소 확인 및 생성
2.compute_tree_hash 함수를 활용한 TreeHash 계산
3.멀티파트 업로드 초기화 및 Upload ID 획득
4.파일을 적절한 크기로 분할하여 각 부분 업로드
5.전체 파일의 TreeHash 계산
6.멀티파트 업로드 완료 요청 및 결과 확인

import boto3
import os
import math
import hashlib

# 초기 설정
file_path = "E:\\백업용\\PB.zip"
file_size = os.path.getsize(file_path)
vault_name = "PB-Backup"
part_size = 1073741824  # 바이트 단위로 설정
archive_description = "PB Backup"  # archiveDescription 변수로 처리

# AWS 클라이언트 설정
client = boto3.client('glacier')

# Glacier 저장소 확인 및 생성
print("Glacier 저장소 확인 중...")
vault_list = [vault['VaultName'] for vault in client.list_vaults()['VaultList']]
if vault_name not in vault_list:
    print(f"{vault_name} 저장소가 없습니다. 생성 중...")
    client.create_vault(vaultName=vault_name)
    print(f"{vault_name} 저장소 생성 완료!")
else:
    print(f"{vault_name} 저장소가 이미 존재합니다.")

def compute_tree_hash(file_path):
    """
    주어진 파일 경로에 대한 TreeHash를 계산합니다.
    """
    hashes = []
    with open(file_path, 'rb') as f:
        while True:
            chunk = f.read(1024*1024)  # 1MB chunks
            if not chunk:
                break
            hashes.append(hashlib.sha256(chunk).digest())

    while len(hashes) > 1:
        temp_hashes = []
        for i in range(0, len(hashes), 2):
            if i + 1 < len(hashes):
                combined_hash = hashlib.sha256(hashes[i] + hashes[i+1]).digest()
            else:
                combined_hash = hashes[i]
            temp_hashes.append(combined_hash)
        hashes = temp_hashes

    return hashes[0].hex()

# 멀티파트 업로드
print("멀티파트 업로드 시작...")
response = client.initiate_multipart_upload(
    vaultName=vault_name,
    archiveDescription=archive_description,
    partSize=str(part_size)
)

upload_id = response['uploadId']

print(f"업로드 ID: {upload_id}")

# 파일 분할 및 업로드
for i in range(math.ceil(file_size / part_size)):
    start_byte = i * part_size
    end_byte = min((i+1) * part_size - 1, file_size - 1)

    print(f"{i+1}번째 파트 업로드 시작...")

    with open(file_path, 'rb') as f:
        f.seek(start_byte)
        data = f.read(end_byte - start_byte + 1)
        response = client.upload_multipart_part(
            vaultName=vault_name,
            uploadId=upload_id,
            range='bytes {}-{}/{}'.format(start_byte, end_byte, file_size),
            body=data
        )

    print(f"{i+1}번째 파트 업로드 완료!")

print("전체 파일의 TreeHash 계산 시작...")
final_tree_hash = compute_tree_hash(file_path)

print(f"계산된 TreeHash: {final_tree_hash}")

print("멀티파트 업로드 완료 요청 시작...")
response = client.complete_multipart_upload(
    vaultName=vault_name,
    uploadId=upload_id,
    archiveSize=str(file_size),
    checksum=final_tree_hash
)

archive_id = response['archiveId']
print(f"업로드 완료! 아카이브 ID: {archive_id}")

# 업로드 완료 후 확인
print("업로드 확인 중...")
response = client.describe_vault(vaultName=vault_name)
print(f"저장소 이름: {response['VaultName']}")
print(f"아카이브 개수: {response['NumberOfArchives']}")
print(f"총 크기: {response['SizeInBytes']} 바이트")
코드를 입력하세요

유용한 자료

결론

AWS S3 Glacier를 활용한 데이터 백업을 진행한 내용이고, PowerShell과 Python을 통한 업로드 시도 결과를 나타냈습니다. Python의 Boto3 라이브러리를 사용하여 데이터 업로드를 성공적으로 마친 후, 추가 정보를 위해 관련 문서와 자료들을 참고하기를 권장합니다.

profile
Technical Project Manager / DevOps Engineer / System Engineer

0개의 댓글