Che cos'è l'hosting Python?

Per rendere disponibile un'applicazione Python su internet, è necessario un ambiente specializzato in grado di eseguire il codice, gestirne le dipendenze e fornirlo agli utenti. Questo è il ruolo dell'hosting Python: un servizio che fornisce l'infrastruttura server e lo stack software necessari configurati specificamente per eseguire applicazioni create con il linguaggio di programmazione Python. A differenza dell'hosting web generico, l'hosting Python è personalizzato per soddisfare i requisiti unici del linguaggio, come il supporto per framework, librerie e standard di distribuzione specifici.

Funzionalità principali dell'hosting Python

Quando valutano le opzioni per l'hosting di app Python, gli sviluppatori aziendali dovrebbero cercare un insieme specifico di funzionalità che consentano flessibilità, controllo e prestazioni. Un ambiente di hosting Python affidabile in genere offre:

  • Supporto per più versioni di Python: possibilità di selezionare la versione specifica dell'interprete Python (ad esempio 3.13,3.12,3.11) richiesta dall'applicazione
  • Supporto per ambienti virtuali: fondamentale per la gestione delle dipendenze, l'hosting dovrebbe consentire l'uso di strumenti come venv o virtualenv per creare ambienti isolati per ogni progetto
  • Compatibilità con server ASGI e WSGI: ASGI è generalmente preferito per le applicazioni moderne e asincrone che richiedono un'elevata concorrenza e comunicazione in tempo reale, mentre WSGI rimane adatto per app web più semplici e sincrone; un buon hosting offre la possibilità di installare e configurare entrambi questi server
  • Accesso alla gestione dei pacchetti: potrebbe essere necessario l'accesso alla shell o SSH per installare i pacchetti da Python Package Index (PyPI); mentre pip e un file requirements.txt sono stati l'approccio tradizionale, i progetti Python moderni utilizzano sempre più pyproject.toml per la gestione delle dipendenze, insieme a strumenti più recenti come uv per una risoluzione e un'installazione dei pacchetti più rapide ed efficienti
  • Supporto per database: facile integrazione con i database più diffusi utilizzati nelle applicazioni Python, come PostgreSQL e MySQL
  • Scalabilità: la capacità di scalare facilmente le risorse del server (CPU, RAM) in base alle esigenze di traffico ed elaborazione dell'applicazione
  • Integrazione Git: supporto per il deployment del codice direttamente da un repository Git per semplificare la pipeline CI/CD

Tipi di hosting Python

Le soluzioni di hosting Python vanno da opzioni semplici ed economiche ad ambienti potenti e altamente scalabili. La scelta giusta dipende dalla complessità dell'applicazione, dai requisiti di prestazioni e dalla necessità di controllo dello sviluppatore.

Tipo di hosting

Caso d'uso per sviluppatori

Esempio di problema che stai cercando di risolvere

Hosting condiviso

Uno sviluppatore che crea un blog personale, un semplice sito web di portfolio con un framework leggero come Flask o un piccolo progetto.

"Ho bisogno di un modo semplice ed economico per mettere online il mio progetto personale. Non ho bisogno di configurazioni speciali e il traffico sarà basso."

Hosting VPS (virtual private server)


Uno sviluppatore che lancia un sistema di gestione dei contenuti o un sito di e-commerce che richiede pacchetti di sistema specifici.

"Devo installare un server di memorizzazione nella cache come Redis e gestire un traffico moderato e prevedibile per il sito web di un cliente, ma un server dedicato completo è troppo costoso."

Hosting cloud/PaaS (platform as a service)


Uno sviluppatore aziendale che crea un microservizio scalabile o un'API web che deve gestire un traffico imprevedibile per il lancio di un nuovo prodotto.

"Ho bisogno che la mia applicazione si adatti automaticamente se viene pubblicata sui giornali e voglio concentrarmi sul mio codice, non sulla gestione dei server."

Hosting server dedicato


Un team di sviluppo che esegue un'applicazione di elaborazione dati a uso intensivo di risorse o una piattaforma di servizi finanziari con rigide norme di conformità.

"La mia applicazione elabora set di dati di grandi dimensioni e richiede la massima CPU e RAM senza contese. Inoltre, ho bisogno di un controllo completo sull'hardware per gli audit di sicurezza."

