Cloud Composer 3 | Cloud Composer 2 | Cloud Composer�
本頁面說明如何為 Cloud Composer 環境安裝 Python 套件。
Cloud Composer 中的套件簡介
本節說明 Cloud Composer 中的 PyPI 套件運作方式。
Cloud Composer 映像檔中預先安裝和自訂的 PyPI 套件
Cloud Composer 映像檔包含預先安裝和自訂的 PyPI 套件。
- 預先安裝的 PyPI 套件是指環境的 Cloud Composer 映像檔中包含的套件。每個 Cloud Composer 映像檔都包含適用於特定 Cloud Composer 和 Airflow 版本的 PyPI 套件。 
- 自訂 PyPI 套件是指您可以在環境中安裝的套件,預先安裝的套件除外。 
管理 Cloud Composer 環境的 PyPI 套件的選項
| 選項 | 適用情況 | 
|---|---|
| 從 PyPI 安裝 | 在環境中安裝套件的預設方式 | 
| 從具有公開 IP 位址的存放區安裝 | 套件託管在 PyPI 以外的套件存放區。 這個存放區有公開 IP 位址 | 
| 從 Artifact Registry 存放區安裝 | 套件託管在 Artifact Registry 存放區中 | 
| 從專案網路中的存放區安裝 | 您的環境無法存取公開網際網路。套件會託管在專案網路的套件存放區中。 | 
| 以本機 Python 程式庫的形式安裝 | PyPI 中找不到該套件,且程式庫沒有任何外部依附元件,例如 dist-packages。 | 
| 安裝外掛程式 | 這個套件提供外掛程式專屬功能,例如修改 Airflow 網頁介面。 | 
| PythonVirtualenvOperator | 您不想為所有 Airflow 工作站安裝套件,或是依附元件與預先安裝的套件相衝突。該套件可在 PyPI 中找到,且沒有任何外部依附元件。 | 
| KubernetesPodOperator 和 GKE 運算子 | 您需要無法透過 pip安裝的外部依附元件 (例如dist-packages),或是您需要位在內部 pip 伺服器的外部依附元件。這個選項需要更多設定和維護作業。只有在其他選項無效時才考慮使用。 | 
事前準備
- 您必須具備可觸發環境更新作業的角色。此外,環境的服務帳戶必須具備角色,且該角色有足夠的權限可執行更新作業。 
- 如果您的環境受到 VPC Service Controls 範圍保護,您必須先授予其他使用者身分存取權,才能安裝 PyPI 依附元件。這些身分必須有權存取服務範圍保護的服務,並啟用私人 PyPI 存放區的支援功能。 
- 需求必須遵循 PEP-508 中指定的格式,其中每項需求都要以小寫指定,且包含套件名稱和選用的額外項目和版本指定碼。 
- PyPI 依附元件更新會在 Artifact Registry 中產生 Docker 映像檔。 
- 如果依附元件衝突導致更新失敗,您的環境會繼續以現有依附元件運作。如果作業成功,您就可以在 DAG 中開始使用新安裝的 Python 依附元件。 
- PythonVirtualenvOperator 不會使用環境 - pip.conf檔案中的設定。如要使用特定依附元件 (包括從自訂索引安裝),請在- requirements參數中以字串清單的形式傳遞需求條件。如要進一步瞭解格式,請參閱 pip 說明文件中的「需求檔案格式」。
查看 PyPI 套件清單
您可以取得環境的套件清單,格式不限。
查看預先安裝的套件
如要查看環境的預先安裝套件清單,請參閱環境的 Cloud Composer 映像檔套件清單。
查看所有套件
如要查看環境中的所有套件 (包括預先安裝和自訂套件):
gcloud
下列 gcloud CLI 指令會傳回環境中 Airflow 工作站的 python -m pip list 指令結果。您可以使用 --tree 引數取得 python -m pipdeptree --warn 指令的結果。
gcloud beta composer environments list-packages \
    ENVIRONMENT_NAME \
    --location LOCATION
取代:
- 將 ENVIRONMENT_NAME替換為環境的名稱。
- LOCATION改成環境所在的地區。
查看自訂 PyPI 套件
主控台
- 前往 Google Cloud 控制台的「Environments」頁面。 
- 在環境清單中,按一下環境名稱。 「環境詳細資料」頁面隨即開啟。 
- 前往「PyPI Packages」(PyPI 套件) 分頁。 
gcloud
gcloud composer environments describe ENVIRONMENT_NAME \
  --location LOCATION \
  --format="value(config.softwareConfig.pypiPackages)"
