View a markdown version of this page

Utilisation de l'API REST Apache Airflow - Amazon Managed Workflows for Apache Airflow

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Utilisation de l'API REST Apache Airflow

Amazon Managed Workflows for Apache Airflow (Amazon MWAA) permet d'interagir avec vos environnements Apache Airflow directement à l'aide de l'API REST Apache Airflow pour les environnements exécutant Apache Airflow v2.4.3 et versions ultérieures. Cela vous permet d'accéder à vos environnements Amazon MWAA et de les gérer par programmation, offrant ainsi un moyen standardisé d'invoquer des flux de travail d'orchestration des données, de gérer vos DAG et de surveiller l'état de divers composants d'Apache Airflow tels que la base de données de métadonnées, le déclencheur et le planificateur.

Pour favoriser l'évolutivité lors de l'utilisation de l'API REST Apache Airflow, Amazon MWAA vous offre la possibilité de dimensionner horizontalement la capacité du serveur Web afin de faire face à une demande accrue, qu'il s'agisse de demandes d'API REST, d'utilisation de l'interface de ligne de commande (CLI) ou d'utilisateurs simultanés de l'interface utilisateur (UI) Apache Airflow. Pour plus d'informations sur la manière dont Amazon MWAA fait évoluer les serveurs Web, consultez. Configuration du dimensionnement automatique du serveur Web Amazon MWAA

Vous pouvez utiliser l'API REST Apache Airflow pour implémenter les cas d'utilisation suivants pour vos environnements :

  • Accès par programmation  : vous pouvez désormais démarrer les exécutions d'Apache Airflow DAG, gérer des ensembles de données et récupérer l'état de divers composants tels que la base de données de métadonnées, les déclencheurs et les planificateurs sans avoir recours à l'interface utilisateur ou à l'interface de ligne de commande d'Apache Airflow.

  • Intégration à des applications externes et à des microservices  : le support de l'API REST vous permet de créer des solutions personnalisées qui intègrent vos environnements Amazon MWAA à d'autres systèmes. Par exemple, vous pouvez démarrer des flux de travail en réponse à des événements provenant de systèmes externes, tels que des tâches de base de données terminées ou l'inscription de nouveaux utilisateurs.

  • Surveillance centralisée  : vous pouvez créer des tableaux de bord de surveillance qui regroupent l'état de vos DAG dans plusieurs environnements Amazon MWAA, permettant ainsi une surveillance et une gestion centralisées.

Pour plus d'informations sur l'API REST Apache Airflow, consultez la référence de l'API REST Apache Airflow.

En utilisantInvokeRestApi, vous pouvez accéder à l'API REST Apache Airflow à l'aide AWS d'informations d'identification. Vous pouvez également y accéder en obtenant un jeton d'accès au serveur Web, puis en l'utilisant pour l'appeler.

Si vous rencontrez un message Update your environment to use InvokeRestApi d'erreur lors de l'utilisation de l'InvokeRestApiopération, cela signifie que vous devez mettre à jour votre environnement Amazon MWAA. Cette erreur se produit lorsque votre environnement Amazon MWAA n'est pas compatible avec les dernières modifications liées à InvokeRestApi cette fonctionnalité. Pour résoudre ce problème, mettez à jour votre environnement Amazon MWAA afin d'intégrer les modifications nécessaires à InvokeRestApi cette fonctionnalité.

La durée d'expiration par défaut de l'InvokeRestApiopération est de 10 secondes. Si l'opération ne se termine pas dans ce délai de 10 secondes, elle est automatiquement interrompue et une erreur est générée. Assurez-vous que vos appels d'API REST sont conçus pour être exécutés dans ce délai afin d'éviter les erreurs.

Pour favoriser l'évolutivité lors de l'utilisation de l'API REST Apache Airflow, Amazon MWAA vous offre la possibilité de dimensionner horizontalement la capacité du serveur Web afin de faire face à une demande accrue, qu'il s'agisse de demandes d'API REST, d'utilisation de l'interface de ligne de commande (CLI) ou d'utilisateurs simultanés de l'interface utilisateur (UI) Apache Airflow. Pour plus d'informations sur la manière dont Amazon MWAA fait évoluer les serveurs Web, consultez. Configuration du dimensionnement automatique du serveur Web Amazon MWAA