Tipo di hosting

Caso d'uso per sviluppatori

Esempio di problema che stai cercando di risolvere

Hosting condiviso

Uno sviluppatore che crea un blog personale, un semplice sito web di portfolio con un framework leggero come Flask o un piccolo progetto.

"Ho bisogno di un modo semplice ed economico per mettere online il mio progetto personale. Non ho bisogno di configurazioni speciali e il traffico sarà basso."

Hosting VPS (virtual private server)


Uno sviluppatore che lancia un sistema di gestione dei contenuti o un sito di e-commerce che richiede pacchetti di sistema specifici.

"Devo installare un server di memorizzazione nella cache come Redis e gestire un traffico moderato e prevedibile per il sito web di un cliente, ma un server dedicato completo è troppo costoso."

Hosting cloud/PaaS (platform as a service)


Uno sviluppatore aziendale che crea un microservizio scalabile o un'API web che deve gestire un traffico imprevedibile per il lancio di un nuovo prodotto.

"Ho bisogno che la mia applicazione si adatti automaticamente se viene pubblicata sui giornali e voglio concentrarmi sul mio codice, non sulla gestione dei server."

Hosting server dedicato


Un team di sviluppo che esegue un'applicazione di elaborazione dati a uso intensivo di risorse o una piattaforma di servizi finanziari con rigide norme di conformità.

"La mia applicazione elabora set di dati di grandi dimensioni e richiede la massima CPU e RAM senza contese. Inoltre, ho bisogno di un controllo completo sull'hardware per gli audit di sicurezza."

Passaggi per il deployment di un'app Python per tipo di hosting

Sebbene i passaggi di deployment fondamentali siano simili, il livello di intervento manuale e di controllo varia in modo significativo tra i diversi tipi di hosting.

Passaggio di deployment

Considerazioni per tipo di hosting

Preparazione dell'applicazione

Universale: assicurati che tutte le dipendenze siano elencate in un file pyproject.toml o in un file requirements.txt.

Scegli un provider host

Universale: seleziona la soluzione più adatta in base alle esigenze di controllo, scalabilità e budget della tua applicazione.

Configura l'ambiente

Condiviso: opzioni limitate, spesso controllate tramite un cPanel.

VPS/dedicato: accesso completo alla radice; devi installare manualmente Python, venv e le librerie di sistema. 

Cloud/PaaS: spesso gestito automaticamente dalla piattaforma; potrebbe essere necessario specificare solo una versione Python in un file di configurazione.

Carica il tuo codice


Condivisione: di solito tramite FTP o un gestore di file basato sul web.

VPS/dedicato: Git è preferito (ad esempio, git pull). 

Cloud/PaaS: di solito si integra direttamente con Git per i deployment automatizzati (ad esempio, gcloud run deploy).

Configura l'applicazione


Condiviso: opzioni di configurazione limitate. 

VPS/dedicato: controllo completo sulle variabili di ambiente e sulle configurazioni del server. 

Cloud/PaaS: gestito tramite file di configurazione del servizio (ad esempio, service.yaml) o una console web.

Installa le dipendenze

Condiviso: potrebbe essere limitato. 

VPS/Dedicated: pip install -r requirements.txt via SSH.

Cloud/PaaS: le dipendenze vengono in genere installate automaticamente dalla piattaforma durante il processo di creazione in base al file requirements.txt.

Esegui le migrazioni (se applicabile)

Condiviso: spesso richiede uno strumento specifico nel pannello di controllo. 

VPS/dedicato: esegui i comandi di migrazione direttamente tramite SSH. 

Cloud/PaaS: può essere configurato come parte di uno script post-deployment o eseguito come job separato.

Avvia il server dell'applicazione


Condiviso: di solito preconfigurato e gestito dall'host. 

VPS/dedicato: installi, configuri ed esegui manualmente un server WSGI come Gunicorn. 

Cloud/PaaS: la piattaforma gestisce automaticamente il server dell'applicazione.

Configura il dominio (facoltativo)


Universale: punta i record DNS del tuo dominio personalizzato all'indirizzo IP o al nome host fornito dal servizio di hosting.

Passaggio di deployment

Considerazioni per tipo di hosting

Preparazione dell'applicazione

Universale: assicurati che tutte le dipendenze siano elencate in un file pyproject.toml o in un file requirements.txt.

