存取 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 檔案的工作負載不小,載入 DAG 的時間就可能超過 60 秒。為確保網路伺服器在 DAG 載入期間仍可存取,您可以設定非同步 DAG 載入,在背景以預先設定的時間間隔剖析及載入 DAG (適用於 composer-1.7.1-airflow-1.10.2 以上版本)。這項設定也能縮短 DAG 重新整理時間。

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

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

事前準備

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

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

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

存取 Airflow UI

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

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

從 Google Cloud 控制台存取 Airflow 使用者介面

如要從 Google Cloud 控制台存取 Airflow 使用者介面,請按照下列步驟操作:

  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 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. 在「網路設定」部分中,找出「網頁伺服器存取權控管」項目,然後按一下「編輯」

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

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

    • 如要只允許特定 IP 範圍存取,請選取「只允許來自特定 IP 位址的存取要求」。在「IP range」(IP 範圍) 欄位中,以 CIDR 標記法指定 IP 範圍。在「說明」欄位中,指定這個範圍的說明 (選填)。如要指定多個範圍,請按一下「新增 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"
      }

    }
}

後續步驟