Vous pouvez utiliser l'API REST Apache Airflow pour implémenter les cas d'utilisation suivants pour vos environnements :

  • Accès par programmation  : vous pouvez désormais démarrer les exécutions d'Apache Airflow DAG, gérer des ensembles de données et récupérer l'état de divers composants tels que la base de données de métadonnées, les déclencheurs et les planificateurs sans avoir recours à l'interface utilisateur ou à l'interface de ligne de commande d'Apache Airflow.

  • Intégration à des applications externes et à des microservices  : le support de l'API REST vous permet de créer des solutions personnalisées qui intègrent vos environnements Amazon MWAA à d'autres systèmes. Par exemple, vous pouvez démarrer des flux de travail en réponse à des événements provenant de systèmes externes, tels que des tâches de base de données terminées ou l'inscription de nouveaux utilisateurs.

  • Surveillance centralisée  : vous pouvez créer des tableaux de bord de surveillance qui regroupent l'état de vos DAG dans plusieurs environnements Amazon MWAA, permettant ainsi une surveillance et une gestion centralisées.

Pour plus d'informations sur l'API REST Apache Airflow, consultez la référence de l'API REST Apache Airflow.

En utilisantInvokeRestApi, vous pouvez accéder à l'API REST Apache Airflow à l'aide AWS d'informations d'identification. Vous pouvez également y accéder en obtenant un jeton d'accès au serveur Web, puis en l'utilisant pour l'appeler.

  • Si vous rencontrez un message Update your environment to use InvokeRestApi d'erreur lors de l'utilisation de l'InvokeRestApiopération, cela signifie que vous devez mettre à jour votre environnement Amazon MWAA. Cette erreur se produit lorsque votre environnement Amazon MWAA n'est pas compatible avec les dernières modifications liées à InvokeRestApi cette fonctionnalité. Pour résoudre ce problème, mettez à jour votre environnement Amazon MWAA afin d'intégrer les modifications nécessaires à InvokeRestApi cette fonctionnalité.

  • La durée d'expiration par défaut de l'InvokeRestApiopération est de 10 secondes. Si l'opération ne se termine pas dans ce délai de 10 secondes, elle est automatiquement interrompue et une erreur est générée. Assurez-vous que vos appels d'API REST sont conçus pour être exécutés dans ce délai afin d'éviter les erreurs.

Important

La taille de la charge utile de réponse ne peut pas dépasser 6 Mo. Vous RestApi échouez si cette limite est dépassée.

Utilisez les exemples suivants pour effectuer des appels d'API à l'API REST Apache Airflow et démarrer une nouvelle exécution DAG :

Octroi de l'accès à l'API REST Apache Airflow : airflow : InvokeRestApi

Pour accéder à l'API REST Apache Airflow à l'aide AWS d'informations d'identification, vous devez accorder l'airflow:InvokeRestApiautorisation dans votre politique IAM. Dans l'exemple de politique suivant, spécifiez leAdmin,Op, UserViewer, ou le Public rôle dans {airflow-role} afin de personnaliser le niveau d'accès des utilisateurs. Pour plus d'informations, reportez-vous à la section Rôles https://airflow.apache.org/docs/apache-airflow/1.10.6/security.html?highlight=ldap#default-roles par défaut du guide de référence Apache Airflow.

{ "Version":"2012-10-17", "Statement": [ { "Sid": "AllowMwaaRestApiAccess", "Effect": "Allow", "Action": ["airflow:InvokeRestApi","airflow:CreateWebLoginToken"], "Resource": [ "arn:aws:airflow:{your-region}:{your-account-id}:role/{your-environment-name}/{airflow-role}" ] } ] }
Note

Lors de la configuration d'un serveur Web privé, l'InvokeRestApiaction ne peut pas être invoquée depuis l'extérieur d'un cloud privé virtuel (VPC). Vous pouvez utiliser la aws:SourceVpc touche pour appliquer un contrôle d'accès plus précis à cette opération. Pour plus d'informations, consultez aws : SourceVpc.

Appel de l'API REST Apache Airflow

