File di configurazione app.yaml

Il file app.yaml definisce le impostazioni di configurazione per il runtime, nonché le impostazioni generali di app, rete e altre risorse.

Non aggiungere app.yaml al file .gcloudignore. app.yaml potrebbe essere necessario per il deployment e la sua aggiunta a .gcloudignore causerà il fallimento del deployment.

Sintassi

La sintassi del file app.yaml è il formato YAML. Il formato YAML supporta i commenti, in cui qualsiasi riga che inizia con il carattere del simbolo hash (#) viene ignorata, ad esempio:

# This is a comment.

I pattern di URL e percorsi file utilizzano la sintassi delle espressioni regolari estese POSIX, esclusi gli elementi di confronto e le classi di confronto. I riferimenti a ritroso alle corrispondenze raggruppate (ad es. \1) sono supportati, così come queste estensioni Perl: \w \W \s \S \d \D.

Impostazioni generali

Un file app.yaml può includere queste impostazioni generali. Tieni presente che alcuni sono obbligatori:

NomeDescrizione
build_env_variables

Facoltativo. Se utilizzi un runtime che supporta buildpack, puoi definire le variabili di ambiente di compilazione nel file app.yaml.

Per scoprire di più, consulta la sezione Utilizzare le variabili di ambiente di compilazione.

runtime

Obbligatorio. Il nome dell'ambiente di runtime utilizzato dalla tua app. Ad esempio, per specificare l'ambiente di runtime, utilizza:

env: flex Obbligatorio: seleziona l'ambiente flessibile.
service: service_name Obbligatorio se crei un servizio. Facoltativo per il servizio predefinito. Ogni servizio e ogni versione deve avere un nome. Un nome può contenere numeri, lettere e trattini. Nell'ambiente flessibile, la lunghezza combinata di VERSION-dot-SERVICE-dot-PROJECT_ID (dove VERSION è il nome della versione, SERVICE è il nome del servizio e PROJECT_ID è l'ID progetto) non può essere superiore a 63 caratteri e non può iniziare o terminare con un trattino.

Se esegui il deployment senza specificare un nome di servizio, viene creata una nuova versione del servizio predefinito. Se esegui il deployment con un nome di servizio esistente, viene creata una nuova versione del servizio. Se esegui il deployment con un nuovo nome di servizio che non esiste, vengono creati un nuovo servizio e una nuova versione. Ti consigliamo di utilizzare un nome univoco per ogni combinazione di servizio e versione.

Nota:in precedenza i servizi erano chiamati "moduli".

service_account

Facoltativo. L'elemento service_account consente di specificare un account di servizio gestito dall'utente come identità per la versione. L'account di servizio specificato verrà utilizzato per accedere ad altri servizi Google Cloud ed eseguire attività.

L'account di servizio deve essere fornito nel seguente formato:

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

Facoltativo. L'elemento skip_files specifica i file nella directory dell'applicazione che non devono essere caricati su App Engine. Il valore è un'espressione regolare o un elenco di espressioni regolari. Qualsiasi nome file che corrisponde a una delle espressioni regolari viene omesso dall'elenco dei file da caricare quando viene caricata l'applicazione.

Ad esempio, per saltare i file i cui nomi terminano con .bak, aggiungi una sezione skip_files come la seguente:

skip_files:
- ^.*\.bak$

Impostazioni di rete

Puoi specificare le impostazioni di rete nel file di configurazione app.yaml, ad esempio:

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

Quando configuri le impostazioni di rete, puoi utilizzare le seguenti opzioni:

Opzione Descrizione
name Ogni istanza VM nell'ambiente flessibile viene assegnata a una rete Google Compute Engine al momento della creazione. Utilizza questa impostazione per specificare il nome di una rete. Fornisci il nome breve, non il percorso della risorsa (ad esempio default anziché https://www.googleapis.com/compute/v1/projects/my-project/global/networks/default). Se non specifichi un nome di rete, le istanze vengono assegnate alla rete predefinita del progetto (che ha il nome default). Se vuoi specificare un nome di sottorete, devi specificare un nome di rete.
instance_ip_mode Facoltativo. Per impedire alle istanze di ricevere un indirizzo IP esterno effimero, imposta il valore su internal e attiva l'accesso privato Google. Se l'istanza è stata dipiattaforma in precedenza senza questa impostazione o se è stata dipiattaforma con questa impostazione impostata su external, il nuovo dipiattaforma con questa impostazione impostata su internal rimuove gli indirizzi IP esterni temporanei dalle istanze. L'impostazione internal presenta limitazioni. Il valore predefinito è external.
instance_tag Facoltativo. Un tag con questo nome viene assegnato a ogni istanza del servizio al momento della creazione. I tag possono essere utili nei comandi gcloud per scegliere come target di un'azione un gruppo di istanze. Ad esempio, consulta l'utilizzo dei flag --source-tags e --target-tags nel comando compute firewalls-create.

