web-dev-qa-db-fra.com

Airflow connexion s3 en utilisant l'interface utilisateur

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.

24
Nikhil Reddy

Il est difficile de trouver des références, mais après avoir creusé un peu, j'ai réussi à le faire fonctionner.

TLDR

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_"}

Version longue, configuration de la connexion de l'interface utilisateur:

  • Sur l'interface utilisateur Airflow, accédez à Admin> Connexions
  • Créez une nouvelle connexion avec les attributs suivants: ID de connexion: my_conn_S3, type de connexion: S3, extra: {"aws_access_key_id": "_ your_aws_access_key_id_", "aws_secret_access_key": "_votre_aws_secret_secret_access_key_"}
  • Laissez tous les autres champs (hôte, schéma, connexion) vierges.

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).

Essai

  • Avant d'exécuter le DAG, assurez-vous d'avoir un compartiment S3 nommé "S3-Bucket-To-Watch". 
  • Ajoutez ci-dessous s3_dag_test.py au dossier dags de airflow (~/airflow/dags)
  • Démarrer airflow webserver.
  • Accédez à l'interface utilisateur Airflow ( http: // localhost: 8383/ )
  • Démarrer airflow scheduler.
  • Activez le DAG 's3_dag_test' dans la vue principale des DAG.
  • Sélectionnez 's3_dag_test' pour afficher les détails de la liste.
  • Dans la vue graphique, vous devriez pouvoir voir son état actuel.
  • La tâche 'check_s3_for_file_in_s3' doit être active et en cours d'exécution.
  • Maintenant, ajoutez un fichier nommé "fichier à surveiller-1" à votre "S3-Bucket-To-Watch".
  • Les premières tâches devraient être terminées, les deuxièmes doivent être commencées et terminées.

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_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)

45
Anselmo

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>
7
sagarsar

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.

4
ninjasmith

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'
2
fivejjs
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.

1
Kris

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.

0
Andrew Wang

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.

0
Pat64