Scegli un provider host

Universale: seleziona la soluzione più adatta in base alle esigenze di controllo, scalabilità e budget della tua applicazione.

Configura l'ambiente

Condiviso: opzioni limitate, spesso controllate tramite un cPanel.

VPS/dedicato: accesso completo alla radice; devi installare manualmente Python, venv e le librerie di sistema. 

Cloud/PaaS: spesso gestito automaticamente dalla piattaforma; potrebbe essere necessario specificare solo una versione Python in un file di configurazione.

Carica il tuo codice


Condivisione: di solito tramite FTP o un gestore di file basato sul web.

VPS/dedicato: Git è preferito (ad esempio, git pull). 

Cloud/PaaS: di solito si integra direttamente con Git per i deployment automatizzati (ad esempio, gcloud run deploy).

Configura l'applicazione


Condiviso: opzioni di configurazione limitate. 

VPS/dedicato: controllo completo sulle variabili di ambiente e sulle configurazioni del server. 

Cloud/PaaS: gestito tramite file di configurazione del servizio (ad esempio, service.yaml) o una console web.

Installa le dipendenze

Condiviso: potrebbe essere limitato. 

VPS/Dedicated: pip install -r requirements.txt via SSH.

Cloud/PaaS: le dipendenze vengono in genere installate automaticamente dalla piattaforma durante il processo di creazione in base al file requirements.txt.

Esegui le migrazioni (se applicabile)

Condiviso: spesso richiede uno strumento specifico nel pannello di controllo. 

VPS/dedicato: esegui i comandi di migrazione direttamente tramite SSH. 

Cloud/PaaS: può essere configurato come parte di uno script post-deployment o eseguito come job separato.

Avvia il server dell'applicazione


Condiviso: di solito preconfigurato e gestito dall'host. 

VPS/dedicato: installi, configuri ed esegui manualmente un server WSGI come Gunicorn. 

Cloud/PaaS: la piattaforma gestisce automaticamente il server dell'applicazione.

Configura il dominio (facoltativo)


Universale: punta i record DNS del tuo dominio personalizzato all'indirizzo IP o al nome host fornito dal servizio di hosting.

Progetto di esempio: modulo web Python interattivo

Questa sezione mostra due esempi di creazione di applicazioni web interattive con Python, che dimostrano approcci e tecnologie diversi.

Flask e Gunicorn (approccio tradizionale)

Questa guida passo passo ti illustrerà come creare un'applicazione web semplice e interattiva utilizzando il framework Flask. Questa applicazione presenterà all'utente un modulo, elaborerà il suo input e visualizzerà una risposta personalizzata, un pattern fondamentale per molti servizi web e strumenti interni.

Passaggio 1: configura la directory del progetto locale

Per prima cosa, crea una cartella di progetto e passa al suo interno. È una best practice necessaria creare un ambiente virtuale per isolare le dipendenze del progetto ed evitare conflitti.

mkdir python-form-app && cd python-form-app

python3 -m venv venv

source venv/bin/activate

mkdir python-form-app && cd python-form-app

python3 -m venv venv

source venv/bin/activate

Passaggio 2: installa le dipendenze e crea il file dell'applicazione

Installa la libreria Flask per il framework web e Gunicorn, che è un server WSGI di livello di produzione per la distribuzione dell'applicazione.

pip install Flask gunicorn

pip install Flask gunicorn

Quindi, crea un file denominato main.py. Questo codice configura due route: una per visualizzare il modulo HTML (richiesta GET) e un'altra per gestire l'invio del modulo (richiesta POST).

import os

from flask import Flask, request, render_template_string

app = Flask(__name__)

# Define the HTML template for our form directly in the code for simplicity

FORM_TEMPLATE = """

<!DOCTYPE html>

<html>

<head>

    <title>Simple Form</title>

</head>

<body>

    <h1>Please enter your name</h1>

    <form action="/greet" method="post">

        <label for="name">Name:</label>

        <input type="text" id="name" name="name" required>

        <button type="submit">Submit</button>

    </form>

</body>

</html>

"""

# This route displays the form

@app.route("/", methods=['GET'])

def show_form():

    return render_template_string(FORM_TEMPLATE)

# This route processes the form submission

@app.route("/greet", methods=['POST'])

