Airflow 连接id不是';t定义

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

我正在学习气流,并试图了解连接是如何工作的

我有一个具有以下代码的第一个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(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)中。在那里存储凭据会有安全风险。

如果您能解决此问题,请共享您的输出,好吗?我和你有同样的问题。将会非常有用!!!如果你能解决这个案子,你能分享你的成果吗?我和你有同样的问题。将会非常有用!!!