气流:每日刷新后如何在 s3 存储桶中公开对象

Posted

技术标签:

【中文标题】气流:每日刷新后如何在 s3 存储桶中公开对象【英文标题】:Airflow: How to make an object public in s3 bucket after daily refresh 【发布时间】:2019-08-27 10:18:25 【问题描述】:

我每天都在删除和创建相同的文件(s3 对象),并且该文件需要由不同公司的供应商访问。每次运行后,该对象默认为私有。 有没有办法自动将此存储桶对象设置为公共或将某些 IP 列入白名单?我正在使用气流。

在气流中搜索文档但没有帮助

    某些操作员将存储桶公开或 某些运营商将 ip 列入白名单

【问题讨论】:

【参考方案1】: 我认为这并不是真正的 Airflow 查询,而更像是 AWS SDK / boto3 查询 Airflow 本身没有OperatorHook 具有上述功能;你必须编写一些代码来实现这一点
你可以通过boto3的S3 Client(也就是used by Airflow's S3Hook)来实现这个 尤其可以利用put_object_acl(..)方法

这是一个示例代码-sn-p

import boto3
from botocore.client import BaseClient
s3_client: BaseClient = boto3.client("s3", region_name="ap-southeast-1")
s3_client.put_object_acl(ACL="public-read", Bucket="my-bucket", Key="key/of/my/object")

为了在 Airflow 任务中实现上述 code-sn-p,有几个选项

    只需使用PythonOperator/您正在使用的任何其他运算符,并将上述代码-sn-p 嵌入到您的其余代码中(最简单) 写一个 CustomS3Hook 扩展 Airflow 的 S3Hook 并将这个功能放在那里(从可重用性的角度来看很好,但有点矫枉过正) 将此 sn-p 放入某个 aws_utils.py 文件中,并在需要时在您的工作流程中使用它(可重复使用,并且不太复杂)

【讨论】:

以上是关于气流:每日刷新后如何在 s3 存储桶中公开对象的主要内容,如果未能解决你的问题,请参考以下文章

当唯一的区别是标签时,如何在两个s3桶之间同步对象

列出具有公共读取权限的 S3 对象(在私有存储桶中)

如何使用 Java 列出存储桶中的所有 AWS S3 对象

如何知道我在 S3 存储桶中存储了多少对象?

如何删除/计算 s3 存储桶中的对象?

如何强制删除 S3 存储桶中的所有对象版本,然后最终使用 aws-sdk-go 删除整个存储桶?