web-dev-qa-db-ja.com

Apacheエアフローを使用してパスワードを保存およびアクセスする

気流をスケジューラとして使用しています。 DAGで単純なbash演算子を呼び出したい。 bashスクリプトでは、さらに処理を行うために引数としてパスワードが必要です。

エアフロー(config/variables/connection)にパスワードを安全に保存し、DAG定義ファイルでアクセスするにはどうすればよいですか。

私は気流が初めてなので、Pythonなので、コードスニペットをいただければ幸いです。

17
Anup

パスワードをフックに保存できます-これは、fernetキーをセットアップしている限り暗号化されます。

接続を作成する方法は次のとおりです。

from airflow.models import Connection
def create_conn(username, password, Host=None):
    new_conn = Connection(conn_id=f'{username}_connection',
                                  login=username,
                                  Host=host if Host else None)
    new_conn.set_password(password)

次に、このパスワードはセットアップしたdbで暗号化されます。

このパスワードにアクセスするには:

from airflow.hooks.base_hook import BaseHook

 connection = BaseHook.get_connection("username_connection")
 password = connection.password # This is a getter that returns the unencrypted password.

編集:

UIを介して接続を作成する簡単な方法があります。

Main Menu その後: Create Connection

32
Daniel Lee

パスワードをエアフロー変数に保存できます https://airflow.incubator.Apache.org/ui.html#variable-view

  1. Mypass:XXXなど、UIでキーと値を使用して変数を作成します
  2. インポート変数from airflow.models import Variable
  3. MyPass = Variable.get( "mypass")
  4. MyPassをbashスクリプトに渡します。
command = """
          echo "{{ params.my_param }}"
          """



task = BashOperator(
        task_id='templated',
        bash_command=command,
        params={'my_param': MyPass},
        dag=dag)
3
Chengzhi

この場合、hook = PostgresHook(postgres_conn_id=postgres_conn_id)を使用してデータベース接続でHookを取得できるPythonOperatorを使用します。次に、このフックで_get_connection_を呼び出すと、データベース接続のホスト、ログイン、パスワードを取得できるConnectionオブジェクトを取得できます。

最後に、たとえばsubprocess.call(your_script.sh, connection_string)を使用して、接続の詳細をパラメーターとして渡します。

この方法は少し複雑ですが、Airflowでデータベース接続の暗号化を維持できます。また、PythonOperatorから基本動作を継承するが、フックを取得してbashスクリプトを呼び出すためのロジックを追加する別のOperatorクラスにこの戦略をプルできる必要があります。

2
Matthijs Brouns

これは私が使用したものです。

    def add_slack_token(ds, **kwargs):
        """"Add a slack token"""
        session = settings.Session()

        new_conn = Connection(conn_id='slack_token')
        new_conn.set_password(SLACK_LEGACY_TOKEN)

        if not (session.query(Connection).filter(Connection.conn_id == 
         new_conn.conn_id).first()):
        session.add(new_conn)
        session.commit()
        else:
            msg = '\n\tA connection with `conn_id`={conn_id} already exists\n'
            msg = msg.format(conn_id=new_conn.conn_id)
            print(msg)

    dag = DAG(
        'add_connections',
        default_args=default_args,
        schedule_interval="@once")


    t2 = PythonOperator(
        dag=dag,
        task_id='add_slack_token',
        python_callable=add_slack_token,
        provide_context=True,
    )
0
Don Bar