app.yaml 設定檔

app.yaml 檔案定義執行階段的配置設定,以及一般應用程式、網路和其他資源設定。

請勿將 app.yaml 新增至 .gcloudignore 檔案。部署作業可能需要 app.yaml,如果將其新增至 .gcloudignore,部署作業就會失敗。

語法

app.yaml 檔案的語法採用 YAML 格式。YAML 格式支援註解,因此系統會忽略以井字符號 (#) 字元開頭的行列,例如:

# This is a comment.

網址和檔案路徑模式會使用 POSIX 擴充規則運算式語法,但不包括對照元素和對照類別。系統支援對分組相符項目 (例如 \1) 的反向參照,也支援下列擴充項目:\w \W \s \S \d \D

一般設定

app.yaml 檔案可以包含以下的一般設定。請注意,其中部分設定為必要項目:

名稱說明
build_env_variables

(非必要) 如果您使用的是支援Buildpack的執行階段,可以在 app.yaml 檔案中定義建構環境變數。

詳情請參閱「 使用建構環境變數」。

runtime

這是必要旗標,應用程式使用的執行階段環境名稱。 舉例來說,如要指定執行階段環境,請使用:

env: flex 必要步驟:選取彈性環境。
service: service_name 如要建立服務,則為必要元素。如果是預設服務,則為選用元素。每項服務和每個版本都必須具有名稱。名稱可包含數字、字母和連字號,在彈性環境中,VERSION-dot-SERVICE-dot-PROJECT_ID 的總長度 (其中 VERSION 是版本名稱、SERVICE 是服務名稱,而 PROJECT_ID 是專案 ID) 不得超過 63 個字元,且開頭或結尾不得使用連字號。

如果您在部署時未指定服務名稱,系統會建立新版本的預設服務。如果您使用已存在的服務名稱部署,系統會建立該服務的新版本。如果您使用不存在的新服務名稱進行部署,系統會建立新服務和版本。建議您為每個服務與版本組合使用不重複的名稱。

附註:服務之前稱為「模組」。

service_account

(非必要) service_account 元素可讓您指定使用者自行管理的服務帳戶做為版本的身分。系統會在存取其他 Google Cloud 服務和執行工作時使用指定的服務帳戶。

服務帳戶必須採用下列格式:

service_account: [SERVICE_ACCOUNT_NAME]@[PROJECT_ID].iam.gserviceaccount.com
skip_files

選用。skip_files 元素會指定應用程式目錄中哪些檔案不要上傳到 App Engine。值可以是單一規則運算式或規則運算式清單。上傳應用程式時,系統會忽略檔案清單中與任一規則運算式相符的所有檔案名稱。

舉例來說,如要略過名稱結尾為 .bak 的檔案,請新增 skip_files 區段,如下所示:

skip_files:
- ^.*\.bak$

網路設定

您可以在 app.yaml 設定檔中指定網路設定,例如:

network:
  name: NETWORK_NAME
  instance_ip_mode: INSTANCE_IP_MODE
  instance_tag: TAG_NAME
  subnetwork_name: SUBNETWORK_NAME
  session_affinity: true
  forwarded_ports:
    - PORT
    - HOST_PORT:CONTAINER_PORT
    - PORT/tcp
    - HOST_PORT:CONTAINER_PORT/udp

在設定網路設定時,您可以使用以下選項:

選項 說明
name 彈性環境中的每個 VM 執行個體會在建立時指派至 Google Compute Engine 網路。您可以使用這個設定來指定網路名稱。並提供簡稱,而非資源路徑 (例如提供 default,而不是 https://www.googleapis.com/compute/v1/projects/my-project/global/networks/default)。如果您未指定網路名稱,系統會將執行個體指派給專案的預設網路 (名稱為 default)。如果您要指定子網路名稱,則必須指定網路名稱。
instance_ip_mode (非必要) 如要避免執行個體收到暫時性外部 IP 位址,請將其設為 internal,並啟用 私人 Google 存取權。如果先前部署的執行個體沒有這項設定,或是設定為 external,請將設定改為 internal,即可從執行個體中移除臨時外部 IP 位址。internal 設定有限制。預設值為 external
instance_tag (非必要) 在執行個體建立時,具有該名稱的標記會指派給服務的每個執行個體。標記在 gcloud 指令中相當實用,可用來向執行個體群組指定動作。如需相關範例,請參閱 compute firewalls-create 指令中 --source-tags--target-tags 標記的使用方式。

如果未指定,則在未使用共用虛擬私人雲端時,系統會為執行個體加上 aef-INSTANCE_ID 標記。如果使用共用虛擬私有雲,執行個體會標示為 aef-INSTANCE_ID and aef-instance.
subnetwork_name (非必要) 您可以劃分網路並使用自訂的子網路。請確保 name 網路已指定,並提供簡稱,而非資源路徑 (例如提供 default,而不是 https://www.googleapis.com/compute/v1/projects/my-project/global/networks/default/subnetworks/default)。子網路必須位在與應用程式相同的地區。
session_affinity (非必要) 如果設定為 true,App Engine 可以設定為將特定使用者的多項連續要求轉送到同一個 App Engine 執行個體,例如將工作階段中的使用者資料儲存在本機。工作階段相依性可檢查 Cookie 的值,以辨識相同使用者傳送的多個要求,然後將這類要求全部導向同一個執行個體。如果執行個體在數量減少的情況下重新啟動、健康狀態不良、超載或無法使用,則工作階段相依性將無法正常運作,系統會將後續要求轉送到不同的執行個體。請注意,啟用工作階段相依性會對您的負載平衡設定造成影響。這個參數預設為停用。
forwarded_ports (非必要) 您可以將通訊埠從執行個體 (HOST_PORT) 轉送到 Docker 容器 (CONTAINER_PORT)。HOST_PORT 必須介於 1024 和 65535 之間,且不得與下列通訊埠衝突:22、8080、8090、8443、10000、10001、10400-10500、11211、24231。CONTAINER_PORT 必須介於 1 到 65535 之間,且不得與下列連接埠衝突:22、10001、10400-10500、11211。如果只指定一個 PORT,則 App Engine 會假設主機和容器上的通訊埠為相同的。根據預設,TCP 和 UDP 流量均會受到轉送。流量必須直接指定為目標執行個體的 IP 位址,而不是透過 appspot.com 網域或您的自訂網域。

進階網路設定

您可以將 Compute Engine 網路劃分成子網路。這樣做可讓您啟用 VPN 情境,像是在公司網路內存取資料庫等等。

如要啟用 App Engine 應用程式的子網路:

  1. 建立自訂子網路

  2. 上述指定,將網路名稱和子網路名稱新增到您的 app.yaml 檔案。

  3. 如要建立以靜態轉送為基礎的簡易 VPN,請建立自訂子網路的閘道和通道,或前往瞭解如何建立其他類型的 VPN

通訊埠轉送

通訊埠轉送可允許其他方直接連線到執行個體上的 Docker 容器。此流量能夠通過任何通訊協定。您在需要附加偵錯工具或分析器時,通訊埠轉送就能派上用場。流量必須直接指定為目標執行個體的 IP 位址,而不是透過 appspot.com 網域或您的自訂網域。

根據預設,系統不會允許網路外部的連入流量通過 Google Cloud Platform 防火牆。在 app.yaml 檔案中指定通訊埠轉送後,您必須新增防火牆規則,允許來自要開啟的通訊埠的流量。

您可以前往 Google Cloud 主控台的「網路防火牆規則」頁面,或使用 gcloud 指令來指定防火牆規則。

舉例來說,如要轉送來自通訊埠 2222 的 TCP 流量:

  1. app.yaml 的網路設定中加入下列內容:

    network:
      forwarded_ports:
        - 2222/tcp
    
    1. 如果您使用 Python 執行階段,請修改 app.yaml 以納入下列項目:

      entrypoint: gunicorn -b :$PORT -b :2222 main:app
      
  2. Google Cloud 控制台中指定防火牆規則,或使用 gcloud compute firewall-rules create 允許來自任何來源 (0.0.0.0/0) 和 tcp:2222 的流量。

資源設定

這些設定可以控制運算資源。App Engine 會根據您指定的 CPU 和記憶體大小來指派機器類型。機器保證會具備您指定的資源層級 (可能會更高)。

您在資源設定中最多可指定八個 tmpfs 磁碟區。接著,您可以透過 tmpfs 啟用需要共用記憶體的工作負載,並且能改善檔案系統 I/O。

例如:

resources:
  cpu: 2
  memory_gb: 2.3
  disk_size_gb: 10
  volumes:
  - name: ramdisk1
    volume_type: tmpfs
    size_gb: 0.5

設定資源設定時,您可以使用以下選項:

選項 說明 預設
cpu 核心數量必須為 1、介於 2 至 32 之間的偶數,或是介於 32 至 80 之間 4 的倍數。 1 個核心
memory_gb

RAM (GB)。應用程式要求的記憶體,其中不包含某些程序負擔需占用最多達 0.4 GB 的記憶體容量。每個 CPU 核心需要介於 1.0 至 6.5 GB 之間的記憶體總量。

如要計算所需記憶體:

memory_gb = cpu * [1.0 - 6.5] - 0.4

對於上面指定 2 個核心的範例,您可以要求記憶體介於 1.6 至 12.6 GB。應用程式可用的記憶體總量是由執行階段環境設定為環境變數 GAE_MEMORY_MB

0.6 GB
disk_size_gb 大小以 GB 為單位。最小值為 10 GB,最大值為 10240 GB。 13 GB
name 若使用磁碟區,則為必要項目。磁碟區的名稱。名稱必須唯一不重複,且長度介於 1 至 63 個字元之間。字元可為小寫字母、數字或破折號。第一個字元必須為字母,最後一個字元不能是破折號。磁碟區掛接在應用程式容器中,如同 /mnt/NAME
volume_type 若使用磁碟區,則為必要項目。必須為 tmpfs
size_gb 若使用磁碟區,則為必要項目。磁碟區大小 (GB)。最小值為 0.001 GB,最大值為應用程式容器以及所在裝置上可用的記憶體量。Google 不會為了滿足磁碟需求而將額外的 RAM 新增至系統。分配給 tmpfs 磁碟區的 RAM 將從應用程式容器可用的記憶體中減去。精確度則取決於系統。

分割健康狀態檢查

根據預設,系統會啟用分割健康狀態檢查。您可以透過定期健康狀態檢查要求,確認是否成功部署 VM 執行個體,以及檢查執行中的執行個體是否維持健康狀態。每項健康狀態檢查都必須在指定的時間間隔內回應。

執行個體無法回應指定次數的連續健康狀態檢查要求時,即表示該執行個體的健康狀態不良。如果執行個體並未執行,則會重新啟動。如果執行個體尚未準備就緒,則不會收到任何用戶端要求。如果沒有可用的磁碟空間,健康狀態檢查要求也會失敗。

健康狀態檢查有兩種類型:

  • 有效性檢查可確認 VM 和 Docker 容器是否正在執行。App Engine 會重新啟動健康狀態不良的執行個體。
  • 就緒檢查可確認執行個體是否準備好接受傳入的要求。未通過就緒檢查的執行個體不會新增到可用的執行個體集區中。

在預設情況下,來自健康狀態檢查的 HTTP 要求不會轉送到您的應用程式容器。如要將健康狀態檢查延伸到應用程式,請指定有效性檢查就緒檢查的路徑。如果針對應用程式的自訂健康狀態檢查傳回 200 OK 回應碼,則可視為檢查成功。

有效性檢查

有效性檢查可確認 VM 和 Docker 容器是否正在執行。判斷為不健康的執行個體將會重新啟動。

您可以將選用的 liveness_check 區段新增至 app.yaml 檔案,即可自訂有效性健康狀態檢查要求,如下所示:

liveness_check:
  path: "/liveness_check"
  check_interval_sec: 30
  timeout_sec: 4
  failure_threshold: 2
  success_threshold: 2

有效性檢查可採用下列設定:

欄位 預設 範圍 (下限 - 上限) 說明
path 如要轉送有效性檢查至應用程式容器,請指定網址路徑,例如 "/liveness_check"
timeout_sec 4 秒 1-300 每項要求的逾時間隔 (以秒為單位)。
check_interval_sec 30 秒 1-300 檢查之間的時間間隔 (以秒為單位)。請注意,這個值必須大於 timeout_sec。
failure_threshold 4 次檢查 1-10 如果執行個體經過這些次數的連續健康狀態檢查時失敗,則視為不健康。
success_threshold 2 次檢查 1-10 如果不健康的執行個體在經過這些次數的連續健康檢查時成功回應,則視為恢復健康。
initial_delay_sec 300 秒 0-3600 執行個體啟動後的延遲 (以秒為單位),在此期間會忽略健康狀態檢查回應。此設定會套用至每個新建立的執行個體,可允許新執行個體擁有更多時間啟動及執行。如果執行個體正在啟動中,這個設定會延遲自動修復,導致無法檢查並且可能會過早重新建立執行個體。當執行個體處於 RUNNING 模式下時,初始延遲計時器會啟動。舉例來說,如果應用程式必須先完成費時的初始化工作,才能就緒提供流量,您可能就會想要增加延遲。

完備性檢查

就緒檢查可確認執行個體能夠接受傳入的要求。未通過就緒檢查的執行個體不會新增到可用的執行個體集區中。

您可以將選用的 readiness_check 區段新增至 app.yaml 檔案,即可自訂健康狀態檢查要求,如下所示:

readiness_check:
  path: "/readiness_check"
  check_interval_sec: 5
  timeout_sec: 4
  failure_threshold: 2
  success_threshold: 2
  app_start_timeout_sec: 300

就緒檢查可採用下列設定:

欄位 預設 範圍 (下限 - 上限) 說明
path 如要轉送就緒檢查至應用程式容器,請指定網址路徑,例如 "/readiness_check"
timeout_sec 4 秒 1-300 每項要求的逾時間隔 (以秒為單位)。
check_interval_sec 5 秒 1-300 檢查之間的時間間隔 (以秒為單位)。請注意,這個值必須大於 timeout_sec。
failure_threshold 2 次檢查 1-10 如果執行個體經過這些次數的連續健康狀態檢查時失敗,則視為不健康。
success_threshold 2 次檢查 1-10 如果不健康的執行個體在經過這些次數的連續健康檢查時成功回應,則視為恢復健康。
app_start_timeout_sec 300 秒 1-1800 這項設定會套用至新的部署 (而非個別 VM)。此設定會指定足以讓部署中一定數量的執行個體通過健康狀態檢查的時間長度上限 (單位為秒)。如果超過這段期間,部署則會失敗並復原。當系統佈建 Compute Engine 執行個體,並建立負載平衡器後端服務時,計時器就會啟動。舉例來說,如果您希望在部署期間提供較長的逾時,以讓足夠數量的執行個體變得健康時,可能就需要增加逾時。

健康狀態檢查頻率

為確保高可用性,App Engine 會為每個健康狀態檢查工具建立備援複本。當健康狀態檢查工具作業失敗時,備援的檢查工具能接續工作以避免延誤。

檢查應用程式的 nginx.health_check 記錄時,您可能會發現健康狀態檢查輪詢頻率高於設定值,這是因為備援的健康狀態檢查工具也會按照您的設定作業。這些備援健康狀態檢查工具皆為系統自動建立,無法予以設定。

服務資源調度設定

控管如何調度服務資源的金鑰是根據您指派給服務的資源調度類型而定。

您可以選擇使用自動或手動調整資源配置,預設值為自動調整資源配置。

自動調整資源配置

app.yaml 檔案中加入 automatic_scaling 區段,即可設定自動調整資源配置。例如:

automatic_scaling:
  min_num_instances: 1
  max_num_instances: 15
  cool_down_period_sec: 180
  cpu_utilization:
    target_utilization: 0.6
  target_concurrent_requests: 100

下表列出可與自動調整資源配置搭配使用的設定:

名稱 說明
automatic_scaling 系統預設採用的設定為自動調整資源配置。如要指定任何自動調整資源配置的設定,請加入此行。
min_num_instances 提供給服務的執行個體數量下限。服務部署完成時,系統會提供這些數量的執行個體並根據流量調整資源。這項設定必須具有 1 以上的值,預設值為 2 以便減少延遲時間。
max_num_instances 服務可以擴充的執行個體數量上限。專案的資源配額會限制專案中的執行個體數量上限。預設值為 20
cool_down_period_sec 自動配置器從新的執行個體開始收集資訊前應等待的秒數。這可以防止自動配置器在執行個體初始化時收集資訊 (初始化期間收集的使用情形並不可靠)。等待期間的秒數必須大於或等於 60 秒。預設值為 120
cpu_utilization 如要指定目標 CPU 使用率,請使用這個標頭。
target_utilization 目標 CPU 使用率。CPU 使用率是所有運作中執行個體的平均值,並用來決定減少或增加執行個體數量的時機。請注意,無論是否有傳輸中的要求,執行個體在收到關閉信號的 25 秒後都會縮減。預設值為 0.5
target_concurrent_requests

(Beta) 每個執行個體的並行連線目標數量。 如果您為這個參數指定值,自動配置器會使用所有執行中執行個體的平均並行連線數,決定何時減少或增加執行個體數量。無論是否有正在處理的要求,執行個體在收到關閉信號的 25 秒後都會縮減。

如果未指定此參數的值,自動配置器就不會針對每個執行個體的並發連線數量設定目標。

連線與要求不同。用戶端可以重複使用連線,傳送多個要求。

手動調整資源配置

app.yaml 檔案中加入 manual_scaling 區段,即可設定手動調整資源配置。例如:

manual_scaling:
  instances: 5

下表列出可與手動調整資源配置搭配使用的設定:

名稱說明
manual_scaling 針對某項服務啟用手動調整資源配置的必要設定。
instances 指派給服務的執行個體數量。

定義環境變數

您可以在 app.yaml 中定義環境變數,以供應用程式使用,例如:

env_variables:
  MY_VAR: "my value"

其中 MY_VARmy value 是您要定義的環境變數名稱和值,而且各個環境變數項目位在 env_variables 元素下方並縮排兩個空格。

使用環境變數