AWS lambda读取zip文件执行验证并解压到s3存储桶(如果验证通过)

2023-12-30

我有一个 zip 文件到达 s3 存储桶的要求,我需要使用 python 编写一个 lambda 来读取 zip 文件,执行一些验证并在另一个 S3 存储桶上解压缩。

Zip 文件包含以下内容:

a.csv b.csv c.csv trigger_file.txt

trigger_file.txt -- 包含 zip 中的文件名称和记录计数(例如: a.csv:120 、 b.csv:10 、 c.csv:50 )

因此,如果将解压缩传递到 s3 存储桶,使用 lambda 我需要读取触发器文件,检查 zip 文件夹中的文件数量是否等于触发器文件中提到的文件数量。

我准备了以下代码:

def write_to_s3(config_dict):
    inp_bucket = config_dict["inp_bucket"]
    inp_key = config_dict["inp_key"]
    out_bucket = config_dict["out_bucket"]
    des_key = config_dict["des_key"]
    processed_key = config_dict["processed_key"]

    obj = S3_CLIENT.get_object(Bucket=inp_bucket, Key=inp_key)
    putObjects = []
    with io.BytesIO(obj["Body"].read()) as tf:
        # rewind the file
        tf.seek(0)

    # Read the file as a zipfile perform transformations and process the members
    with zipfile.ZipFile(tf, mode='r') as zipf:
        for file in zipf.infolist():
            fileName = file.filename
            print("file name before while loop :",fileName)
            try:
                found = False
                while not found :
                    if fileName == "Trigger_file.txt" :
                        with zipf.open(fileName , 'r') as thefile:
                            my_list = [i.decode('utf8').split(' ') for i in thefile]
                            my_list = str(my_list)[1:-1]
                            print("my_list :",my_list)
                            print("fileName :",fileName)
                            found = True
                            break
                            thefile.close()
                    else:
                        print("Trigger file not found ,try again")
            except Exception as exp_handler:
                    raise exp_handler

            if 'csv' in fileName :
                try:
                    if fileName in my_list:
                        print("Validation Success , all files in Trigger file  are present procced for extraction")
                    else:
                        print("Validation Failed")
                except Exception as exp_handler:
                    raise exp_handler

    # *****FUNCTION TO UNZIP ********


def lambda_handler(event, context):
    try:
        inp_bucket = event['Records'][0]['s3']['bucket']['name']
        inp_key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
        config_dict = build_conf_obj(os.environ['config_bucket'],os.environ['config_file'], os.environ['param_name'])
        write_to_s3(config_dict)
    except Exception as exp_handler:
        print("ERROR")

一切都很顺利,我面临的唯一问题是验证部分,我认为 while 循环是错误的,因为它正在进入无限循环。

期待:

如果找到,则在 zip 文件夹中搜索trigger_file.txt,然后打破循环进行验证并将其解压缩到 s3 文件夹。如果没有找到继续搜索直到字典结束。

错误输出(超时):

Response:
{
  "errorMessage": "2020-06-16T20:09:06.168Z 39253b98-db87-4e65-b288-b585d268ac5f Task timed out after 60.06 seconds"
}

Request ID:
"39253b98-db87-4e65-b288-b585d268ac5f"

Function Logs:
 again
Trigger file not found ,try again
Trigger file not found ,try again
Trigger file not found ,try again
Trigger file not found ,try again
Trigger file not found ,trEND RequestId: 39253b98-db87-4e65-b288-b585d268ac5f
REPORT RequestId: 39253b98-db87-4e65-b288-b585d268ac5f  Duration: 60060.06 ms   Billed Duration: 60000 ms   Memory Size: 3008 MB    Max Memory Used: 83 MB  Init Duration: 389.65 ms    
2020-06-16T20:09:06.168Z 39253

在代码中的以下 while 循环中,如果fileName is not "Trigger_file.txt",陷入无限循环。

found = False
while not found:
    if fileName == "Trigger_file.txt":
        with zipf.open(fileName , 'r') as thefile:
            my_list = [i.decode('utf8').split(' ') for i in thefile]
            my_list = str(my_list)[1:-1]
            print("my_list :",my_list)
            print("fileName :",fileName)
            found = True
            break
            thefile.close()
    else:
        print("Trigger file not found ,try again")

我认为你可以替换你的一部分write_to_s3功能代码由以下代码组成:

def write_to_s3(config_dict):

    ######################
    #### Do something ####
    ######################    

    # Read the file as a zipfile perform transformations and process the members
    with zipfile.ZipFile(tf, mode='r') as zipf:
        found = False
        for file in zipf.infolist():
            fileName = file.filename
            if fileName == "Trigger_file.txt":
                with zipf.open(fileName, 'r') as thefile:
                    my_list = [i.decode('utf8').split(' ') for i in thefile]
                    my_list = str(my_list)[1:-1]
                    print("my_list :", my_list)
                    print("fileName :", fileName)
                    found = True
                    thefile.close()
                    break

        if found is False:
            print("Trigger file not found ,try again")
            return

        for file in zipf.infolist():
            fileName = file.filename
            if 'csv' in fileName:
                if fileName not in my_list:
                    print("Validation Failed")
                    return

        print("Validation Success , all files in Trigger file  are present procced for extraction")

    # *****FUNCTION TO UNZIP ********
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AWS lambda读取zip文件执行验证并解压到s3存储桶(如果验证通过) 的相关文章

