web-dev-qa-db-ja.com

UIを使用したAirflow s3接続

Airflowを使用してDAGをスケジュールしようとしています。 DAGの1つには、s3バケットからデータをロードするタスクが含まれます。

上記の目的のために、s3接続をセットアップする必要があります。ただし、エアフローによって提供されるUIは直感的ではありません( http://pythonhosted.org/airflow/configuration.html?highlight=connection#connections )。 s3接続のセットアップに成功した人はいれば、皆さんが従うベストプラクティスはありますか?

ありがとう。

33
Nikhil Reddy

参照を見つけるのは難しいですが、少し掘り下げた後、それを機能させることができました。

TLDR

次の属性を使用して新しい接続を作成します。

Conn Id:my_conn_S3

Conn Type:S3

追加:

{"aws_access_key_id":"_your_aws_access_key_id_", "aws_secret_access_key": "_your_aws_secret_access_key_"}

ロングバージョン、UI接続のセットアップ:

  • Airflow UIで、[管理]> [接続]に移動します
  • 次の属性を使用して新しい接続を作成します。
    • 接続ID:my_conn_S3
    • 接続タイプ:S3
    • 追加:{"aws_access_key_id":"_your_aws_access_key_id_", "aws_secret_access_key": "_your_aws_secret_access_key_"}
    • 他のすべてのフィールド(ホスト、スキーマ、ログイン)は空白のままにします。

この接続を使用するには、以下に簡単なS3センサーテストがあります。このテストの目的は、S3のファイルを監視するセンサーをセットアップし(T1タスク)、条件が満たされるとbashコマンド(T2タスク)をトリガーすることです。

テスト中

  • DAGを実行する前に、「S3-Bucket-To-Watch」という名前のS3バケットがあることを確認してください。
  • 以下のs3_dag_test.pyをエアフローdagsフォルダー(〜/ airflow/dags)に追加します
  • 開始airflow webserver
  • Airflow UIに移動します( http:// localhost:8383 /
  • 開始airflow scheduler
  • メインのDAGビューで 's3_dag_test' DAGをオンにします。
  • ダグの詳細を表示するには、「s3_dag_test」を選択します。
  • グラフビューで、現在の状態を確認できるはずです。
  • 「check_s3_for_file_in_s3」タスクがアクティブで実行されている必要があります。
  • ここで、「file-to-watch-1」という名前のファイルを「S3-Bucket-To-Watch」に追加します。
  • 最初のタスクは完了している必要があり、2番目のタスクは開始および終了する必要があります。

DAG定義のschedule_intervalは、デバッグを容易にするために「@once」に設定されます。

もう一度実行するには、すべてをそのままにして、バケット内のファイルを削除し、最初のタスク(グラフビュー)を選択して、「クリア」を選択し、「過去」、「未来」、「上流」、「下流」 ....アクティビティ。これにより、DAGが再び開始されます。

どうなったか教えてください。

s3_dag_test.py;

"""
S3 Sensor Connection Test
"""

from airflow import DAG
from airflow.operators import SimpleHttpOperator, HttpSensor,   BashOperator, EmailOperator, S3KeySensor
from datetime import datetime, timedelta

default_args = {
    'owner': 'airflow',
    'depends_on_past': False,
    'start_date': datetime(2016, 11, 1),
    'email': ['[email protected]'],
    'email_on_failure': False,
    'email_on_retry': False,
    'retries': 5,
    'retry_delay': timedelta(minutes=5)
}

dag = DAG('s3_dag_test', default_args=default_args, schedule_interval= '@once')

t1 = BashOperator(
    task_id='bash_test',
    bash_command='echo "hello, it should work" > s3_conn_test.txt',
    dag=dag)

sensor = S3KeySensor(
    task_id='check_s3_for_file_in_s3',
    bucket_key='file-to-watch-*',
    wildcard_match=True,
    bucket_name='S3-Bucket-To-Watch',
    s3_conn_id='my_conn_S3',
    timeout=18*60*60,
    poke_interval=120,
    dag=dag)

t1.set_upstream(sensor)

60
Anselmo

UIで資格情報を公開するのが心配な場合は、UIの追加パラメーターで資格情報ファイルの場所を渡す方法もあります。機能ユーザーのみがファイルの読み取り権限を持っています。以下のようになります

Extra:  {
    "profile": "<profile_name>", 
    "s3_config_file": "/home/<functional_user>/creds/s3_credentials", 
    "s3_config_format": "aws" }

ファイル "/home/<functional_user>/creds/s3_credentials "には以下のエントリがあります

[<profile_name>]
aws_access_key_id = <access_key_id>
aws_secret_access_key = <secret_key>
8
sagarsar

気流がEC2サーバーでホストされていると仮定します。

他の回答に従って接続を作成しますが、S3のままである接続タイプ以外の構成ではすべて空白のままにします

S3hookはデフォルトでbotoになり、これはデフォルトでエアフローを実行しているEC2サーバーの役割になります。このロールにS3に対する権限があると仮定すると、タスクはバケットにアクセスできます。

これは、資格情報を使用して保存するよりもはるかに安全な方法です。

6
ninjasmith

新しいバージョンでは、上記のサンプルのpythonコードを変更します。

s3_conn_id='my_conn_S3'

aws_conn_id='my_conn_s3'
3
fivejjs

私のために働いた別のオプションは、アクセスキーを「ログイン」として、秘密キーを「パスワード」として置くことでした:

Conn Id: <arbitrary_conn_id>
Conn Type: S3
Login: <aws_access_key>
Password: <aws_secret_key>

他のフィールドはすべて空白のままにします。

3
Pat64
Conn Id: example_s3_connnection
Conn Type: S3
Extra:{"aws_access_key_id":"xxxxxxxxxx", "aws_secret_access_key": "yyyyyyyyyyy"}

注:ログインとパスワードのフィールドは空のままです。

1
Kris

中国のawsでは、airflow == 1.8.0では機能しません。1.9.0に更新する必要がありますが、airflow 1.9.0は​​名前をApache-airflow == 1.9.0に変更します

0
Andrew Wang