L'exemple de script Python suivant montre comment utiliser l'API REST Apache Airflow. Le script répertorie les DAG disponibles dans votre environnement et crée une variable Apache Airflow :

import boto3 env_name = "MyAirflowEnvironment" def list_dags(client): request_params = { "Name": env_name, "Path": "/dags", "Method": "GET", "QueryParameters": { "paused": False } } response = client.invoke_rest_api( **request_params ) print("Airflow REST API response: ", response['RestApiResponse']) def create_variable(client): request_params = { "Name": env_name, "Path": "/variables", "Method": "POST", "Body": { "key": "test-restapi-key", "value": "test-restapi-value", "description": "Test variable created by MWAA InvokeRestApi API", } } response = client.invoke_rest_api( **request_params ) print("Airflow REST API response: ", response['RestApiResponse']) if __name__ == "__main__": client = boto3.client("mwaa") list_dags(client) create_variable(client)

Création d'un jeton de session de serveur Web et appel de l'API REST Apache Airflow

Pour créer un jeton d'accès au serveur Web, utilisez la fonction Python suivante. Cette fonction appelle d'abord l'API Amazon MWAA pour obtenir un jeton de connexion Web. Le jeton de connexion Web, qui expire au bout de 60 secondes, est ensuite échangé contre un jeton de session Web, qui vous permet d'accéder au serveur Web et d'utiliser l'API REST Apache Airflow. Si vous avez besoin de plus de 10 transactions par seconde (TPS) de capacité de régulation, vous pouvez utiliser cette méthode pour accéder à l'API REST Apache Airflow.

Le jeton de session expire au bout de 12 heures.

Astuce

Les principales modifications apportées aux exemples de code suivants d'Apache Airflow v2 à v3 sont les suivantes :

  • Le chemin de l'API REST est passé de /api/v1 à /api/v2

  • Le chemin de connexion est passé de /aws_mwaa/login à /pluginsv2/aws_mwaa/login

  • La réponse de connexion response.cookies["_token"] contient des informations de jeton que vous devez utiliser pour les appels d'API suivants

  • Pour un appel d'API REST, vous devez transmettre jwt_token des informations dans les en-têtes comme suit :

    headers = { "Authorization": f"Bearer {jwt_token}", "Content-Type": "application/json" }
Apache Airflow v3
def get_token_info(region, env_name): logging.basicConfig(level=logging.INFO) try: # Initialize MWAA client and request a web login token mwaa = boto3.client('mwaa', region_name=region) response = mwaa.create_web_login_token(Name=env_name) # Extract the web server hostname and login token web_server_host_name = response["WebServerHostname"] web_token = response["WebToken"] # Construct the URL needed for authentication login_url = f"https://{web_server_host_name}/pluginsv2/aws_mwaa/login" login_payload = {"token": web_token} # Make a POST request to the MWAA login url using the login payload response = requests.post( login_url, data=login_payload, timeout=10 ) # Check if login was successful if response.status_code == 200: # Return the hostname and the session cookie return ( web_server_host_name, response.cookies['_token'] ) else: # Log an error logging.error("Failed to log in: HTTP %d", response.status_code) return None except requests.RequestException as e: # Log any exceptions raised during the request to the MWAA login endpoint logging.error("Request failed: %s", str(e)) return None except Exception as e: # Log any other unexpected exceptions logging.error("An unexpected error occurred: %s", str(e)) return None
Apache Airflow v2
def get_session_info(region, env_name): logging.basicConfig(level=logging.INFO) try: # Initialize MWAA client and request a web login token mwaa = boto3.client('mwaa', region_name=region) response = mwaa.create_web_login_token(Name=env_name) # Extract the web server hostname and login token web_server_host_name = response["WebServerHostname"] web_token = response["WebToken"] # Construct the URL needed for authentication login_url = f"https://{web_server_host_name}/aws_mwaa/login" login_payload = {"token": web_token} # Make a POST request to the MWAA login url using the login payload response = requests.post( login_url, data=login_payload, timeout=10 ) # Check if login was successful if response.status_code == 200: # Return the hostname and the session cookie return ( web_server_host_name, response.cookies["session"] ) else: # Log an error logging.error("Failed to log in: HTTP %d", response.status_code) return None except requests.RequestException as e: # Log any exceptions raised during the request to the MWAA login endpoint logging.error("Request failed: %s", str(e)) return None except Exception as e: # Log any other unexpected exceptions logging.error("An unexpected error occurred: %s", str(e)) return None

