透過API觸發airflow的DAG任務

babyfengfjx發表於2024-05-06

背景

以前編寫的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

相關文章