Airflowを使用してDAGをスケジュールしようとしています。 DAGの1つには、s3バケットからデータをロードするタスクが含まれます。
上記の目的のために、s3接続をセットアップする必要があります。ただし、エアフローによって提供されるUIは直感的ではありません( http://pythonhosted.org/airflow/configuration.html?highlight=connection#connections )。 s3接続のセットアップに成功した人はいれば、皆さんが従うベストプラクティスはありますか?
ありがとう。
参照を見つけるのは難しいですが、少し掘り下げた後、それを機能させることができました。
次の属性を使用して新しい接続を作成します。
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_"}
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タスク)をトリガーすることです。
airflow webserver
。airflow scheduler
。DAG定義のschedule_intervalは、デバッグを容易にするために「@once」に設定されます。
もう一度実行するには、すべてをそのままにして、バケット内のファイルを削除し、最初のタスク(グラフビュー)を選択して、「クリア」を選択し、「過去」、「未来」、「上流」、「下流」 ....アクティビティ。これにより、DAGが再び開始されます。
どうなったか教えてください。
"""
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)
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>
気流がEC2サーバーでホストされていると仮定します。
他の回答に従って接続を作成しますが、S3のままである接続タイプ以外の構成ではすべて空白のままにします
S3hookはデフォルトでbotoになり、これはデフォルトでエアフローを実行しているEC2サーバーの役割になります。このロールにS3に対する権限があると仮定すると、タスクはバケットにアクセスできます。
これは、資格情報を使用して保存するよりもはるかに安全な方法です。
新しいバージョンでは、上記のサンプルのpythonコードを変更します。
s3_conn_id='my_conn_S3'
に
aws_conn_id='my_conn_s3'
私のために働いた別のオプションは、アクセスキーを「ログイン」として、秘密キーを「パスワード」として置くことでした:
Conn Id: <arbitrary_conn_id>
Conn Type: S3
Login: <aws_access_key>
Password: <aws_secret_key>
他のフィールドはすべて空白のままにします。
Conn Id: example_s3_connnection
Conn Type: S3
Extra:{"aws_access_key_id":"xxxxxxxxxx", "aws_secret_access_key": "yyyyyyyyyyy"}
注:ログインとパスワードのフィールドは空のままです。
中国のawsでは、airflow == 1.8.0では機能しません。1.9.0に更新する必要がありますが、airflow 1.9.0は名前をApache-airflow == 1.9.0に変更します