随机推荐

  • 验证 Spring Web 应用程序配置的最佳实践

    我希望我的基于 Spring 的 Web 应用程序能够validate它在启动期间的配置 这意味着例如 检查是否所需文件夹存在并且可读 可写 检查是否符合要求配置键已设定且一致 检查任何其他约束这是正确运作所必需的 您如何执行这些检查和no
  • 如何从 Quart 获取事件循环

    你好 我对 Python 相当陌生 我正在尝试将 Flask 上的现有应用程序转换为 Quart https gitlab com pgjones quart https gitlab com pgjones quart 它应该构建在 as
  • 使用 SVM 进行实时面部表情分类

    我目前正在开发一个项目 我必须提取用户的面部表情 一次只能从网络摄像头提取一个用户 例如悲伤或快乐 我对面部表情进行分类的方法是 使用opencv检测图像中的人脸 使用ASM和stasm获取面部特征点 现在我正在尝试进行面部表情分类 SVM
  • LNK2019 错误 C++ 无法解析的外部符号

    我收到这些错误消息 错误1错误LNK2019 未解决 外部符号 public void thiscall ArrayIntStorage sortOwn void sortOwn ArrayIntStorage QAEXXZ 函数中引用 m
  • 莱斯的教学目的?

    目的是什么les汇编指令 为什么我们需要加载es部分and寄存器 书中给出了以下例子 les bx p Load p into ES BX mov es bx al Store away AL 为什么我们需要加载es and bx在这种情况
  • node.js 检查远程 URL 是否存在

    如何在不下拉的情况下检查 URL 是否存在 我使用以下代码 但它会下载整个文件 我只需要检查它是否存在 app get api v1 urlCheck function req res var url req query url var r
  • 如何在具有隔离范围的指令中侦听站点范围的事件

    我正在使用具有隔离范围的指令在 angularjs 中创建自定义图表小部件 这个想法是 每个小部件在收到有关如何创建自身的基本配置信息后应该能够独立存在 该小部件将通过侦听 update data 事件与应用程序的其他部分进行通信 当事件被
  • 如何在 SQLite 中插入具有唯一 ID 的重复行?

    这看起来很简单 我想在 SQLite 表中复制一行 INSERT INTO table SELECT FROM table WHERE rowId 5 如果没有显式的唯一列声明 则该语句将起作用 但声明了表的第一列rowID INTEGER
  • 使用ActionCable,多种识别方式

    我使用 ActionCable 开发 Ruby on Rails 5 1 应用程序 通过 Devise 进行用户身份验证 https rubytutorial io actioncable devise authentication 适用于
  • Intellij 调试 Docker 容器不断给我 IO 异常握手失败

    我正在尝试在 Intellij v2020 1 中设置远程调试器 但不断收到以下错误 无法打开调试器端口 localhost 5005 java io IOException 握手失败 连接过早关闭 在我的 docker compose 文
  • 是否可以在cmake中不生成ALL_BUILD项目?

    我不需要 ALL BUILD 子项目 我可以避免生成它吗 谢谢 CMake 问题 16979 正在生成 ALL BUILD 目标 https gitlab kitware com cmake cmake issues 16979 The A
  • Facebook Graph API gem

    我想在我的 Rails 应用程序中使用 Facebook 图形 API 与 FB 图形 API 一起使用的推荐 gem 是什么 Thanks 这是一个写得很好的 FB 图形支持 Ruby https github com nov fb gr
  • 在 SSRS 中复制并粘贴表 (tablix)

    我有一个包含一天数据的 tablix 我需要在底部有相同的数据 但在 3 个不同的行中 我想在底部复制主要日期表 3 次 然后为每个表使用不同的数据集 我尝试复制 tablix 并将其粘贴到Body在 tablix 下方 但出现以下错误 报
  • C#:将数组分配给另一个数组:复制还是指针交换?

    抱歉问这个问题 我一直在谷歌上搜索了一下 但似乎出现的是对克隆或复制方法的引用 而不是我的问题的实际答案C 我有两个字节数组 它们正在被两个线程访问 private byte buffer1 new byte size private by
  • 如何使用 python 读取 CSV 文件时跳过空白行

    这是我的代码 我可以打印每一行 但是当出现空白行时 它会打印 由于CSV文件格式 所以我想在出现空行时跳过 import csv import time ifile open C Users BKA4ABT Desktop Test Spe
  • 如何将输出的 Fortran 二进制 NxNxN 矩阵读入 Python

    我用 Fortran 写出了一个矩阵 如下所示 real kind kind 0 0d0 dimension 256 256 256 dense CALCULATION inquire iolength reclen dense open
  • 如何在不不断扫描的情况下检测目录或文件何时发生更改

    除了读取所有文件并将它们与以前的快照进行比较之外 有没有办法在 Windows 中的 C 中检测目录何时发生更改 如果需要的话 我不介意 PInvoke EDITFileSystemWatcher 类很棒 但有一个问题是您必须启动后台任务
  • 一对一字段 Django 管理员

    编辑为使用一对一字段 我想将建筑物的面积添加到 django modeladmin 中 表结构是 class Area models Model id models IntegerField Buildings db column id a
  • Kubernetes Nginx Ingress 删除部分 URL

    我正在 Kubernetes 在 AKS 上 部署一个简单的应用程序 该应用程序位于使用 Nginx 的 Ingress 后面 并使用 Nginx helm 图表进行部署 我遇到一个问题 由于某种原因 Nginx 似乎没有将完整的 URL
  • AWS lambda读取zip文件执行验证并解压到s3存储桶(如果验证通过)

    我有一个 zip 文件到达 s3 存储桶的要求 我需要使用 python 编写一个 lambda 来读取 zip 文件 执行一些验证并在另一个 S3 存储桶上解压缩 Zip 文件包含以下内容 a csv b csv c csv trigge