Iniziare a utilizzare Go

Questo tutorial è rivolto a chi non ha esperienza nella creazione di app nel cloud, ad esempio ingegneri e sviluppatori web, che vogliono apprendere i concetti chiave dello sviluppo di app in relazione a Google Cloud.

Obiettivi

Costi

In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:

Le istruzioni riportate in questo documento sono progettate per mantenere l'utilizzo delle risorse entro i limiti del livello Always Free di Google Cloud. Per generare una stima dei costi in base all'utilizzo previsto, utilizza il calcolatore prezzi.

I nuovi utenti di Google Cloud potrebbero avere diritto a una prova senza costi.

Al termine delle attività descritte in questo documento, puoi evitare l'addebito di ulteriori costi eliminando le risorse che hai creato. Per saperne di più, consulta Esegui la pulizia.

Prima di iniziare

  1. Accedi al tuo account Google Cloud . Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti senza costi per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  5. Verify that billing is enabled for your Google Cloud project.

  6. Per creare un database Firestore in modalità Native, segui questa procedura:
    1. Nella console Google Cloud , vai alla pagina Crea database Firestore.

      Vai a Firestore crea database

    2. Dalla schermata Seleziona una modalità di Cloud Firestore, fai clic su Seleziona modalità Native.
    3. Seleziona una località per il tuo database Firestore. Questa impostazione della località è la località delle risorse predefinita Google Cloud per il tuo progetto Google Cloud . Questa località viene utilizzata per i servizi Google Cloud nel tuo progetto Google Cloud che richiedono l'impostazione di una località, in particolare il bucket Cloud Storage predefinito e l'app Cloud Run.
    4. Fai clic su Crea database.
  7. Abilita le API Artifact Registry, Cloud Run Admin, Cloud Build, Cloud Storage, Cloud Logging ed Error Reporting, se non sono già abilitate.

    Ruoli richiesti per abilitare le API

    Per abilitare le API, devi disporre dell'autorizzazione serviceusage.services.enable. Se hai creato il progetto, probabilmente disponi già di questa autorizzazione tramite il ruolo Proprietario (roles/owner). In caso contrario, puoi ottenere questa autorizzazione tramite il ruolo Amministratore utilizzo dei servizi (roles/serviceusage.serviceUsageAdmin). Scopri come concedere i ruoli.

    Abilita le API

  8. Clona il repository di esempio e apri l'applicazione di esempio in Cloud Shell:
    Vai a Cloud Shell

    Cloud Shell fornisce l'accesso tramite riga di comando alle tue risorse Google Cloud direttamente dal browser.

  9. Al prompt per clonare il repository, fai clic su Conferma.
  10. In Cloud Shell, configura lo strumento gcloud in modo da utilizzare il nuovo progetto Google Cloud :

    # Configure gcloud for your project
    gcloud config set project PROJECT_ID

    Sostituisci PROJECT_ID con l'ID progetto Google Cloud che hai creato utilizzando la console Google Cloud .

    Google Cloud CLI è il metodo principale per interagire con le risorse Google Cloud dalla riga di comando. In questo tutorial utilizzerai lo strumento gcloud per eseguire il deployment dell'app e per monitorarla.

Esegui l'app

  1. Crea l'app, che scarica automaticamente le dipendenze:
    go build
    
  2. Eseguire l'applicazione:
    GOOGLE_CLOUD_PROJECT=PROJECT_ID ./bookshelf
    
    Sostituisci PROJECT_ID con l'ID progetto Google Cloud che hai creato.
  3. In Cloud Shell, fai clic su Anteprima web , e seleziona Anteprima sulla porta 8080. Compare una nuova finestra in cui viene eseguita l'app.

Esecuzione del deployment dell'app in Cloud Run

Google Cloud offre diverse opzioni per l'esecuzione del codice. Per questo esempio, utilizzerai Cloud Run per eseguire il deployment di un'app scalabile in Google Cloud. Cloud Run non richiede la gestione dei server e si adatta automaticamente per supportare i picchi di traffico.

  1. Esegui il container con Cloud Run:
    gcloud run deploy bookshelf --region us-central1 --allow-unauthenticated \
    --set-env-vars="GOOGLE_CLOUD_PROJECT=PROJECT_ID" --source .

    Ora la tua app è visibile all'URL visualizzato nell'output di gcloud run:

    Service [bookshelf] revision [bookshelf-00001] has been deployed and is serving 100 percent of traffic.
    Service URL: https://bookshelf-swsmmh5s5a-uc.a.run.app
    
  2. Copia l'URL nel browser web per visualizzare l'app. Home page dell'app Bookshelf

