通过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_api
和auth_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"
}