def greet_user():

    user_name = request.form['name']

    if not user_name:

        user_name = "World"

    return f"<h1>Hello, {user_name}!</h1>"

if __name__ == "__main__":

    app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))

import os

from flask import Flask, request, render_template_string

app = Flask(__name__)

# Define the HTML template for our form directly in the code for simplicity

FORM_TEMPLATE = """

<!DOCTYPE html>

<html>

<head>

    <title>Simple Form</title>

</head>

<body>

    <h1>Please enter your name</h1>

    <form action="/greet" method="post">

        <label for="name">Name:</label>

        <input type="text" id="name" name="name" required>

        <button type="submit">Submit</button>

    </form>

</body>

</html>

"""

# This route displays the form

@app.route("/", methods=['GET'])

def show_form():

    return render_template_string(FORM_TEMPLATE)

# This route processes the form submission

@app.route("/greet", methods=['POST'])

def greet_user():

    user_name = request.form['name']

    if not user_name:

        user_name = "World"

    return f"<h1>Hello, {user_name}!</h1>"

if __name__ == "__main__":

    app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))

Passaggio 3: crea un file di dipendenze

Crea un file requirements.txt per elencare le dipendenze del tuo progetto. Questo file è fondamentale per il deployment in qualsiasi ambiente di hosting, in quanto indica al server quali pacchetti installare.

pip freeze > requirements.txt

pip freeze > requirements.txt

Passaggio 4: testa l'applicazione su un server Python host locale

Esegui l'applicazione in locale per assicurarti che sia la visualizzazione del modulo sia la logica di invio funzionino correttamente.

python main.py

python main.py

Ora apri il browser web e vai a http://localhost:8080. Dovresti vedere una semplice pagina web con un modulo che ti chiede il nome. Inserisci il tuo nome e fai clic sul pulsante "Invia". La pagina dovrebbe aggiornarsi e mostrare un saluto personalizzato, a conferma che l'applicazione funziona come previsto.

Passaggio 5: preparati per la produzione

Per un deployment di produzione, devi utilizzare un server WSGI robusto come Gunicorn anziché il server di sviluppo integrato di Flask. Puoi testare questa interazione localmente con il seguente comando:

gunicorn --bind 0.0.0.0:8080 main:app

gunicorn --bind 0.0.0.0:8080 main:app

Ora l'applicazione interattiva è strutturata e convalidata correttamente, quindi è pronta per essere distribuita a un provider host di server Python professionale.

FastAPI e Uvicorn (approccio moderno e asincrono)

Questo esempio mostra come creare lo stesso modulo web interattivo utilizzando FastAPI, un framework web moderno, veloce (ad alte prestazioni) per la creazione di API con Python 3.7+ basato su suggerimenti di tipo Python standard. Uvicorn verrà utilizzato come server ASGI. Questo approccio è adatto alle applicazioni asincrone che richiedono un'elevata concorrenza.

Passaggio 1: configura la directory del progetto locale e installa le dipendenze

Per prima cosa, crea una directory di progetto e configura l'ambiente virtuale. Qui utilizziamo uv, un nuovo strumento che può ridurre significativamente i passaggi rispetto agli strumenti precedenti. Uv è fino a 100 volte più veloce:

mkdir fastapi-form-app && cd fastapi-form-app

uv venv .venv

source .venv/bin/activate #for linux or mac

.venv\Scripts\activate #for windows

mkdir fastapi-form-app && cd fastapi-form-app

uv venv .venv

source .venv/bin/activate #for linux or mac

.venv\Scripts\activate #for windows

Installa le librerie in un solo passaggio:

uv pip install fastapi uvicorn Jinja2

uv pip install fastapi uvicorn Jinja2

Passaggio 2: crea il file dell'applicazione

Crea un file denominato main.py con il seguente contenuto:

from fastapi import FastAPI, Form, Request

from fastapi.responses import HTMLResponse

from fastapi.templating import Jinja2Templates

import os

app = FastAPI()

templates = Jinja2Templates(directory="templates")

@app.get("/", response_class=HTMLResponse)

async def show_form(request: Request):

    return templates.TemplateResponse("form.html", {"request": request})

@app.post("/greet", response_class=HTMLResponse)