取代:
- 將 ENVIRONMENT_NAME替換為環境的名稱。
- LOCATION改成環境所在的地區。
在 Cloud Composer 環境中安裝自訂套件
本節說明在環境中安裝自訂套件的不同方法。
從 PyPI 安裝套件
如果套件沒有外部依附元件,或與預先安裝的套件發生衝突,則可以從 Python Package Index 安裝。
如何為環境新增、更新或刪除 Python 依附元件:
主控台
- 前往 Google Cloud 控制台的「Environments」頁面。 
- 在環境清單中,按一下環境名稱。 「環境詳細資料」頁面隨即開啟。 
- 前往「PyPI packages」(PyPI 套件) 分頁。 
- 按一下 [編輯] 
- 按一下「新增套件」。 
- 在「PyPI packages」(PyPI 套件) 部分,指定套件名稱,並可選擇加入版本指定碼和額外項目。 - 例如: - scikit-learn
- scipy、- >=0.13.3
- nltk、- [machine_learning]
 
- 按一下 [儲存]。 
gcloud
gcloud CLI 提供多個引數,可處理自訂 PyPI 套件:
- --update-pypi-packages-from-file會將所有現有的自訂 PyPI 套件替換為指定套件。系統會移除您未指定的套件。
- --update-pypi-package更新或安裝一個套件。
- --remove-pypi-packages會移除指定套件。
- --clear-pypi-packages會移除所有套件。
從檔案安裝需求
requirements.txt 檔案中的每個需求指定碼都必須獨立成行。
例如:
scipy>=0.13.3
scikit-learn
nltk[machine_learning]
更新環境,並在 --update-pypi-packages-from-file 引數中指定 requirements.txt 檔案。
gcloud composer environments update ENVIRONMENT_NAME \
    --location LOCATION \
     --update-pypi-packages-from-file requirements.txt
取代:
- 將 ENVIRONMENT_NAME替換為環境的名稱。
- LOCATION改成環境所在的地區。
安裝一個套件
更新環境,並在 --update-pypi-package 引數中指定套件、版本和額外項目。
gcloud composer environments update ENVIRONMENT_NAME \
    --location LOCATION \
     --update-pypi-package PACKAGE_NAMEEXTRAS_AND_VERSION
取代:
- 將 ENVIRONMENT_NAME替換為環境的名稱。
- LOCATION改成環境所在的地區。
- PACKAGE_NAME替換為套件名稱。
- EXTRAS_AND_VERSION,並視需要提供版本和額外項目指定碼。如要省略版本和額外項目,請指定空白值。
範例:
gcloud composer environments update example-environment \
    --location us-central1 \
    --update-pypi-package "scipy>=0.13.3"
移除套件
更新環境,並在 --remove-pypi-packages 引數中指定要刪除的套件:
gcloud composer environments update ENVIRONMENT_NAME \
    --location LOCATION \
     --remove-pypi-packages PACKAGE_NAMES
取代:
- 將 ENVIRONMENT_NAME替換為環境的名稱。
- LOCATION改成環境所在的地區。
- PACKAGE_NAMES,並以半形逗號分隔套件清單。
範例:
gcloud composer environments update example-environment \
    --location us-central1 \
    --remove-pypi-packages scipy,scikit-learn
API
建構 environments.patch API 要求。
在這個要求中:
- 在 - updateMask參數中指定遮罩:- 使用 config.softwareConfig.pypiPackages遮罩將所有現有套件替換為指定套件。系統會刪除您未指定的套件。
- 使用 config.softwareConfig.envVariables.PACKAGE_NAME新增或更新特定套件。如要新增或更新多個套件,請以半形逗號分隔指定多個遮罩。
 
- 使用 
- 在要求內文中,指定版本和額外項目的套件和值: - { "config": { "softwareConfig": { "pypiPackages": { "PACKAGE_NAME": "EXTRAS_AND_VERSION" } } } }- 取代: - PACKAGE_NAME替換為套件名稱。
- EXTRAS_AND_VERSION,並視需要提供版本和額外項目指定碼。如要省略版本和額外項目,請指定空白值。
- 如要新增多個套件,請在 pypiPackages中新增套件的額外項目。
 
