2019年2月23日土曜日

Lamda でS3のファイルをZIP圧縮


S3のファイルをダウンロードして圧縮し、S3にアップロードするLambda(paython3.6)のソースコードです。

# coding: utf-8

import boto3
import zipfile

S3_BUCKET = 'blue21.local'
S3_KEY = 'sample.dat'

def lambda_handler(event, context):

    print(event)

    # download
    s3 = boto3.client('s3')
    response = s3.get_object(Bucket=S3_BUCKET, Key=S3_KEY)
    body = response['Body'].read()
    bodystr = body.decode('utf-8')

    # zip
    zip_path = '/tmp/%s.zip' % S3_KEY
    zf = zipfile.ZipFile(zip_path, mode="w", compression=zipfile.ZIP_DEFLATED)
    zf.writestr(S3_KEY, bodystr)
    zf.close()

    # upload
    upload_path = '%s.zip' % S3_KEY
    s3 = boto3.resource('s3')
    bucket = s3.Bucket(S3_BUCKET)
    bucket.upload_file(zip_path, upload_path)

    return {
        "status": "ok"
    }


Lambdaの /tmp  は 512MB 制限があるので、S3からファイルをダウンロードして /tmpに保存するのはやめました。
S3のファイルのデータを変数に取り込んで、ZIP圧縮しています。