在Admin->Connection
我设置Conn Type S3
。
基本上我在My Python脚本中有这个代码:
if __name__ == '__main__':
AWS_ACCESS_KEY_ID = "..."
AWS_SECRET_ACCESS_KEY = "..."
AWS_DEFAULT_REGION = "..."
Start_Work
我想要做的是从Airflow调用我的脚本并将连接的参数传递给它(而不是在脚本中硬编码)。
我该怎么做?
编辑: 让我们假设这是连接: https://redis.io/commands/memory-doctor
如何访问每个提交的数据?
答案 0 :(得分:5)
您可以做的一件事是导入provide_session
util,然后根据conn_id
检索连接。然后,您可以将其传递给python运算符。
所以它看起来像这样:
from airflow.utils.db import provide_session
@provide_session
def get_conn(conn_id, session=None):
conn = (session.query(Connection)
.filter(Connection.conn_id == conn_id)
.first())
return conn
def my_python_function():
conn = get_conn('connection_id')
key_id = conn.extra_dejson.get('AWS_ACCESS_KEY_ID')
secret_key = conn.extra_dejson.get('AWS_SECRET_ACCESS_KEY')
default_region = conn.extra_dejson.get('DEFAULT_REGION')
task1 = PythonOperator(task_id='my_task', python_callable=my_python_function, dag=dag)
task1
编辑:从python callable中删除了引号
答案 1 :(得分:1)
我看到您的连接ID为M_1
,您的连接类型为S3
,因此您可以在PythonOperator
(或从BashOperator
调用的python脚本)中加载它:
from airflow.hooks.s3_hook import S3Hook
def py_op_callable:
hook = S3Hook('M_1')
botocore_credentials = hook.get_credentials()
botocore_credentials.access_key
botocore_credentials.secret_key
botocore_credentials.token
在v1.9.0上似乎get_credentials
尚未出现。在S3Hook继承的AwsHook上只有私有_get_credentials()
。如果您确定将它们放入额外参数中,直接方法是:
from airflow.hooks.base_hook import BaseHook
def py_op_callable:
hook = BaseHook('M_1')
extra = hook.get_connection().extra_dejson
key_id = extra.get('aws_access_key_id')
secret_key = extra.get('aws_secret_access_key')
default_region = extra.get('region_name')
return key_id,secret_key,default_region