はじめに
公式ナレッジAmazon S3 にアップロードされたオブジェクトの整合性を確認する方法を教えてください。をPython3で実装したものになります。
コード
import hashlib
import boto3
from botocore.exceptions import ClientError
from base64 import b64encode
upload_file_path = 'sample.zip'
s3_bucket_name = 'sample_bucket'
s3_object_key = 'sample.zip'
h = hashlib.new('md5')
file_read_size = h.block_size * (1024 ** 2)
with open(upload_file_path, 'rb') as f:
read_bytes = f.read(file_read_size)
while read_bytes:
h.update(read_bytes)
read_bytes = f.read(file_read_size)
f.seek(0)
try:
boto3.client('s3').put_object(
Body=f,
Bucket=s3_bucket_name,
ContentMD5=b64encode(h.digest()).decode("ascii"),
Key=s3_object_key,
)
except ClientError as e:
# ハッシュ不一致時のエラー処理
if e.response['Error']['Code'] == 'BadDigest':
print(e.response['Error']['Message'])
else:
raise
制限事項など
- 5GBを超えていて、マルチパートアップロードが必要となるファイルには対応できません。
参考
ファイルのハッシュを計算するコードはこちらの記事を流用しました。