背景
以前編寫的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"
}