Per saperne di più sul deployment in Cloud Run, consulta la documentazione di Cloud Run.

Rendere persistenti i dati con Firestore

Non puoi archiviare informazioni sulle istanze di Cloud Run poiché vengono perse al riavvio dell'istanza e non esistono quando vengono create nuove istanze. Puoi, invece, utilizzare un database in cui tutte le istanze eseguono operazioni di lettura e scrittura.

Google Cloud offre diverse opzioni per archiviare i dati. In questo esempio viene utilizzato Firestore per archiviare i dati di ogni libro. Firestore è un database di documenti NoSQL serverless completamente gestito che consente di archiviare i dati e di eseguire query su di essi. Firestore si ridimensiona automaticamente per soddisfare le esigenze dell'app, con una scalabilità fino a zero quando non la utilizzi. Aggiungi il tuo primo libro.

  1. Per creare un libro per l'applicazione di cui hai eseguito il deployment, fai clic su Add book (Aggiungi libro).

    Aggiungere un libro all'app Bookshelf
  2. Nel campo Title (Titolo), inserisci Moby Dick.
  3. Nel campo Author (Autore), inserisci Herman Melville.
  4. Fai clic su Save (Save). Adesso esiste una voce nell'applicazione Bookshelf.

    Voce per Moby Dick nell'app Bookshelf
  5. Nella console Google Cloud , per aggiornare la pagina Firestore, fai clic su Aggiorna . I dati vengono visualizzati in Firestore. L'app Libreria archivia ogni libro come documento Firestore con un ID univoco e tutti questi documenti vengono archiviati in una raccolta Firestore. Ai fini di questo tutorial, la raccolta è chiamata "books" (libri). Esempio di documento Firestore.

Firestore archivia i libri utilizzando la libreria client di Firestore. Ecco un esempio di come recuperare un documento Firestore:


// newFirestoreDB creates a new BookDatabase backed by Cloud Firestore.
// See the firestore package for details on creating a suitable
// firestore.Client: https://godoc.org/cloud.google.com/go/firestore.
func newFirestoreDB(client *firestore.Client) (*firestoreDB, error) {
	ctx := context.Background()
	// Verify that we can communicate and authenticate with the Firestore
	// service.
	err := client.RunTransaction(ctx, func(ctx context.Context, t *firestore.Transaction) error {
		return nil
	})
	if err != nil {
		return nil, fmt.Errorf("firestoredb: could not connect: %w", err)
	}
	return &firestoreDB{
		client:     client,
		collection: "books",
	}, nil
}

// Close closes the database.
func (db *firestoreDB) Close(context.Context) error {
	return db.client.Close()
}

// Book retrieves a book by its ID.
func (db *firestoreDB) GetBook(ctx context.Context, id string) (*Book, error) {
	ds, err := db.client.Collection(db.collection).Doc(id).Get(ctx)
	if err != nil {
		return nil, fmt.Errorf("firestoredb: Get: %w", err)
	}
	b := &Book{}
	ds.DataTo(b)
	return b, nil
}

Per ulteriori informazioni sull'utilizzo di Firestore, consulta la pagina relativa all'aggiunta di dati a Firestore.

Archiviare in Cloud Storage i dati caricati

Dopo aver aggiunto un libro, devi aggiungere la rispettiva immagine di copertina. Non puoi archiviare i file nelle istanze. Un database non è la scelta giusta per i file di immagine. Utilizza, invece, Cloud Storage.