Se non specificato, l'istanza viene taggata con aef-INSTANCE_ID quando non viene utilizzata VPC condiviso. Se viene utilizzato un VPC condiviso, l'istanza viene taggata con entrambi i valori aef-INSTANCE_ID and aef-instance.
subnetwork_name Facoltativo. Puoi segmentare la tua rete e utilizzare una sottorete personalizzata. Assicurati che la rete name sia specificata. Specifica il nome breve, non il percorso della risorsa (ad esempio default anziché https://www.googleapis.com/compute/v1/projects/my-project/global/networks/default/subnetworks/default).La subnet deve trovarsi nella stessa regione dell'applicazione.
session_affinity Facoltativo. Imposta su true per configurare App Engine in modo che indirizzi più richieste sequenziali per un determinato utente alla stessa istanza App Engine, ad esempio quando memorizzi i dati utente localmente durante una sessione. L'affinità sessione consente di ispezionare il valore di un cookie per identificare più richieste dello stesso utente e poi indirizza tutte queste richieste alla stessa istanza. Se l'istanza viene riavviata, non è in stato ottimale, è sovraccaricata o non è disponibile quando il numero di istanze è stato ridotto, l'affinità sessione viene interrotta e le richieste successive vengono inoltrate a un'altra istanza. Tieni presente che l'attivazione dell'affinità sessione può influire sulla configurazione del bilanciamento del carico. Questo parametro è disattivato per impostazione predefinita.
forwarded_ports Facoltativo. Puoi inoltrare le porte dall'istanza (HOST_PORT) al contenitore Docker (CONTAINER_PORT). HOST_PORT deve essere compreso tra 1024 e 65535 e non può entrare in conflitto con le seguenti porte: 22, 8080, 8090, 8443, 10000, 10001, 10400-10500, 11211, 24231. CONTAINER_PORT deve essere compreso tra 1 e 65535 e non può entrare in conflitto con le seguenti porte: 22, 10001, 10400-10500, 11211. Se specifichi solo un PORT, App Engine presume che si tratti della stessa porta sull'host e sul contenitore. Per impostazione predefinita, viene inoltrato sia il traffico TCP che UDP. Il traffico deve essere indirizzato direttamente all'indirizzo IP dell'istanza di destinazione anziché tramite il dominio appspot.com o il tuo dominio personalizzato.

Configurazione di rete avanzata

Puoi suddividere la rete Compute Engine in sottoreti. In questo modo, puoi attivare scenari VPN, ad esempio l'accesso ai database all'interno della rete dell'azienda.

Per attivare le sottoreti per la tua applicazione App Engine:

  1. Crea una rete di subnet personalizzata.

  2. Aggiungi il nome della rete e il nome della subnet al file app.yaml, come specificato sopra.

  3. Per stabilire una VPN semplice basata sul routing statico, crea un gateway e un tunnel per una rete di subnet personalizzata. In caso contrario, scopri come creare altri tipi di VPN.

Port forwarding

Il port forwarding consente connessioni dirette al contenitore Docker sulle tue istanze. Questo traffico può viaggiare su qualsiasi protocollo. Il port forwarding è pensato per aiutarti in situazioni in cui potresti dover collegare un debugger o un profiler. Il traffico deve essere indirizzato direttamente all'indirizzo IP dell'istanza di destinazione anziché tramite il dominio appspot.com o il tuo dominio personalizzato.

Per impostazione predefinita, il traffico in entrata dall'esterno della rete non è consentito tramite i firewall della piattaforma Google Cloud. Dopo aver specificato il port forwarding nel file app.yaml, devi aggiungere una regola firewall che consenta il traffico dalle porte che vuoi aprire.

Puoi specificare una regola firewall nella pagina Regole firewall di rete della console Google Cloud o utilizzando i comandi gcloud.

Ad esempio, se vuoi inoltrare il traffico TCP dalla porta 2222:

  1. Nelle impostazioni di rete del tuo app.yaml, includi:

    network:
      forwarded_ports:
        - 2222/tcp
    
    1. Se utilizzi il runtime Python, modifica app.yaml in modo da includere:

      entrypoint: gunicorn -b :$PORT -b :2222 main:app
      
  2. Specifica una regola del firewall nella console Google Cloud o utilizza gcloud compute firewall-rules create per consentire il traffico da qualsiasi origine (0.0.0.0/0) e da tcp:2222.

Impostazioni risorse

Queste impostazioni controllano le risorse di calcolo. App Engine assegna un tipo di macchina in base alla quantità di CPU e memoria specificate. È garantito che la macchina abbia almeno il livello di risorse che hai specificato, ma potrebbe avere di più.

Puoi specificare fino a otto volumi di tmpfs nelle impostazioni delle risorse. Puoi quindi attivare i carichi di lavoro che richiedono memoria condivisa tramite tmpfs e migliorare l'I/O del file system.

Ad esempio:

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

Quando configuri le impostazioni delle risorse, puoi utilizzare le seguenti opzioni:

Opzione Descrizione Predefinito
cpu Il numero di core; deve essere uno, un numero pari compreso tra 2 e 32 o un multiplo di 4 compreso tra 32 e 80. 1 core
memory_gb

RAM in GB. La memoria richiesta per l'applicazione, che non include circa 0,4 GB di memoria necessari per l'overhead di alcuni processi. Ogni core della CPU richiede una memoria totale compresa tra 1,0 e 6,5 GB.

Per calcolare la memoria richiesta:

memory_gb = cpu * [1,0 - 6,5] - 0,4

Nell'esempio precedente, in cui hai specificato 2 core, puoi richiedere da 1,6 a 12,6 GB. La quantità totale di memoria disponibile per l'applicazione viene impostata dall'ambiente di runtime come variabile di ambiente GAE_MEMORY_MB.

0,6 GB
disk_size_gb Dimensioni in GB. Il valore minimo è 10 GB e il valore massimo è 10240 GB. 13 GB
name Obbligatorio se utilizzi volumi. Nome del volume. I nomi devono essere univoci e avere una lunghezza compresa tra 1 e 63 caratteri. I caratteri possono essere lettere minuscole, numeri o trattini. Il primo carattere deve essere una lettera e l'ultimo carattere non può essere un trattino. Il volume viene montato nel container dell'app come /mnt/NAME.
volume_type Obbligatorio se utilizzi volumi. Deve essere tmpfs.
size_gb Obbligatorio se utilizzi volumi. Dimensioni del volume, in GB. Il valore minimo è 0,001 GB e il valore massimo è la quantità di memoria disponibile nel contenitore dell'applicazione e sul dispositivo sottostante. Google non aggiunge RAM aggiuntiva al sistema per soddisfare i requisiti di spazio su disco. La RAM allocata per i volumi tmpfs verrà sottratta alla memoria disponibile per il contenitore dell'app. La precisione dipende dal sistema.

Controlli di integrità suddivisi

Per impostazione predefinita, i controlli di integrità periodici sono attivati. Puoi utilizzare richieste di controllo di integrità periodiche per confermare che un'istanza VM è stata dispiata correttamente e per verificare che un'istanza in esecuzione mantenga uno stato integro. Per ogni controllo di integrità deve essere fornita una risposta entro un intervallo di tempo specificato.

Un'istanza non è in stato integro quando non risponde a un numero specificato di richieste di controllo di integrità consecutive. Se un'istanza non è attiva, viene riavviata. Se un'istanza non è pronta, non riceverà richieste del client. Un controllo di integrità può non riuscire anche se non è disponibile spazio libero su disco.

Puoi utilizzare due tipi di controlli di integrità:

  • I controlli di attività confermano che la VM e il container Docker sono in esecuzione. App Engine riavvia le istanze non integre.
  • I controlli di idoneità confermano che l'istanza è pronta per accettare le richieste in entrata. Le istanze che non superano il controllo di idoneità non vengono aggiunte al pool di istanze disponibili.

Per impostazione predefinita, le richieste HTTP provenienti dai controlli di integrità non vengono inoltrate al contenitore dell'applicazione. Se vuoi estendere i controlli di integrità alla tua applicazione, specifica un percorso per i controlli di attività o per i controlli di idoneità. Un controllo di integrità personalizzato per la tua applicazione è considerato riuscito se restituisce un codice di risposta 200 OK.

Controlli dell'attività

I controlli di attività confermano che la VM e il contenitore Docker sono in esecuzione. Le istanze considerate non integre vengono riavviate.

Puoi personalizzare le richieste di verifica dell'esistenza verificando aggiungendo una sezione liveness_check facoltativa al file app.yaml, ad esempio:

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

Per i controlli di presenza sono disponibili le seguenti impostazioni:

Campo Predefinito Intervallo (min-max) Descrizione
path Nessuno Se vuoi che i controlli di attualità vengano inoltrati al contenitore dell'applicazione, specifica un percorso dell'URL, ad esempio "/liveness_check"
timeout_sec 4 secondi 1-300 Intervallo di timeout per ogni richiesta, in secondi.
check_interval_sec 30 secondi 1-300 Intervallo di tempo tra i controlli, in secondi. Tieni presente che questo valore deve essere maggiore di timeout_sec.
failure_threshold 4 controlli 1-10 Un'istanza è in stato non integro dopo aver superato questo numero di controlli consecutivi.
success_threshold 2 controlli 1-10 Un'istanza non integra torna a essere integra dopo aver risposto correttamente a questo numero di controlli consecutivi.
initial_delay_sec 300 secondi 0-3600 Il ritardo, in secondi, dopo l'avvio dell'istanza durante il quale le risposte ai controlli di integrità vengono ignorate. Questa impostazione si applica a ogni nuova istanza creata e può consentire a una nuova istanza di essere avviata più lentamente. L'impostazione ritarda la verifica della riparazione automatica e la potenziale ricreazione prematura dell'istanza se l'istanza è in fase di avvio. Il timer del ritardo iniziale si avvia quando l'istanza è in modalità RUNNING. Ad esempio, ti consigliamo di aumentare il ritardo se la tua applicazione ha attività di inizializzazione che richiedono molto tempo prima di essere pronta a gestire il traffico.

Controlli di idoneità

I controlli di idoneità confermano che un'istanza può accettare le richieste in entrata. Le istanze che non superano il controllo di idoneità non vengono aggiunte al pool di istanze disponibili.

Puoi personalizzare le richieste di controllo di integrità aggiungendo una sezione readiness_check facoltativa al file app.yaml, ad esempio:

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

Per i controlli di idoneità sono disponibili le seguenti impostazioni:

Campo Predefinito Intervallo (min-max) Descrizione
path Nessuno Se vuoi che i controlli di idoneità vengano inoltrati al contenitore dell'applicazione, specifica un percorso dell'URL, ad esempio "/readiness_check"
timeout_sec 4 secondi 1-300 Intervallo di timeout per ogni richiesta, in secondi.
check_interval_sec 5 secondi 1-300 Intervallo di tempo tra i controlli, in secondi. Tieni presente che questo valore deve essere maggiore di timeout_sec.
failure_threshold 2 controlli 1-10 Un'istanza è in stato non integro dopo aver superato questo numero di controlli consecutivi.
success_threshold 2 controlli 1-10 Un'istanza non integra diventa integra dopo aver risposto correttamente a questo numero di controlli consecutivi.
app_start_timeout_sec 300 secondi 1-1800 Questa impostazione si applica ai nuovi deployment, non alle singole VM. Specifica il tempo massimo in secondi consentito per un numero sufficiente di istanze in un deployment per superare i controlli di integrità. Se questa durata viene superata, il deployment non va a buon fine e viene eseguito il rollback. Il timer si avvia quando le istanze Compute Engine sono state provisionate e il servizio di backend del bilanciatore del carico è stato creato. Ad esempio, ti consigliamo di aumentare il timeout se vuoi impostare timeout più lunghi durante i deployment in modo che un numero sufficiente di istanze diventi stabile.

Frequenza del controllo di integrità

Per garantire un'alta disponibilità, App Engine crea copie ridondanti di ogni controllo di stato. Se un controllo di integrità non riesce, ne può essere assunto il controllo da parte di un controllo di integrità ridondante senza ritardi.

Se esamini i log nginx.health_check della tua applicazione, potresti notare che il polling del controllo di integrità avviene più di frequente di quanto hai configurato a causa dei controlli di integrità ridondanti che rispettano anche le tue impostazioni. Questi controlli di integrità ridondanti vengono creati automaticamente e non puoi configurarli.

Impostazioni di scalabilità del servizio

Le chiavi utilizzate per controllare il ridimensionamento di un servizio dipendono dal tipo di ridimensionamento assegnato al servizio.

Puoi utilizzare la scalabilità automatica o manuale. L'impostazione predefinita è la scalabilità automatica.

Scalabilità automatica

Puoi configurare la scalabilità automatica aggiungendo una sezione automatic_scaling al file app.yaml. Ad esempio:

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

La seguente tabella elenca le impostazioni che puoi utilizzare con la scalabilità automatica:

Nome Descrizione
automatic_scaling Per impostazione predefinita, si presume la scalabilità automatica. Includi questa riga se intendi specificare una delle impostazioni di scalabilità automatica.
min_num_instances Il numero minimo di istanze assegnate al servizio. Quando viene eseguito il deployment di un servizio, vengono assegnate queste istanze e il servizio viene scalato in base al traffico. Deve essere pari o superiore a 1. Il valore predefinito è 2 per ridurre la latenza.
max_num_instances Il numero massimo di istanze a cui può essere eseguito lo scale up del servizio. Il numero massimo di istanze nel progetto è limitato dalla quota di risorse del progetto. Il valore predefinito è 20.
cool_down_period_sec Il numero di secondi che l'autoscalabilità deve attendere prima di iniziare a raccogliere informazioni da una nuova istanza. In questo modo, il regolatore automatico della scalabilità non raccoglie informazioni durante l'inizializzazione dell'istanza, durante la quale l'utilizzo raccolto non sarebbe affidabile. Il periodo di recupero deve essere maggiore o uguale a 60 secondi. Il valore predefinito è 120.
cpu_utilization Utilizza questa intestazione se vuoi specificare l'utilizzo della CPU target.
target_utilization Utilizzo CPU target. L'utilizzo della CPU viene calcolato mediamente su tutte le istanze in esecuzione e viene utilizzato per decidere quando ridurre o aumentare il numero di istanze. Tieni presente che le istanze vengono ridimensionate indipendentemente dalle richieste in corso 25 secondi dopo che un'istanza riceve l'indicatore di arresto. Il valore predefinito è 0.5.
target_concurrent_requests

(Beta) Numero target di connessioni simultanee per istanza. Se specifichi un valore per questo parametro, il gestore della scalabilità automatica utilizza il numero medio di connessioni simultanee in tutte le istanze in esecuzione per decidere quando ridurre o aumentare il numero di istanze. L'istanza viene ridotta di 25 secondi dopo aver ricevuto l'indicatore di arresto, indipendentemente dalle richieste in corso.

Se non specifichi un valore per questo parametro, il ridimensionamento automatico non ha come target un numero di connessioni contemporanee per istanza.

Le connessioni sono diverse dalle richieste. Una connessione può essere riutilizzata da un client per inviare più richieste.

Scalabilità manuale

Puoi configurare il ridimensionamento manuale aggiungendo una sezione manual_scaling al file app.yaml. Ad esempio:

manual_scaling:
  instances: 5

La seguente tabella elenca le impostazioni che puoi utilizzare con la scalabilità manuale:

NomeDescrizione
manual_scaling Obbligatorio per attivare la scalabilità manuale per un servizio.
instances Il numero di istanze da assegnare al servizio.

Definizione delle variabili di ambiente

Puoi definire le variabili di ambiente in app.yaml per renderle disponibili per la tua app, ad esempio:

env_variables:
  MY_VAR: "my value"

dove MY_VAR e my value sono il nome e il valore della variabile di ambiente che vuoi definire e ogni voce della variabile di ambiente è rientrata di due spazi sotto l'elemento env_variables.

Utilizzo delle variabili di ambiente