存取 Airflow 網頁介面

Cloud Composer 3 | Cloud Composer 2 | Cloud Composer 1

Apache Airflow 包含一個稱為 Airflow UI 的網頁使用者介面,可用來管理 Airflow DAG、查看 DAG 執行記錄、監控 Airflow 及執行管理動作。

關於 Airflow 網路伺服器

每個 Cloud Composer 環境都有一個執行 Airflow UI 的網路伺服器。網路伺服器是 Cloud Composer 環境架構的一部分。

網路伺服器會剖析 dags/ 資料夾中的 DAG 定義檔,且必須能夠存取 DAG 的資料和資源,才能載入 DAG 並處理 HTTP 要求。

網路伺服器會每 60 秒重新整理 DAG,這是 Cloud Composer 中的預設 worker_refresh_interval。如果網路伺服器無法在重新整理間隔內剖析所有 DAG,就可能發生網路伺服器錯誤。

如果 DAG 檔案數量龐大,或是載入 DAG 檔案的工作負載不輕鬆,就可能會超過 60 秒。為確保無論 DAG 載入時間為何,網路伺服器仍可供存取,您可以設定非同步 DAG 載入,以便在背景中以預先設定的間隔剖析及載入 DAG (適用於 composer-1.7.1-airflow-1.10.2 以上版本)。這項設定也能縮短 DAG 重新整理時間。

除了超過 worker 重新整理間隔以外,網路伺服器在大多數情況下都能順利處理 DAG 載入失敗。造成網路伺服器當機或結束的 DAG 可能會導致瀏覽器中傳回錯誤。詳情請參閱「DAG 疑難排解」一文。

如果 DAG 剖析作業導致網頁伺服器問題持續發生,建議您使用非同步 DAG 載入功能。

事前準備

  • 您必須具備可查看 Cloud Composer 環境的角色。詳情請參閱「存取權控管」。

  • 建立環境時,Cloud Composer 會為執行 Airflow UI 的網路伺服器設定網址。這個網址不可自訂。

  • 針對執行 Composer 1.13.4 以上版本、Airflow 1.10.10 以上版本和 Python 3 的 Cloud Composer 環境,系統支援 Airflow 使用者介面的 Airflow 使用者介面存取權控管機制 (Airflow 角色式存取權控管機制) 功能。

存取 Airflow UI

Airflow 網路伺服器會部署至 appspot.com 網域,並提供 Airflow UI 的存取權。Cloud Composer 1 會根據使用者身分和為使用者定義的 IAM 政策繫結,提供介面的存取權。Cloud Composer 1 會使用 Identity-Aware Proxy 來達到這項目的。

建立新的 Cloud Composer 環境後,系統最多需要 25 分鐘才能完成 UI 託管程序,為您提供必要的存取權限。

透過 Google Cloud 主控台存取 Airflow UI

如要透過 Google Cloud 主控台存取 Airflow UI,請按照下列步驟操作:

  1. 前往 Google Cloud 控制台的「Environments」頁面。

    前往「環境」

  2. 在「Airflow 網路伺服器」欄中,按一下環境的「Airflow」連結。

  3. 使用具備適當權限的 Google 帳戶登入。

使用 Google Cloud CLI 取得 Airflow UI 網址

您可以透過任何網路瀏覽器開啟 Airflow UI。如要取得 Airflow UI 的網址,請在 Google Cloud CLI 中執行下列指令:

gcloud composer environments describe ENVIRONMENT_NAME \
  --location LOCATION

更改下列內容:

  • ENVIRONMENT_NAME:環境名稱。
  • LOCATION:環境所在的地區。

gcloud 指令會顯示 Cloud Composer 環境的屬性,包括 Airflow UI 的網址。該網址會列為 airflowUri

config:
  airflowUri: https://example-tp.appspot.com

設定非同步 DAG 載入作業

啟用非同步 DAG 載入功能後,Airflow 網路伺服器會建立新程序。這個程序會在背景載入 DAG,並依據 dagbag_sync_interval 選項定義的間隔傳送新載入的 DAG,然後進入休眠狀態。

這個程序會定期喚醒,重新載入 DAG,間隔時間由 collect_dags_interval 選項定義。

如要啟用非同步 DAG 載入功能,請按照下列步驟操作:

  1. 停用 DAG 序列化。非同步 DAG 載入功能無法與 DAG 序列化功能搭配使用。使用 async_dagbag_loaderstore_serialized_dags Airflow 設定選項會產生 HTTP 503 錯誤,並導致環境中斷。

  2. 覆寫下列 Airflow 設定選項:

    區段 附註
    webserver async_dagbag_loader True 預設為 False
    webserver collect_dags_interval 30 預設值為 30。使用較小的值可加快重新整理速度。
    webserver dagbag_sync_interval 10 預設為 10
    webserver worker_refresh_interval 3600 預設值為 60。使用非同步 DAG 載入功能時,您可以使用較長的重新整理間隔。

重新啟動網路伺服器

在偵錯或排解 Cloud Composer 環境的問題時,重新啟動 Airflow 網路伺服器可能可解決部分問題。您可以使用 restartWebServer API 或 Google Cloud CLI 中的 restart-web-server 指令重新啟動網頁伺服器:

gcloud beta composer environments restart-web-server ENVIRONMENT_NAME \
  --location=LOCATION