Cloud Storage è l'archivio blob principale per Google Cloud. Puoi utilizzare Cloud Storage per ospitare gli asset dell'app che vuoi condividere su Google Cloud. Per utilizzare Cloud Storage, devi creare un bucket Cloud Storage, un container di base per archiviare i tuoi dati.

  1. Nella console Google Cloud , vai alla pagina Browser Cloud Storage.

    Vai alla pagina Browser Cloud Storage

  2. Fai clic su Crea bucket.
  3. Nella finestra di dialogo Crea bucket, inserisci un nome per il bucket aggiungendo l'ID progetto Google Cloud alla stringa _bucket in modo che il nome sia simile a YOUR_PROJECT_ID_bucket. Questo nome è soggetto ai requisiti per i nomi dei bucket. Puoi lasciare invariati i valori predefiniti di tutti gli altri campi.
  4. Fai clic su Crea.
  5. Una volta creato il bucket, gli oggetti devono essere resi accessibili pubblicamente per poter essere visualizzati dagli utenti. Per rendere gli oggetti accessibili pubblicamente, consulta la pagina Rendere pubblici i dati.
  6. Fai clic su Edit book (Modifica libro) e seleziona un'immagine da caricare come copertina del libro. Ad esempio, puoi utilizzare questa immagine di dominio pubblico:
    Copertina di Moby Dick
  7. Fai clic su Save (Salva). Viene visualizzata la home page, dove è presente una voce per la tua app Bookshelf.
    Voce per Moby Dick nell'app Bookshelf

L'app Bookshelf invia i file caricati a Cloud Storage utilizzando la libreria client di Cloud Storage.


// uploadFileFromForm uploads a file if it's present in the "image" form field.
func (b *Bookshelf) uploadFileFromForm(ctx context.Context, r *http.Request) (url string, err error) {
	f, fh, err := r.FormFile("image")
	if err == http.ErrMissingFile {
		return "", nil
	}
	if err != nil {
		return "", err
	}

	if b.StorageBucket == nil {
		return "", errors.New("storage bucket is missing: check bookshelf.go")
	}
	if _, err := b.StorageBucket.Attrs(ctx); err != nil {
		if err == storage.ErrBucketNotExist {
			return "", fmt.Errorf("bucket %q does not exist: check bookshelf.go", b.StorageBucketName)
		}
		return "", fmt.Errorf("could not get bucket: %w", err)
	}

	// random filename, retaining existing extension.
	name := uuid.Must(uuid.NewV4()).String() + path.Ext(fh.Filename)

	w := b.StorageBucket.Object(name).NewWriter(ctx)

	// Warning: storage.AllUsers gives public read access to anyone.
	w.ACL = []storage.ACLRule{{Entity: storage.AllUsers, Role: storage.RoleReader}}
	w.ContentType = fh.Header.Get("Content-Type")

	// Entries are immutable, be aggressive about caching (1 day).
	w.CacheControl = "public, max-age=86400"

	if _, err := io.Copy(w, f); err != nil {
		return "", err
	}
	if err := w.Close(); err != nil {
		return "", err
	}

	const publicURL = "https://storage.googleapis.com/%s/%s"
	return fmt.Sprintf(publicURL, b.StorageBucketName, name), nil
}

Per saperne di più sull'utilizzo di Cloud Storage, consulta la Introduzione a Cloud Storage.

Monitorare l'app utilizzando Google Cloud Observability

Hai eseguito il deployment dell'app e hai creato e modificato i libri. Per monitorare questi eventi per i tuoi utenti, utilizza gestione delle prestazioni delle applicazioni (APM).

Monitorare i log con Cloud Logging

  1. Nel Google Cloud, vai a Esplora log.

    Vai a Esplora log

    Puoi monitorare l'app in tempo reale. Se hai problemi con la tua app, questa è una delle prime sezioni da controllare.

    Visualizzatore log di Stackdriver
  2. Nell'elenco a discesa Risorsa, seleziona Revisione Cloud Run, Bookshelf.

Monitora gli errori con Error Reporting

  1. Nella console Google Cloud , vai alla pagina Error Reporting.
    Vai alla pagina Error Reporting
    Error Reporting evidenzia errori ed eccezioni nell'applicazione e consente di impostare avvisi al riguardo.
  2. Nel browser, accedi all'URL /errors nell'applicazione
    .
    YOUR_CLOUD_RUN_URL/errors

    Viene generata una nuova eccezione di test e inviata a Google Cloud Observability.

  3. Nella console Google Cloud , torna alla pagina Error Reporting e dopo qualche istante il nuovo errore sarà visibile. Fai clic su Ricarica automaticamente per evitare di aggiornare manualmente la pagina.

    Messaggio di errore di Error Reporting.

Esegui la pulizia

Per evitare che al tuo Account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.

Elimina il progetto

  1. Nella console Google Cloud , vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  2. Nell'elenco dei progetti, seleziona quello che vuoi eliminare, quindi fai clic su Elimina.
  3. Nella finestra di dialogo, digita l'ID progetto, quindi fai clic su Chiudi per eliminare il progetto.

Passaggi successivi