【问题标题】:S3_delete_objects_operator does not delete files in the bucketS3_delete_objects_operator 不删除存储桶中的文件
【发布时间】:2021-01-07 17:32:20
【问题描述】:

我已经实现了 S3DeleteObjectsOperator,但即使任务显示键已成功删除,实际上该对象并没有从 S3 存储桶中删除。

delete_s3bucket_files = S3DeleteObjectsOperator(
  task_id='delete_s3bucket_files',
  start_date=start_date,
  bucket='****',
  keys='******************',
  aws_conn_id='aws_default',
)

即使任务已通过完成,它也不会删除存储桶中指定键内的对象。我可以看到下面的日志:

[2019-09-26 14:19:15,554] {base_task_runner.py:101}INFO - Job 1435: Subtask delete_s3bucket_files [2019-09-26 14:19:15,553] {cli.py:517} INFO - Running <TaskInstance: test_s3_delete.delete_s3bucket_files 2019-09-26T12:18:59.362470+00:00 [running]> on host Saurav-macbook.local
[2019-09-26 14:19:15,883] {s3_delete_objects_operator.py:83} INFO - Deleted: ['******************']

我如何了解任务正在执行什么以及为什么对象没有被删除?

【问题讨论】:

  • [1] 确实需要S3DeleteObjectOperator,因为S3Hook 已经公开了delete_objects() method(您可以在python_callable 中调用它) PythonOperator)? [2] 这看起来不像是Airflow 问题;而是 python / botocore / boto3 环境问题或 AWS 权限(credentials-profile / IAM 角色)问题。您是否通过Python shell(与Airflow 在同一台机器上)运行代码来检查是否能够完成相同的删除功能?
  • 谢谢,我也尝试了 S3Hook delete_objects() 方法,但无法删除文件。相反,我只是使用 boto3 delete() 方法来删​​除对象

标签: amazon-s3 airflow


【解决方案1】:

我无法使用S3DeleteObjectOperator 以及S3Hook 中的delete_objects() 方法来删​​除对象。所以我改为使用boto3 delete() 方法来删​​除对象。

def delete_files():
  s3 = boto3.resource('s3', aws_access_key_id='****', aws_secret_access_key='******************')
  s3_bucket = s3.Bucket('****')
  s3_bucket.objects.all().delete()


delete_s3bucket_files = PythonOperator(
  task_id='delete_s3bucket_files',
  start_date=start_date,
  python_callable=delete_files,
  dag=dag
)

不确定这是否是正确的做法,但目前对我有用。

【讨论】:

  • [1] 您确定在default aws-conn 中正确设置了凭据(aws_secret_access_key_idaws_secred_access_key)吗?就我个人而言,我更喜欢使用附加到 EC2 机器上的 IAM RolesAirflow 任务正在其上运行以获取授权而不是凭据。 [2] 另一件事是,这可能是区域问题,因为 S3_Hook 没有通过任何区域,而 instantiating s3_client
【解决方案2】:

我也面临同样的问题,比如 dag 正在取得成功,但分区仍然存在。 最后,我发现我没有正确传递密钥 像 x 是您的存储桶名称,对象为 y/year/2021/07 所以, 桶='x' 键='y/年/2021/07' 您必须在 不带 s3://x 的键中传递对象的完整路径, 之后就可以正常使用了

delete_s3bucket_files = S3DeleteObjectsOperator(  task_id='delete_s3bucket_files',bucket='x',keys='y/year/2021/07',aws_conn_id='aws_default',dag=dag)

【讨论】:

    猜你喜欢
    • 2017-02-01
    • 2018-05-16
    • 2015-06-23
    • 2018-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多