如何以编程方式使用 localstack s3 端点设置 Airflow 1.10 日志记录?

oas*_*olo 5 amazon-s3 kubernetes docker-compose airflow localstack

为了尝试将气流日志记录到 localstack s3 存储桶,对于本地和 kubernetes 开发环境,我按照气流文档记录到 s3。简单介绍一下,localstack是一个本地 AWS 云堆栈,其中包含本地运行的包括 s3 在内的 AWS 服务。

我将以下环境变量添加到我的气流容器中,类似于另一个堆栈溢出帖子,试图登录到我的本地 s3 存储桶。docker-compose.yaml这是我为所有气流容器添加的内容:

       - AIRFLOW__CORE__REMOTE_LOGGING=True
       - AIRFLOW__CORE__REMOTE_BASE_LOG_FOLDER=s3://local-airflow-logs
       - AIRFLOW__CORE__REMOTE_LOG_CONN_ID=MyS3Conn
       - AIRFLOW__CORE__ENCRYPT_S3_LOGS=False
Run Code Online (Sandbox Code Playgroud)

我还将我的 localstack s3 信用添加到airflow.cfg

       - AIRFLOW__CORE__REMOTE_LOGGING=True
       - AIRFLOW__CORE__REMOTE_BASE_LOG_FOLDER=s3://local-airflow-logs
       - AIRFLOW__CORE__REMOTE_LOG_CONN_ID=MyS3Conn
       - AIRFLOW__CORE__ENCRYPT_S3_LOGS=False
Run Code Online (Sandbox Code Playgroud)

此外,我还安装了 apache-airflow[hooks] 和 apache-airflow[s3],尽管根据文档并不清楚真正需要哪一个。

我按照之前的堆栈溢出帖子中的步骤尝试验证 S3Hook 是否可以写入我的 localstack s3 实例:

[MyS3Conn]
aws_access_key_id = foo
aws_secret_access_key = bar
aws_default_region = us-east-1
host = http://localstack:4572    # s3 port. not sure if this is right place for it 
Run Code Online (Sandbox Code Playgroud)

但我明白了botocore.exceptions.NoCredentialsError: Unable to locate credentials

将凭据添加到气流控制台后,如下/admin/connection/edit所示: 在此输入图像描述 这是新的异常,botocore.exceptions.ClientError: An error occurred (InvalidAccessKeyId) when calling the PutObject operation: The AWS Access Key Id you provided does not exist in our records.已返回。其他人也遇到过同样的问题,它可能与网络有关。

无论如何,需要一种编程设置,而不是手动设置。

我能够使用独立的 Python 脚本访问存储桶(使用 boto 显式输入 AWS 凭证),但它需要作为气流的一部分工作。

S3Hook是否有通过添加来MyS3Conn设置主机/端口/凭据的正确方法airflow.cfg

根据airflow s3 hooks 源代码,airflow 似乎尚不支持自定义 s3 URL。但是,根据气流aws_hook 源代码(父级),似乎应该可以设置包括端口的端点_url,并且应该从airflow.cfg.

我可以单独使用 boto 检查并写入 localstack 中的 s3 存储桶。此外,还curl http://localstack:4572/local-mochi-airflow-logs从气流容器返回桶中的内容。并aws --endpoint-url=http://localhost:4572 s3 ls返回Could not connect to the endpoint URL: "http://localhost:4572/"

可能还需要哪些其他步骤才能通过自动设置从 docker 中运行的气流登录到 localstack s3 存储桶,这是否还受支持?

小智 3

我认为你应该使用localhostnotlocalstack作为端点,例如host = http://localhost:4572.

在 Airflow 1.10 中,您可以在每个连接的基础上覆盖端点,但遗憾的是它一次仅支持一个端点,因此您需要使用该连接为所有AWS 挂钩更改它。要覆盖它,请编辑相关连接并在“额外”字段中输入:

{"host": "http://localhost:4572"}
Run Code Online (Sandbox Code Playgroud)

我相信这会解决它吗?