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
我认为你应该使用localhost
notlocalstack
作为端点,例如host = http://localhost:4572
.
在 Airflow 1.10 中,您可以在每个连接的基础上覆盖端点,但遗憾的是它一次仅支持一个端点,因此您需要使用该连接为所有AWS 挂钩更改它。要覆盖它,请编辑相关连接并在“额外”字段中输入:
{"host": "http://localhost:4572"}
Run Code Online (Sandbox Code Playgroud)
我相信这会解决它吗?