J'ai essayé d'utiliser Airflow pour planifier un groupe de disponibilité de base de données . L'un des groupes de base de données comprend une tâche qui charge les données à partir du compartiment s3.
Pour les besoins ci-dessus, je dois configurer la connexion s3. Mais l'interface utilisateur fournie par airflow n'est pas aussi intuitive ( http://pythonhosted.org/airflow/configuration.html?highlight=connection#connections ). Si vous avez réussi à configurer la connexion s3, y a-t-il des pratiques recommandées que vous suivez?
Merci.
Il est difficile de trouver des références, mais après avoir creusé un peu, j'ai réussi à le faire fonctionner.
Créez une nouvelle connexion avec les attributs suivants:
Conn Id: my_conn_S3
Conn Type: S3
Supplémentaire:
{"aws_access_key_id":"_your_aws_access_key_id_", "aws_secret_access_key": "_your_aws_secret_access_key_"}
Pour utiliser cette connexion, vous trouverez ci-dessous un test de capteur S3 simple. L'idée de ce test est de configurer un capteur qui surveille les fichiers dans S3 (tâche T1) et une fois que la condition est remplie, il déclenche une commande bash (tâche T2).
airflow webserver
.airflow scheduler
.Schedule_interval dans la définition de dag est défini sur '@once' pour faciliter le débogage.
Pour l'exécuter à nouveau, laissez le tout tel quel, supprimez les fichiers du compartiment et essayez à nouveau en sélectionnant la première tâche (dans la vue graphique) et en sélectionnant "Effacer" tout "Passé", "Avenir", "En amont", "En aval" .... activité. Cela devrait lancer à nouveau le DAG.
Faites-moi savoir comment ça s'est passé.
"""
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)
Si vous craignez d'exposer les informations d'identification dans l'interface utilisateur, vous pouvez également indiquer l'emplacement du fichier d'informations d'identification dans le paramètre Extra de l'interface utilisateur. Seul l'utilisateur fonctionnel dispose des privilèges de lecture sur le fichier. Cela ressemble à quelque chose comme ci-dessous
Extra: {
"profile": "<profile_name>",
"s3_config_file": "/home/<functional_user>/creds/s3_credentials",
"s3_config_format": "aws" }
le fichier "/home/<functional_user>/creds/s3_credentials
" a des entrées ci-dessous
[<profile_name>]
aws_access_key_id = <access_key_id>
aws_secret_access_key = <secret_key>
En supposant que le flux d'air est hébergé sur un serveur EC2.
créez simplement la connexion comme indiqué dans les autres réponses, mais laissez tout ce qui est vide dans la configuration, à l'exception du type de connexion qui devrait rester en tant que S3
Le S3hook utilisera par défaut boto et le rôle du serveur EC2 sur lequel vous exécutez le flux d’air. en supposant que ce rôle a les droits sur S3, votre tâche pourra accéder au compartiment.
il s'agit d'un moyen beaucoup plus sûr que d'utiliser et de stocker des informations d'identification.
Pour la nouvelle version, modifiez le code python dans l'exemple ci-dessus.
s3_conn_id='my_conn_S3'
à
aws_conn_id='my_conn_s3'
Conn Id: example_s3_connnection
Conn Type: S3
Extra:{"aws_access_key_id":"xxxxxxxxxx", "aws_secret_access_key": "yyyyyyyyyyy"}
Remarque: les champs Login et Password sont laissés vides.
Pour les aw en Chine, cela ne fonctionne pas avec airflow == 1.8.0 Nécessite une mise à jour à 1.9.0 Mais airflow 1.9.0 change de nom et devient Apache-airflow == 1.9.0.
Une autre option qui a fonctionné pour moi a été de mettre la clé d'accès en tant que "login" et la clé secrète en tant que "mot de passe":
Conn Id: <arbitrary_conn_id>
Conn Type: S3
Login: <aws_access_key>
Password: <aws_secret_key>
Laissez tous les autres champs vides.