安裝 Python 依附元件 (original) (raw)
Cloud Composer 3 | Cloud Composer 2 | Cloud Composer 1
本頁面說明如何為 Cloud Composer 環境安裝 Python 套件。
關於 Cloud Composer 中的套件
本節說明 PyPI 套件在 Cloud Composer 中的運作方式。
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 依附元件。
- Cloud Composer 會使用預設的 Cloud Build 服務帳戶,建構含有已安裝 PyPI 套件的映像檔。如果未設定預設的 Cloud Build 服務帳戶,系統會改用環境的服務帳戶。
- 在 2024 年 4 月 29 日或之後啟用 Cloud Composer API 的專案。除非您的機構覆寫
constraints/cloudbuild.disableCreateDefaultServiceAccount
政策,否則新專案在啟用 API 時不會佈建舊版 Cloud Build 服務帳戶。由於在 Cloud Composer 環境中安裝自訂 PyPI 套件時,系統預設會使用 Cloud Build,因此套件安裝作業可能會失敗。根據預設,系統會改用環境的服務帳戶,因此請務必將存取私人套件的必要額外權限也授予該服務帳戶。 - PythonVirtualenvOperator 不會使用環境
pip.conf
檔案中的設定。如果您想使用特定依附元件 (包括從自訂索引安裝依附元件),請將需求以字串清單的形式傳遞至requirements
參數。如要進一步瞭解格式,請參閱 pip 說明文件中的「需求檔案格式」。
查看 PyPI 套件清單
您可以透過多種格式取得環境的套件清單。
查看預先安裝的套件
如要查看環境的預先安裝套件清單,請參閱 環境的 Cloud Composer 映像檔套件清單。
查看所有套件
如要查看環境中的所有套件 (預先安裝和自訂套件),請按照下列步驟操作:
gcloud
下列 gcloud CLI 指令會針對您環境中的 Airflow worker 傳回 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 套件」分頁。
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 套件」分頁。
- 按一下 [編輯]
- 按一下「新增套件」。
- 在「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" {
provider = google-beta
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" {
provider = google-beta
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
參數中指定虛擬存放區的網址。
- 判斷環境值區的 URI。
- 上傳 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/
:
- Artifact Registry 存放區的網址 (位於
[global]
index-url = https://us-central1-python.pkg.dev/example-project/example-repository/simple/
- (選用) 在某些情況下,您可能會想從多個存放區擷取套件,例如當您的 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
參數中指定虛擬存放區的網址。
- (選用) 在 2.2.1 以上版本的 Cloud Composer 中,您可以使用自訂憑證,從私人存放區安裝套件。方法如下:
- 將憑證檔案上傳至環境值區的
/config/pip/
資料夾。 - 在 pip.conf 中,請在
cert
參數中指定憑證檔案名稱。請勿變更/etc/pip/
資料夾。
範例:
[global] cert =/etc/pip/example-certificate.pem
- 將憑證檔案上傳至環境值區的
- 上傳 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。將 Operator 映像檔設為自訂建構映像檔。如果套件在安裝期間因未滿足系統依附元件而失敗,請使用這個選項。
- 將共用物件程式庫上傳至環境的值區。如果 PyPI 套件已成功安裝,但在執行階段失敗,請使用這個選項。
- 手動找出 PyPI 依附元件 (.so 檔案) 的共用物件程式庫。
- 將共用物件程式庫上傳至環境值區的
/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 依附元件放入環境儲存桶的
/dags
資料夾中,即可將這些元件當作本機程式庫安裝。如果依附元件樹狀圖很大,這可能不是理想的做法。
在資源位置限制下,將應用程式安裝到私人 IP 環境
請注意,如果專案符合「資源位置限制」規定,就無法使用某些工具。特別是,Cloud Build 無法用於套件安裝作業,因此無法直接存取公開網際網路上的存放區。
如要在這種環境中安裝 Python 依附元件,請按照沒有網際網路存取權的私人 IP 環境的相關指南操作。
在 VPC Service Controls 範圍內的私人 IP 環境中安裝 Python 依附元件
使用 VPC Service Controls 範圍保護專案會導致進一步的安全限制。特別是,Cloud Build 無法用於套件安裝作業,因此無法直接存取公開網際網路上的存放區。
如要為邊界內的私人 IP 環境安裝 Python 依附元件,請按照沒有網路存取權的私人 IP 環境指南操作。