所以我尝试在我的 Airflow dag 中设置 S3Hook,通过在我的脚本中以编程方式设置连接,如下所示
from airflow.hooks.S3_hook import S3Hook
from airflow.models import Connection
from airflow import settings
def s3_test_hook():
conn = Connection(
conn_id='aws-s3',
conn_type='s3',
extra={"aws_access_key_id":aws_key,
"aws_secret_access_key": aws_secret},
)
我可以毫无问题地运行 conn
行,这告诉我可以建立连接。 aws_key
和 aws_secret
通过 dotenv 使用我本地目录中的 .env 文件加载。
但是,当我运行函数中的接下来两行时:
s3_hook = S3Hook(aws_conn_id='aws-s3')
find_bucket = s3_hook.check_for_bucket('nba-data')
检查我知道存在的存储桶。我收到此错误
NoCredentialsError: Unable to locate credentials
关于如何解决这个问题有什么想法吗?
谢谢!
最佳答案
在您的代码中,您创建了一个 Airflow Connection
对象,但这本身并不执行任何操作。当一个钩子(Hook)被赋予一个连接ID时,它将在不同的位置查找给定的ID(按此顺序):
- secret 后端(如果已配置)
- 环境变量
AIRFLOW_CONN_*
- Airflow 元存储
您的连接目前仅在代码中定义,但 Airflow 无法在上述三个位置中的任何一个位置找到它。
Airflow 文档提供了一些配置 AWS 连接的指导:https://airflow.apache.org/docs/apache-airflow-providers-amazon/stable/connections/aws.html
关于python - 无法找到通过环境变量设置 Airflow 连接的凭据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70406951/