NodeJS 通过单个lambda函数将托管在s3中的文件内容解压缩到多个cloudfront url

hivapdat  于 2022-11-22  发布在  Node.js
关注(0)|答案(1)|浏览(125)

有没有什么特定的方法可以通过触发lambda一次来将单个文件内容从s3解压缩到多个cloudfront url。
假设有一个包含多个jpg/ png文件的zip文件已经上传到s3。目的是只运行一次lambda函数来解压缩所有文件内容,并使它们在多个cloudfront url中可用。
在s3存储桶中

archive.zip
   a.jpg
   b.jpg
   c.jpg

穿过云层

https://1232.cloudfront.net/a.jpg
https://1232.cloudfront.net/b.jpg
https://1232.cloudfront.net/c.jpg

我正在寻找一个解决方案,使lambda函数触发函数调用每当S3上传发生,并使所有文件可在zip通过cloudfront多个url。

sqxo8psd

sqxo8psd1#

你好,巴拉塔帕拉米什瓦,
我想你可以这样解决你的问题:

  • 首先你需要提取你的zip文件
  • 几秒钟后你再把它们上传到S3。

下面是lambda python函数:

import json
import boto3
from io import BytesIO
import zipfile

def lambda_handler(event, context):
    # TODO implement
    
    s3_resource = boto3.resource('s3')
    source_bucket = 'upload-zip-folder'
    target_bucket = 'upload-extracted-folder'

    my_bucket = s3_resource.Bucket(source_bucket)

    for file in my_bucket.objects.all():
        if(str(file.key).endswith('.zip')):
            zip_obj = s3_resource.Object(bucket_name=source_bucket, key=file.key)
            buffer = BytesIO(zip_obj.get()["Body"].read())
            
            z = zipfile.ZipFile(buffer)
            for filename in z.namelist():
                file_info = z.getinfo(filename)
                try:
                    response = s3_resource.meta.client.upload_fileobj(
                        z.open(filename),
                        Bucket=target_bucket,
                        Key=f'{filename}'
                    )
                except Exception as e:
                    print(e)
        else:
            print(file.key+ ' is not a zip file.')

希望这能对你有所帮助

相关问题