zipファイルの生成からS3にアップロードするまで

言語はPythonを使用。そのため、AWS SDKはboto3を使用します。
ローカルにある複数のファイルをzip圧縮しますが、今回はBytesIO(メモリ上)にzipを生成するため、実際のzipファイルは作成せず、S3にアップロー
ドするサンプルコードを記載します。

from io import BytesIO
import zipfile
import pathlib
from glob import glob
import boto3

s3 = boto3.resource(
  's3',
  aws_access_key_id='your-access-key',
  aws_secret_access_key='your-secret-access-key',
  region_name='your-region-name')
bucket = s3.Bucket('your-bucket')

zip_obj = BytesIO()

target_files = glob(f'dir/*.txt')

with zipfile.ZipFile(zip_obj, 'w', compression=zipfile.ZIP_DEFLATED) as zf:
  for file in target_files:
    file_obj = pathlib.Path(file)
    zf.write(file, arcname=file_obj.name)

zip_obj.seek(0)

bucket.upload_fileobj(zip_obj, 'your-zip-key-name.zip')

注目はこちらの1行です。

zip_obj.seek(0)

この1行がないと、思ってたzipファイルは生成されないので注意が必要です。

ついでなので、ダウンロードからzip解凍まで記載します。
こちらもzipファイル自体をローカルに作ることはありません。

s3_obj = bucket.Object('your-zip-key-name.zip').get()

with zipfile.ZipFile(BytesIO(s3_obj['Body'].read())) as zf:
  zf.extractall('target-local-dir/')

こっちは簡単ですね笑


この記事が気に入ったらサポートをしてみませんか?