async def greet_user(request: Request, name: str = Form(...)):

    if not name:

        name = "World"

    return templates.TemplateResponse("greeting.html", {"request": request, "name": name})

from fastapi import FastAPI, Form, Request

from fastapi.responses import HTMLResponse

from fastapi.templating import Jinja2Templates

import os

app = FastAPI()

templates = Jinja2Templates(directory="templates")

@app.get("/", response_class=HTMLResponse)

async def show_form(request: Request):

    return templates.TemplateResponse("form.html", {"request": request})

@app.post("/greet", response_class=HTMLResponse)

async def greet_user(request: Request, name: str = Form(...)):

    if not name:

        name = "World"

    return templates.TemplateResponse("greeting.html", {"request": request, "name": name})

Passaggio 3: crea i modelli HTML

Crea una directory denominata templates e aggiungi i seguenti file:

templates/form.html:

<!DOCTYPE html>

<html>

<head>

    <title>Simple Form</title>

</head>

<body>

    <h1>Please enter your name</h1>

    <form action="/greet" method="post">

        <label for="name">Name:</label>

        <input type="text" id="name" name="name" required>

        <button type="submit">Submit</button>

    </form>

</body>

</html>

<!DOCTYPE html>

<html>

<head>

    <title>Simple Form</title>

</head>

<body>

    <h1>Please enter your name</h1>

    <form action="/greet" method="post">

        <label for="name">Name:</label>

        <input type="text" id="name" name="name" required>

        <button type="submit">Submit</button>

    </form>

</body>

</html>

templates/greeting.html:

<!DOCTYPE html>

<html>

<head>

    <title>Greeting</title>

</head>

<body>

    <h1>Hello, {{ name }}!</h1>

</body>

</html>

<!DOCTYPE html>

<html>

<head>

    <title>Greeting</title>

</head>

<body>

    <h1>Hello, {{ name }}!</h1>

</body>

</html>

Passaggio 4: testa l'applicazione in locale

Esegui l'applicazione utilizzando Uvicorn:

uvicorn main:app --reload

uvicorn main:app --reload

Apri il browser web e vai all'indirizzo http://localhost:8000. Dovresti vedere il modulo. Inserisci il tuo nome e invia per visualizzare il saluto personalizzato. Il flag --reload consente il ricaricamento automatico in caso di modifiche al codice, accelerando il processo di test.

Passaggio 5: preparati per la produzione

Per il deployment, assicurati di avere un file pyproject.toml che specifichi le tue dipendenze. Sebbene strumenti come uv possano semplificare ulteriormente questo processo, un esempio di base potrebbe essere:

[project]

name = "fastapi-form-app"

version = "0.1.0"

description = "Simple FastAPI form app"

dependencies = [

    "fastapi",

    "uvicorn",

    "Jinja2"

]

[project]

name = "fastapi-form-app"

version = "0.1.0"

description = "Simple FastAPI form app"

dependencies = [

    "fastapi",

    "uvicorn",

    "Jinja2"

]

Quindi possono essere implementati facilmente puntando a un ambiente per loro.

Domande frequenti

Domande frequenti sull'hosting Python.

Mentre l'hosting web regolare è ottimizzato principalmente per file statici (HTML, CSS) e sistemi basati su PHP come WordPress, l'hosting Python è configurato specificamente per supportare il runtime Python e il suo ecosistema. Ciò include la fornitura dell'accesso a diverse versioni di Python, il supporto per server di applicazioni WSGI (come Gunicorn) e strumenti per la gestione dei pacchetti Python tramite pip e requirements.txt. L'hosting normale potrebbe non avere questi componenti critici installati o accessibili.

Per molti tipi di hosting Python, in particolare VPS e server dedicati, l'accesso SSH (Secure Shell) è essenziale. Ti consente di accedere alla riga di comando del server per installare pacchetti, eseguire migrazioni di database, configurare il server WSGI e gestire direttamente i file dell'applicazione. Sebbene alcune soluzioni PaaS (Platform-as-a-Service) gestite astraggano questo aspetto, l'accesso SSH offre il massimo livello di controllo e flessibilità.