範例:
// PATCH https://composer.googleapis.com/v1/projects/example-project/
// locations/us-central1/environments/example-environment?updateMask=
// config.softwareConfig.pypiPackages.EXAMPLE_PACKAGE,
// config.softwareConfig.pypiPackages.ANOTHER_PACKAGE
{
  "config": {
    "softwareConfig": {
      "pypiPackages": {
        "EXAMPLE_PACKAGE": "",
        "ANOTHER_PACKAGE": ">=1.10.3"
      }
    }
  }
}
Terraform
software_config 區塊中的 pypi_packages 區塊會指定套件。
resource "google_composer_environment" "example" {
  name = "ENVIRONMENT_NAME"
  region = "LOCATION"
  config {
    software_config {
      pypi_packages = {
          PACKAGE_NAME = "EXTRAS_AND_VERSION"
      }
    }
  }
}
取代:
- 將 ENVIRONMENT_NAME替換為環境的名稱。
- LOCATION改成環境所在的地區。
- PACKAGE_NAME替換為套件名稱。
- EXTRAS_AND_VERSION,並視需要提供版本和額外項目指定碼。如要省略版本和額外項目,請指定空白值。
- 如要新增多個套件,請在 pypi_packages中新增套件的額外項目。
範例:
resource "google_composer_environment" "example" {
  name = "example-environment"
  region = "us-central1"
  config {
    software_config {
      pypi_packages = {
          scipy = ">=1.10.3"
          scikit-learn = ""
          nltk = "[machine_learning]"
      }
    }
  }
}
從公開存放區安裝套件
您可以安裝其他存放區中託管的套件,這些存放區具有公開 IP 位址。
套件必須正確設定,預設 pip 工具才能安裝。
如要從具有公開位址的套件存放區安裝套件,請按照下列步驟操作:
- 建立 pip.conf 檔案,並在檔案中加入下列資訊 (如適用): - 存放區網址 (位於 index-url參數中)
- 存放區的存取憑證
- 非預設 pip安裝選項
 - 範例: - [global] index-url=https://example.com/
