通过API触发airflow的DAG任务

背景

以前编写的DAG都是通过定时触发的,当前有一个场景需要通过手动提交API来触发,这样能够在用户需要的时候,主动触发执行任务,于是就有了这篇内容的摸索。
之前只知道airflow支持通过API来触发任务,但是具体如何操作是真不会,看了官方的API文档,也没找到具体方法,特别是认证这块一直没解决,最后查看了一些其他用户发表的文章,找到了点苗头,这里就简单做个记录。

完整请求代码结构

import requests
import base64
username = "test"
password = "test"

auth_string = f"{username}:{password}"

base64_auth_string = base64.b64encode(auth_string.encode()).decode()
print(base64_auth_string)
# url = 'http://x.x.x.x:8080/api/v1/dags/{dag_id}/dagRuns'
url = 'http://x.x.x.x:8080/api/v1/dags/25_PC_Repo_Sync/dagRuns'
headers = {
    'Cache-Control': 'no-cache',
    'Content-Type': 'application/json',
    'Authorization':f'Basic {base64_auth_string}'
}
data = {
  "conf": {},
}
response = requests.post(url, headers=headers, json=data)

print(response.text)

可以看到整个请求所涉及到的东西其实非常少:

  • 请求地址:url = 'http://x.x.x.x:8080/api/v1/dags/{dag_id}/dagRuns' -- 这里关键就是dag_id这个参数,是你需要触发的dag的名称,如下,我的就是25_PC_Repo_Sync
    dag =  DAG(
    	'25_PC_Repo_Sync',
    	description='同步仓库到PC设备',
    	schedule_interval=None,
    	start_date=datetime(2024, 5, 6),
    	tags=['Rsync','PC_Repo_Sync']
    )
    
  • heardes构造中核心其实就是 'Authorization':f'Basic {base64_auth_string}' --这里就是认证的关键,后面再展开说一下这部分的构造过程。
  • 请求用的post方式
  • data部分也是需要的,构造一个空字典就行。

Authorization构造过程

参考官方文档
先将配置文件修改一下:airflow.cfg
在[api]模块中将enable_experimental_apiauth_backends设置成如下值

enable_experimental_api = True

auth_backends= airflow.api.auth.backend.basic_auth

设置完成后记得重启服务

引用官方内容

基本身份验证

目前是基本的用户名密码身份验证 支持 API。这适用于通过 LDAP 登录或 在 Airflow 元数据数据库中使用密码。

若要启用基本身份验证,请在配置中设置以下内容:

[api]
auth_backends = airflow.api.auth.backend.basic_auth
用户名和密码需要进行 base64 编码,并通过 HTTP 标头按以下格式发送:Authorization

Authorization: Basic Base64(username:password)
下面是一个示例 curl 命令,可用于验证设置:

ENDPOINT_URL="http://localhost:8080/"
curl -X GET  \
    --user "username:password" \
    "${ENDPOINT_URL}/api/v1/pools"
	

请注意,您仍然可以启用此设置以允许通过用户名进行 API 访问 密码凭据,即使 Airflow 网络服务器可能正在使用另一个 身份验证方法。在此设置下,只有通过 LDAP 或命令创建的用户才能通过 API 身份验证。airflow users create

通过上面这段内容,我们可以知道这里的Authorization 是使用用户名和密码然后通过base64编码得到的一个字符串。

存在的坑

直接将我之前创建的用户名和密码提供编码后,仍旧会提示我请求是401,也就是没有权限,最后通过命令重新创建新的用户,则可以达到目的。

创建新用户

airflow users create --username test --firstname admin --lastname admin --role Admin --email babyfengfjx@163.com --password test

通过上面的命令可以创建一个新用户test,密码也是test,角色是管理员,然后使用这个test:test去编码,具体过程上面代码中已经展现。

发送请求触发任务

通过上面的操作后,即可正常触发任务执行了。

接口返回的信息如下:

{
  "conf": {},
  "dag_id": "25_PC_Repo_Sync",
  "dag_run_id": "manual__2024-05-06T07:00:53.063345+00:00",
  "data_interval_end": "2024-05-06T07:00:53.063345+00:00",
  "data_interval_start": "2024-05-06T07:00:53.063345+00:00",
  "end_date": null,
  "execution_date": "2024-05-06T07:00:53.063345+00:00",
  "external_trigger": true,
  "last_scheduling_decision": null,
  "logical_date": "2024-05-06T07:00:53.063345+00:00",
  "note": null,
  "run_type": "manual",
  "start_date": null,
  "state": "queued"
}

image

posted @ 2024-05-06 15:46  babyfengfjx  阅读(72)  评论(0编辑  收藏  举报