Sì. Sebbene l'hosting Python sia spesso discusso nel contesto delle applicazioni web, gli stessi ambienti possono essere utilizzati per eseguire altri tipi di script Python. Ad esempio, potresti utilizzare un VPS o una VM Compute Engine per eseguire un worker in background a esecuzione prolungata per l'elaborazione dei dati, un'attività pianificata utilizzando cron o un server di inferenza del modello di machine learning. La chiave è avere un ambiente server in cui è possibile installare Python e le sue dipendenze.

Un server WSGI (Web Server Gateway Interface), come Gunicorn o uWSGI, è un elemento fondamentale di una configurazione di hosting web Python di produzione. I server di sviluppo forniti con framework come Flask e Django non sono adatti al traffico di produzione. Il server WSGI funge da intermediario, prendendo le richieste HTTP da un robusto server web front-end (come NGINX) e traducendole in un formato standardizzato che il framework dell'applicazione Python può comprendere. Gestisce più processi worker ed è progettato per garantire prestazioni e stabilità sotto carico.

L'esecuzione dell'applicazione Python su localhost è il processo di test sul tuo computer. Questo è un primo passo fondamentale per garantire che il codice funzioni come previsto in un ambiente controllato. L'hosting Python di produzione è il processo di presa di un'applicazione funzionante e di distribuzione su un server connesso a internet, rendendola accessibile agli utenti di tutto il mondo. L'obiettivo di un buon processo di deployment è fare in modo che l'ambiente di produzione rispecchi il più possibile l'ambiente di test localhost per evitare sorprese, il che è un vantaggio fondamentale di tecnologie come la containerizzazione.

Vantaggi dell'hosting Python

Rendimento ottimizzato

Gli ambienti di hosting configurati appositamente per Python possono offrire prestazioni migliori utilizzando configurazioni di server e tecnologie appropriate come WSGI.

Gestione delle dipendenze semplificata

Il supporto per gli ambienti virtuali e pip semplifica la gestione delle dipendenze del progetto senza conflitti.

Scalabilità per la crescita

Un hosting Python di qualità, in particolare l'hosting cloud Python, fornisce percorsi chiari per scalare le risorse della tua applicazione man mano che la base utenti e il traffico crescono.

Maggiore produttività degli sviluppatori

Fornendo un ambiente pronto all'uso con gli strumenti giusti, gli sviluppatori possono dedicare meno tempo all'amministrazione del server e più tempo alla creazione di funzionalità dell'applicazione.

Supporto esteso dei framework

Queste piattaforme di hosting sono progettate per essere compatibili con il vasto ecosistema di framework web Python, da Django e Flask a FastAPI.

Risolvi le tue sfide aziendali con Google Cloud

I nuovi clienti ricevono 300 $ di crediti gratuiti da spendere su Google Cloud.

Considerazioni sulla sicurezza per l'hosting Python

  • Gestione delle dipendenze: esegui regolarmente un audit e aggiorna le dipendenze elencate in requirements.txt per correggere le vulnerabilità note. Utilizza strumenti per eseguire la scansione dei problemi di sicurezza nei tuoi pacchetti.
  • Gestione dei secret: non codificare mai in modo permanente le chiavi API, le credenziali del database o altri secret direttamente nel codice sorgente. Utilizza variabili di ambiente o un servizio di gestione dei secret dedicato.
  • Disattiva la modalità di debug: assicurati che la modalità di debug del tuo framework web sia disattivata in produzione. La modalità di debug può esporre informazioni sensibili sulla configurazione dell'applicazione.
  • Usa ambienti virtuali: usa sempre ambienti virtuali per isolare le dipendenze della tua applicazione. In questo modo si evitano conflitti tra pacchetti globali e si crea un ambiente più pulito e sicuro.
  • Configurazione del server web: configura in modo sicuro il server web e il server WSGI. Limita le autorizzazioni e assicurati che solo le porte necessarie siano esposte a internet.
Che tipo di problema stai cercando di risolvere?
What you'll get:
Guida passo passo
Architettura di riferimento
Soluzioni predefinite disponibili
Questo servizio è stato creato con Vertex AI. Devi avere almeno 18 anni per utilizzarlo. Non inserire informazioni sensibili, riservate o personali.

Scopri di più

Scopri come utilizzare Python con Cloud Run per eseguire il deployment di applicazioni containerizzate scalabili.

Fai il prossimo passo

Inizia a creare su Google Cloud con 300 $ di crediti gratuiti e oltre 20 prodotti Always Free.

Google Cloud