更改下列內容:

  • ENVIRONMENT_NAME:環境名稱。
  • LOCATION:環境所在的地區。

設定網路伺服器網路存取權

Airflow 網路伺服器存取參數不依賴環境的網路設定。請改為個別設定網路伺服器存取權。舉例來說,私人 IP 環境仍可透過網際網路存取 Airflow UI。

您無法將允許的 IP 範圍設為私人 IP 位址。

主控台

  1. 前往 Google Cloud 控制台的「Environments」頁面。

    前往「環境」

  2. 在環境清單中,按一下環境名稱。「環境詳細資料」頁面隨即開啟。

  3. 前往「環境設定」分頁。

  4. 在「Network configuration」部分中,找出「Web server access control」項目,然後按一下「Edit」

  5. 在「網路伺服器網路存取權控管」對話方塊中:

    • 如要允許從所有 IP 位址存取 Airflow 網路伺服器,請選取「允許所有 IP 位址傳出的存取要求」

    • 如要只限制存取特定 IP 範圍,請選取「只允許來自特定 IP 位址的存取要求」。在「IP 範圍」欄位中,請以 CIDR 標記法指定 IP 範圍。在「Description」欄位中,指定這個範圍的選用說明。如要指定多個範圍,請按一下「新增 IP 範圍」

    • 如要禁止所有 IP 位址存取,請選取「只允許來自特定 IP 位址的存取要求」,然後按一下空白範圍項目旁的「刪除項目」

gcloud

更新環境時,下列引數會控制網路伺服器存取參數:

  • --web-server-allow-all 可透過所有 IP 位址存取 Airflow。這是預設選項。

  • --update-web-server-allow-ip 會限制只允許特定來源 IP 範圍的存取。如要指定多個 IP 範圍,請多次使用這個引數。

  • --web-server-deny-all 會禁止所有 IP 位址的存取權。

gcloud composer environments update ENVIRONMENT_NAME \
    --location LOCATION \
    --update-web-server-allow-ip ip_range=WS_IP_RANGE,description=WS_RANGE_DESCRIPTION

更改下列內容:

  • ENVIRONMENT_NAME:環境名稱。
  • LOCATION:環境所在的地區。
  • WS_IP_RANGE:可存取 Airflow UI 的 IP 範圍,以 CIDR 標記法表示。
  • WS_RANGE_DESCRIPTION:IP 範圍的說明。

範例:

gcloud composer environments update example-environment \
    --location us-central1 \
    --update-web-server-allow-ip ip_range=192.0.2.0/24,description="example range" \
    --update-web-server-allow-ip ip_range=192.0.4.0/24,description="example range 2"

API

  1. 建構 [environments.patch][api-patch] API 要求。

  2. 在這個要求中:

    1. updateMask 參數中指定 config.webServerNetworkAccessControl 遮罩。

    2. 在要求主體中,指定 Airflow 工作記錄檔必須儲存的方式:

      • 如要透過所有 IP 位址存取 Airflow,請指定空白的 config 元素 (webServerNetworkAccessControl 元素不得出現)。

      • 如要只限制存取特定 IP 範圍,請在 allowedIpRanges 中指定一或多個範圍。

      • 如要禁止所有 IP 位址的存取權,請指定空白的 webServerNetworkAccessControl 元素。必須提供 webServerNetworkAccessControl 元素,但不得包含 allowedIpRanges 元素。

{
  "config": {
    "webServerNetworkAccessControl": {
      "allowedIpRanges": [
        {
          "value": "WS_IP_RANGE",
          "description": "WS_RANGE_DESCRIPTION"
        }
      ]
    }
  }
}

更改下列內容:

  • WS_IP_RANGE:可存取 Airflow UI 的 IP 範圍,以 CIDR 標記法表示。
  • WS_RANGE_DESCRIPTION:IP 範圍的說明。

範例:

// PATCH https://composer.googleapis.com/v1/projects/example-project/
// locations/us-central1/environments/example-environment?updateMask=
// config.webServerNetworkAccessControl

{
  "config": {
    "webServerNetworkAccessControl": {
      "allowedIpRanges": [
        {
          "value": "192.0.2.0/24",
          "description": "example range"
        },
        {
          "value": "192.0.4.0/24",
          "description": "example range 2"
        }
      ]
    }
  }
}

Terraform

allowed_ip_range 區塊的 web_server_network_access_control 中,指定可存取網路伺服器的 IP 範圍。

resource "google_composer_environment" "example" {
  provider = google-beta
  name = "ENVIRONMENT_NAME"
  region = "LOCATION"

  config {

    web_server_network_access_control {

      allowed_ip_range {
        value = "WS_IP_RANGE"
        description = "WS_RANGE_DESCRIPTION"
      }

    }

  }
}

更改下列內容:

  • WS_IP_RANGE:可存取 Airflow UI 的 IP 範圍,以 CIDR 標記法表示。
  • WS_RANGE_DESCRIPTION:IP 範圍的說明。

範例:

resource "google_composer_environment" "example" {
  provider = google-beta
  name = "example-environment"
  region = "us-central1"

  config {

    web_server_network_access_control {
      allowed_ip_range {
        value = "192.0.2.0/24"
        description = "example range"
      },
      allowed_ip_range {
        value = "192.0.4.0/24"
        description = "example range 2"
      }

    }
}

後續步驟