Airflow 连接id不是';t定义
我正在学习气流,并试图了解连接是如何工作的 我有一个具有以下代码的第一个dag:Airflow 连接id不是';t定义,airflow,Airflow,我正在学习气流,并试图了解连接是如何工作的 我有一个具有以下代码的第一个dag: c = Connection( conn_id='aws_credentials', conn_type='Amazon Web Services', login='xxxxxxxx', password='xxxxxxxxx' ) def list_keys(): hook = S3Hook(aws_conn_id=c.conn_id) logging.info
c = Connection(
conn_id='aws_credentials',
conn_type='Amazon Web Services',
login='xxxxxxxx',
password='xxxxxxxxx'
)
def list_keys():
hook = S3Hook(aws_conn_id=c.conn_id)
logging.info(f"Listing Keys from {bucket}/{prefix}")
keys = hook.list_keys(bucket, prefix=prefix)
for key in keys:
logging.info(f"- s3://{bucket}/{key}")
在这种情况下,它运行良好。连接良好地传递到S3挂钩
然后我有第二个dag:
redshift_connection = Connection(
conn_id='redshift',
conn_type='postgres',
login='duser',
password='xxxxxxxxxx',
host='xxxxxxxx.us-west-2.redshift.amazonaws.com',
port=5439,
schema='db'
)
aws_connection = Connection(
conn_id='aws_credentials',
conn_type='Amazon Web Services',
login='xxxxxxxxx',
password='xxxxxxxx'
)
def load_data_to_redshift(*args, **kwargs):
aws_hook = AwsHook(aws_connection.conn_id)
credentials = aws_hook.get_credentials()
redshift_hook = PostgresHook(redshift_connection.conn_id)
sql_stmnt = sql_statements.COPY_STATIONS_SQL.format(aws_connection.login, aws_connection.password)
redshift_hook.run(sql_stmnt)
dag = DAG(
's3_to_Redshift',
start_date=datetime.datetime.now()
)
create_table = PostgresOperator(
task_id='create_table',
postgres_conn_id=redshift_connection.conn_id,
sql=sql_statements.CREATE_STATIONS_TABLE_SQL,
dag=dag
)
此dag返回以下错误:未定义连接id
redshift
为什么呢?我的第一个和第二个dag之间有什么区别?为什么连接在第一个示例中有效,而在第二种情况下无效
谢谢 连接通常使用所述的UI或CLI创建,并由数据库后端中的Airflow存储。然后,操作符和相应的钩子将连接ID作为参数,并使用它检索这些连接的用户名、密码等
在您的情况下,我怀疑您使用UI或CLI创建了ID为aws\U凭据的连接。因此,当您将其ID传递给S3Hook
时,它会成功地检索凭据(从数据库,而不是从您创建的连接
对象)
但是,您没有创建ID为redshift
的连接,因此,awshake
抱怨它没有定义。您必须首先按照文档中的描述创建连接
注意:不在DAG代码中定义连接的原因是DAG代码通常存储在版本控制系统(例如Git)中。将凭据存储在那里会带来安全风险。连接通常使用所述的UI或CLI创建,并由数据库后端存储。然后,操作符和相应的钩子将连接ID作为参数,并使用它检索这些连接的用户名、密码等
在您的情况下,我怀疑您使用UI或CLI创建了ID为aws\U凭据的连接。因此,当您将其ID传递给S3Hook
时,它会成功地检索凭据(从数据库,而不是从您创建的连接
对象)
但是,您没有创建ID为redshift
的连接,因此,awshake
抱怨它没有定义。您必须首先按照文档中的描述创建连接
注意:不在DAG代码中定义连接的原因是DAG代码通常存储在版本控制系统(例如Git)中。在那里存储凭据会有安全风险。如果您能解决此问题,请共享您的输出,好吗?我和你有同样的问题。将会非常有用!!!如果你能解决这个案子,你能分享你的成果吗?我和你有同样的问题。将会非常有用!!!