如何将Minio连接添加到Airflow连接?

6
我正在尝试将MinIO的运行实例添加到Airflow连接中,我认为这应该像GUI中的这个设置一样简单(暴露的凭据不要紧,这是被封锁的环境,之后会更改): {{link1:enter image description here}} Airflow和minio都在Docker容器中运行,它们都使用相同的Docker网络。按下测试按钮会导致以下错误: “测试连接时发生了'ClientError'错误:调用GetCallerIdentity操作时发生了一个错误(InvalidClientTokenId):请求中包含的安全令牌无效。” 我想知道我错过了什么。想法是设置这个连接,然后使用一个桶来进行数据感知调度(=我想在有人上传文件到桶时立即触发一个DAG)。

我也遇到了错误“在测试连接时发生'ClientError'错误: 调用GetCallerIdentity操作时发生错误(InvalidClientTokenId): 请求中包含的安全令牌无效。”......但是,下面两个答案都没有提到如何解决这个令牌相关问题或如何获取这个令牌。所以@Roland,你找到了有关令牌的错误的解决方案吗?请问是否有人可以帮我解决这个问题? - Ashish Karpe
对我来说,连接测试显示了你所说的错误消息,但我仍然能够使用Minio和所有操作。这个测试对于Minio来说是错误的,不是吗?如果我错了,请纠正我。 - kalaLokia
4个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
0

我在使用Airflow 2.5.0时也遇到了这个错误。

我已经找到了一个解决方法,使用内置的boto3库。

首先,我使用以下参数创建了连接:

连接ID:任何标签(我的情况下是Minio)

连接类型:通用

主机:minio服务器IP和端口

登录:Minio访问密钥

密码:Minio秘密密钥

以下是我的代码:

import boto3
from airflow.hooks.base import BaseHook

conn = BaseHook.get_connection('Minio')

s3 = boto3.resource('s3',
                     endpoint_url=conn.host,
                     aws_access_key_id=conn.login,
                     aws_secret_access_key=conn.password
)
s3client = s3.meta.client 

#and then you can use boto3 methods for manipulating buckets and files
#for example:

bucket = s3.Bucket('test-bucket')
# Iterates through all the objects, doing the pagination for you. Each obj
# is an ObjectSummary, so it doesn't contain the body. You'll need to call
# get to get the whole body.
for obj in bucket.objects.all():
    key = obj.key

你好,感谢抽出时间回答! :) 但是,这个答案提到了使用 boto,它可以用于收集存储桶通知,但我正在寻找一种在数据感知的情况下以一般方式触发Airflow管道的解决方案,而不需要在Airflow上编写任何实际访问代码。根据文档,理论上应该是可能的。 - Roland Deschain

0

我也遇到了同样的问题,在网页上输入连接详细信息后无法测试连接。似乎连接在DAG运行期间有效,但在Web UI中测试连接失败,Airflow Amazon提供商的Wiki页面中也发现了同样的问题。

重大变更警告

在此版本的Amazon S3连接提供程序(conn_type="s3")中已删除,因为它始终是AWS连接的别名conn_type="aws"。实际上,唯一的影响是您将无法在Web UI / API中测试连接。为了恢复测试连接的功能,您需要手动将连接类型从Amazon S3(conn_type="s3")更改为Amazon Web Services(conn_type="aws")。


0
晚了,但如果有人遇到连接问题: 即使测试连接失败,您仍然可以运行您的DAG。如果您使用的是Mac或Windows,并且您的服务在默认桥接网络上,则应使用docker内部地址主机IP解析或获取容器IP地址(不建议使用,因为它是动态的)。 确保AWS Access Key Id和AWS Secret Access Key字段都为空,只提供额外的字段。 这是额外字段的示例详细信息: { "aws_access_key_id": "xxxxxxx", "aws_secret_access_key": "xxxxxx", "endpoint_url": "http://host.docker.internal:9000" } 请注意,endpoint_url可以替换为host。 此外,我假设您的airflow和minio正在默认桥接网络上运行,-p 9000:9000,并且在同一个docker-compose.yaml文件中或者像这样一起指定:docker-compose -f apache_file.yaml -f minio_file.yaml up。 如果它们位于用户定义的桥接网络上,则无法使用host.docker.internal,您将需要使用minio容器名称/应用程序名称/定义静态地址。您可以选择发布端口,也可以只是暴露端口。 如果它们位于不同的用户定义的桥接网络上,则您正在进行比我能在此处解释的更复杂的操作。 如果minio不在docker中,那么你需要获取主机的IP地址和端口(127.0.0.1:9000)。 如果你在云上运行你的设置,比如EC2,那么你需要使用一个用户定义的桥接网络。

0
我也遇到了端点URL拒绝连接的问题。我所做的是实际上在Docker容器中运行,因此我们应该提供Docker主机URL。 { "aws_access_key_id":"your_minio_access_key", "aws_secret_access_key": "your_minio_secret_key", "host": "http://host.docker.internal:9000" }

enter image description here


不太确定你所说的“what I have done is the is actually running in the docker container”是什么意思,但是正如我在问题中提到的那样,Airflow和Minio都在同一网络中的Docker容器中运行,我设置的地址是容器的内部地址(minio:9000)。在外部,我将两个容器分别暴露到不同的端口。 - Roland Deschain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,