Une fois l'authentification terminée, vous disposez des informations d'identification nécessaires pour commencer à envoyer des demandes aux points de terminaison de l'API. Dans l'exemple de la section suivante, utilisez le point de terminaisondags/{dag_name}/dagRuns.

Apache Airflow v3
def trigger_dag(region, env_name, dag_id): """ Triggers a DAG in a specified MWAA environment using the Airflow REST API. Args: region (str): AWS region where the MWAA environment is hosted. env_name (str): Name of the MWAA environment. dag_id (str): ID of the DAG to trigger. """ logging.info(f"Attempting to trigger DAG {dag_id} in environment {env_name} at region {region}") # Retrieve the web server hostname and token for authentication try: web_server_host_name, jwt_token = get_token_info(region, env_name) if not jwt_token: logging.error("Authentication failed, no jwt token retrieved.") return except Exception as e: logging.error(f"Error retrieving token info: {str(e)}") return # Prepare headers and payload for the request request_headers = { "Authorization": f"Bearer {jwt_token}", "Content-Type": "application/json" } # sample request body input json_body = {"logical_date": "2025-09-17T14:15:00Z"} # Construct the URL for triggering the DAG url = f"https://{web_server_host_name}/api/v2/dags/{dag_id}/dagRuns" # Send the POST request to trigger the DAG try: response = requests.post(url, headers=request_headers, json=json_body) # Check the response status code to determine if the DAG was triggered successfully if response.status_code == 200: logging.info("DAG triggered successfully.") else: logging.error(f"Failed to trigger DAG: HTTP {response.status_code} - {response.text}") except requests.RequestException as e: logging.error(f"Request to trigger DAG failed: {str(e)}") if __name__ == "__main__": logging.basicConfig(level=logging.INFO) # Check if the correct number of arguments is provided if len(sys.argv) != 4: logging.error("Incorrect usage. Proper format: python script_name.py {region} {env_name} {dag_id}") sys.exit(1) region = sys.argv[1] env_name = sys.argv[2] dag_id = sys.argv[3] # Trigger the DAG with the provided arguments trigger_dag(region, env_name, dag_id)
Apache Airflow v2
def trigger_dag(region, env_name, dag_name): """ Triggers a DAG in a specified MWAA environment using the Airflow REST API. Args: region (str): AWS region where the MWAA environment is hosted. env_name (str): Name of the MWAA environment. dag_name (str): Name of the DAG to trigger. """ logging.info(f"Attempting to trigger DAG {dag_name} in environment {env_name} at region {region}") # Retrieve the web server hostname and session cookie for authentication try: web_server_host_name, session_cookie = get_session_info(region, env_name) if not session_cookie: logging.error("Authentication failed, no session cookie retrieved.") return except Exception as e: logging.error(f"Error retrieving session info: {str(e)}") return # Prepare headers and payload for the request cookies = {"session": session_cookie} json_body = {"conf": {}} # Construct the URL for triggering the DAG url = f"https://{web_server_host_name}/api/v1/dags/{dag_name}/dagRuns" # Send the POST request to trigger the DAG try: response = requests.post(url, cookies=cookies, json=json_body) # Check the response status code to determine if the DAG was triggered successfully if response.status_code == 200: logging.info("DAG triggered successfully.") else: logging.error(f"Failed to trigger DAG: HTTP {response.status_code} - {response.text}") except requests.RequestException as e: logging.error(f"Request to trigger DAG failed: {str(e)}") if __name__ == "__main__": logging.basicConfig(level=logging.INFO) # Check if the correct number of arguments is provided if len(sys.argv) != 4: logging.error("Incorrect usage. Proper format: python script_name.py {region} {env_name} {dag_name}") sys.exit(1) region = sys.argv[1] env_name = sys.argv[2] dag_name = sys.argv[3] # Trigger the DAG with the provided arguments trigger_dag(region, env_name, dag_name)