我有一个s3 bucket,它有4个文件夹,其中一个是input/。在my airflow DAG之后,py代码末尾有几行代码试图删除input/中的所有文件。
response_keys = self._s3_hook.delete_objects(bucket=self.s3_bucket, keys=s3_input_keys)
deleted_keys = [x['Key'] for x in response_keys.get("Deleted", []) if x['Key'] not in ['input/']]
self.log.info("Deleted: %s", deleted_keys)
if "Errors" in response_keys:
errors_keys = [x['Key'] for x in response_keys.get("Errors", [])]
raise AirflowException("Errors when deleting: {}".format(errors_keys))
现在,这有时会删除所有文件,有时还会删除目录本身。我不知道它为什么要删除,尽管我已经明确排除了同样的内容。
有没有其他方法可以尝试实现删除?
PS我试过使用BOTO,但AWS有一个安全机制,不会让两者都访问bucket。所以胡克就是我的全部。请帮助
目录在Amazon S3中不存在。相反,对象的Key
(文件名(包含完整路径。例如,Key可能是invoices/january.xls
,其中包括路径。
当在路径中创建对象时,目录会神奇地出现。如果一个目录中的所有对象都被删除了,那么这个目录就会神奇地消失(因为它从未真正存在过(。
但是,如果您在AmazonS3管理控制台中单击创建文件夹按钮,则会使用目录名称创建一个零字节对象。这将强制目录"出现",因为该路径中有一个对象。但是,该目录实际上并不存在!
因此,Airflow作业可能会删除给定路径中的所有对象,从而导致目录消失。这很好,没什么好担心的。但是,如果使用"创建文件夹"按钮创建文件夹,则在删除所有对象时,文件夹仍将存在(假设删除操作不会同时删除零长度对象(。