- 存放區網址 (位於 
- (選用) 在某些情況下,您可能會想從多個存放區擷取套件,例如公開存放區包含您想安裝的特定套件,而您想從 PyPI 安裝所有其他套件: - 設定 Artifact Registry 虛擬存放區。
- 為多個存放區 (包括 PyPI,視需要) 新增設定,並定義 pip搜尋存放區的順序。
- 在 index-url參數中指定虛擬存放區的網址。
 
- 將 pip.conf 檔案上傳至環境值區的 - /config/pip/資料夾。
- 使用其中一種可用方法安裝套件。 
從 Artifact Registry 存放區安裝套件
您可以在專案的 Artifact Registry 存放區中儲存套件,並設定環境從中安裝套件。
設定角色和權限:
- 請確認 Cloud Build 服務帳戶具備從 Artifact Registry 存放區讀取的權限。 
- 如存取控管一文所述,授予環境的服務帳戶其他權限,以便從 Artifact Registry 存放區安裝套件。 
- 如果您的環境限制存取專案中的其他服務 (例如使用 VPC Service Controls): - 將存取 Artifact Registry 存放區的權限指派給環境的服務帳戶,而非 Cloud Build 服務帳戶。 
- 確認專案中已設定 Artifact Registry 存放區的連線。 
 
如要從 Artifact Registry 存放區安裝自訂 PyPI 套件,請按照下列步驟操作:
- 建立 pip.conf 檔案,並在檔案中加入下列資訊 (如適用): - Artifact Registry 存放區的網址 (位於 index-url參數中)
- 存放區的存取憑證
- 非預設 pip安裝選項
 - 如果是 Artifact Registry 存放區,請在存放區網址後方附加 - /simple/:- [global] index-url = https://us-central1-python.pkg.dev/example-project/example-repository/simple/
- Artifact Registry 存放區的網址 (位於 
- (選用) 在某些情況下,您可能會想從多個存放區擷取套件,例如當 Artifact Registry 存放區包含您想安裝的特定套件,而您想從 PyPI 安裝所有其他套件時: - 設定 Artifact Registry 虛擬存放區。
- 為多個存放區 (包括 PyPI,視需要) 新增設定,並定義 pip搜尋存放區的順序。
- 在 index-url參數中指定虛擬存放區的網址。
 
- 將這個 pip.conf 檔案上傳至環境值區的 - /config/pip/資料夾。例如:- gs://us-central1-example-bucket/config/pip/pip.conf。
- 使用其中一種可用方法安裝套件。 
從私人存放區安裝套件
您可以在專案的網路中代管私人存放區,並設定環境,從中安裝 Python 套件。
設定角色和權限:
- 如果您從專案網路中的存放區安裝自訂 PyPI 套件,且該存放區沒有公開 IP 位址,請按照下列步驟操作: - 將存取這個存放區的權限指派給環境的服務帳戶。 
- 請確認專案中已設定這個存放區的連線。 
 
- 如需為環境的服務帳戶授予從私人存放區安裝套件的其他權限,請參閱「存取權控管」。 
如要從專案網路中代管的私人存放區安裝套件,請按照下列步驟操作:
- 建立 pip.conf 檔案,並在檔案中加入下列資訊 (如適用): - 專案網路中存放區的 IP 位址
- 存放區的存取憑證
- 非預設 pip安裝選項
 - 範例: - [global] index-url=https://192.0.2.10/
- (選用) 在某些情況下,您可能會想從多個存放區擷取套件,例如私人存放區包含您想安裝的特定套件,而您想從 PyPI 安裝所有其他套件: - 設定 Artifact Registry 虛擬存放區。
- 為多個存放區 (包括 PyPI,視需要) 新增設定,並定義 pip搜尋存放區的順序。
- 在 index-url參數中指定虛擬存放區的網址。
 
- 將 pip.conf 檔案上傳至環境值區的 - /config/pip/資料夾。例如:- gs://us-central1-example-bucket/config/pip/pip.conf。
- 使用其中一種可用方法安裝套件。 
安裝本機 Python 程式庫
如何安裝內部或本機 Python 程式庫:
- 將依附元件放在環境值區的 - dags/資料夾子目錄中。如要從子目錄匯入模組,模組路徑中的每個子目錄都必須包含- __init__.py套件標記檔案。- 在以下範例中,依附元件為 - coin_module.py:- dags/ use_local_deps.py # A DAG file. dependencies/ __init__.py coin_module.py
- 從 DAG 定義檔匯入依附元件。 - 例如: 
使用依附於共用物件程式庫的套件
部分 PyPI 套件依附於系統層級的程式庫。Cloud Composer 不支援系統程式庫,但您可以採取下列做法:
- 使用 KubernetesPodOperator。將運算子映像檔設為自訂建構映像檔。如果安裝套件時因系統依附元件不符而失敗,請使用這個選項。 
- 將共用物件程式庫上傳至環境的 bucket。如果 PyPI 套件已成功安裝,但執行階段失敗,請使用這個選項。 - 手動找出 PyPI 依附元件的共用物件程式庫 (.so 檔案)。
- 將共用物件程式庫上傳至環境 bucket 中的 /plugins資料夾。
- 設定下列環境變數:
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/airflow/gcs/plugins
 
在私人 IP 環境中安裝套件
視專案的設定方式而定,您的環境可能無法存取公共網路。
可存取公用網際網路的私人 IP 環境
如果私人 IP 環境可以存取公開網際網路,您可以使用公開 IP 環境的選項安裝套件:
- 從 PyPI 安裝。在這種情況下,不需要進行特殊設定。 按照「從 PyPI 安裝套件」一文所述的程序操作。
- 從具有公開 IP 位址的存放區安裝。 按照「從私人存放區安裝套件」一文所述的程序操作。
- 從專案網路中代管的私人 PyPI 存放區安裝。
無法存取網際網路的私人 IP 環境
如果您的私人 IP 環境無法存取公用網際網路,可以透過下列任一方式安裝套件:
- 使用專案網路中代管的私人 PyPI 存放區。
- 在專案的網路中使用Proxy 伺服器 VM,連線至公開網際網路上的 PyPI 存放區。在環境值區的 /config/pip/pip.conf檔案中指定 Proxy 位址。
- 使用 Artifact Registry 存放區做為套件的唯一來源。如要執行此操作,請重新定義 index-url參數,如說明所示。
- 如果安全政策允許從 VPC 網路存取外部 IP 位址,您可以設定 Cloud NAT,啟用從公開網際網路上的存放區安裝套件的功能。
- 將 Python 依附元件放入環境的 bucket 中的 /dags資料夾,將其安裝為本機程式庫。如果依附元件樹狀結構很大,這可能不是好方法。
在資源位置限制下安裝至私人 IP 環境
如果專案符合資源位置限制規定,就無法使用部分工具。具體來說,Cloud Build 無法用於安裝套件,因此無法直接存取公開網際網路上的存放區。
如要在這類環境中安裝 Python 依附元件,請按照無法存取網際網路的私人 IP 環境指南操作。
在 VPC Service Controls 範圍的私人 IP 環境中安裝 Python 依附元件
使用 VPC Service Controls 範圍保護專案會導致更多安全限制。具體來說,Cloud Build 無法用於安裝套件,因此無法直接存取公開網際網路上的存放區。
如要在邊界內的私人 IP 環境安裝 Python 依附元件,請按照沒有網際網路連線的私人 IP 環境指南操作。