Alojar un sitio web estático mediante HTTP

En este tutorial se describe cómo configurar un segmento de Cloud Storage para alojar un sitio web estático en un dominio de tu propiedad. Las páginas web estáticas pueden contener tecnologías del lado del cliente, como HTML, CSS y JavaScript. No pueden contener contenido dinámico, como secuencias de comandos del lado del servidor (por ejemplo, PHP).

En este tutorial se explica cómo servir contenido a través de HTTP. Para ver un tutorial que usa HTTPS, consulta Alojar un sitio web estático.

Para ver ejemplos y consejos sobre páginas web estáticas, incluido cómo alojar recursos estáticos para un sitio web dinámico, consulta la página de sitios web estáticos.

Conectar tu dominio a Cloud Storage

Para conectar tu dominio a Cloud Storage, crea un registro CNAME a través de tu servicio de registro de dominios. Un registro CNAME es un tipo de registro DNS. Dirige el tráfico que solicita una URL de tu dominio a los recursos que quieras servir, en este caso, objetos de tus segmentos de Cloud Storage. En el caso de www.example.com, el registro CNAME puede contener la siguiente información:

NAME                  TYPE     DATA
www                   CNAME    c.storage.googleapis.com.

Para obtener más información sobre las redirecciones CNAME, consulta URI para alias de CNAME.

Para conectar tu dominio a Cloud Storage, sigue estos pasos:

  1. Crea un registro CNAME que apunte a c.storage.googleapis.com..

    El servicio de registro de tu dominio debería ofrecerte una forma de administrarlo, incluida la opción de añadir un registro CNAME. Por ejemplo, si usas Cloud DNS, puedes consultar las instrucciones para añadir registros de recursos en la página Añadir, modificar y eliminar registros.

Crear un segmento

Crea un segmento cuyo nombre coincida con el CNAME que has creado para tu dominio.

Por ejemplo, si has añadido un registro CNAME que apunta del subdominio www de example.com a c.storage.googleapis.com., el comando de la CLI de Google Cloud para crear un segmento con el nombre www.example.com sería similar al siguiente:

gcloud storage buckets create gs://www.example.com --location=US

Para obtener instrucciones completas sobre cómo crear segmentos con diferentes herramientas, consulta Crear segmentos.

Subir los archivos de tu sitio

Para añadir a tu contenedor los archivos que quieres que sirva tu sitio web, sigue estos pasos:

Consola

  1. En la Google Cloud consola, ve a la página Segmentos de Cloud Storage.

    Ir a Contenedores

  2. En la lista de segmentos, haz clic en el nombre del segmento que has creado.

  3. En la pestaña Objetos, haz clic en el botón Subir archivos.

  4. En el cuadro de diálogo de archivos, busca el archivo que quieras y selecciónalo.

Una vez que se haya completado la subida, debería ver el nombre del archivo junto con la información del archivo en el contenedor.

Línea de comandos

Usa el comando gcloud storage cp para copiar archivos en tu segmento. Por ejemplo, para copiar el archivo index.html desde su ubicación actual: Desktop

gcloud storage cp Desktop/index.html gs://www.example.com

Si la acción se realiza correctamente, la respuesta se parecerá al siguiente ejemplo:

Completed files 1/1 | 164.3kiB/164.3kiB

Bibliotecas de cliente

C++

Para obtener más información, consulta la documentación de referencia de la API C++ de Cloud Storage.

Para autenticarte en Cloud Storage, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.

namespace gcs = ::google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string const& file_name,
   std::string const& bucket_name, std::string const& object_name) {
  // Note that the client library automatically computes a hash on the
  // client-side to verify data integrity during transmission.
  StatusOr<gcs::ObjectMetadata> metadata = client.UploadFile(
      file_name, bucket_name, object_name, gcs::IfGenerationMatch(0));
  if (!metadata) throw std::move(metadata).status();

  std::cout << "Uploaded " << file_name << " to object " << metadata->name()
            << " in bucket " << metadata->bucket()
            << "\nFull metadata: " << *metadata << "\n";
}

C#

Para obtener más información, consulta la documentación de referencia de la API C# de Cloud Storage.

Para autenticarte en Cloud Storage, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.


using Google.Cloud.Storage.V1;
using System;
using System.IO;

public class UploadFileSample
{
    public void UploadFile(
        string bucketName = "your-unique-bucket-name",
        string localPath = "my-local-path/my-file-name",
        string objectName = "my-file-name")
    {
        var storage = StorageClient.Create();
        using var fileStream = File.OpenRead(localPath);
        storage.UploadObject(bucketName, objectName, null, fileStream);
        Console.WriteLine($"Uploaded {objectName}.");
    }
}

Go

Para obtener más información, consulta la documentación de referencia de la API Go de Cloud Storage.

Para autenticarte en Cloud Storage, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación para bibliotecas de cliente.

import (
	"context"
	"fmt"
	"io"
	"os"
	"time"

	"cloud.google.com/go/storage"
)

// uploadFile uploads an object.
func uploadFile(w io.Writer, bucket, object string) error {
	// bucket := "bucket-name"
	// object := "object-name"
	ctx := context.Background()
	client, err := storage.NewClient(ctx)
	if err != nil {
		return fmt.Errorf("storage.NewClient: %w", err)
	}
	defer client.Close()

	// Open local file.
	f, err := os.Open("notes.txt")
	if err != nil {
		return fmt.Errorf("os.Open: %w", err)
	}
	defer f.Close()

	ctx, cancel := context.WithTimeout(ctx, time.Second*50)
	defer cancel()

	o := client.Bucket(bucket).Object(object)

	// Optional: set a generation-match precondition to avoid potential race
	// conditions and data corruptions. The request to upload is aborted if the
	// object's generation number does not match your precondition.
	// For an object that does not yet exist, set the DoesNotExist precondition.
	o = o.If(storage.Conditions{DoesNotExist: true})
	// If the live object already exists in your bucket, set instead a
	// generation-match precondition using the live object's generation number.
	// attrs, err := o.Attrs(ctx)
	// if err != nil {
	// 	return fmt.Errorf("object.Attrs: %w", err)
	// }
	// o = o.If(storage.Conditions{GenerationMatch: attrs.Generation})

	// Upload an object with storage.Writer.
	wc := o.NewWriter(ctx)
	if _, err = io.Copy(wc, f); err != nil {
		return fmt.Errorf("io.Copy: %w", err)
	}
	if err := wc.Close(); err != nil {
		return fmt.Errorf("Writer.Close: %w", err)
	}
	fmt.Fprintf(w, "Blob %v uploaded.\n", object)
	return