Aloje um Website estático

Esta página descreve como configurar um contentor do Cloud Storage para alojar um Website estático para um domínio que lhe pertence. As páginas Web estáticas podem conter tecnologias do lado do cliente, como HTML, CSS e JavaScript. Não podem conter conteúdo dinâmico, como scripts do lado do servidor, como PHP.

Vista geral

Uma vez que o Cloud Storage não suporta domínios personalizados com HTTPS por si só, este tutorial usa o Cloud Storage com um Application Load Balancer externo para publicar conteúdo a partir de um domínio personalizado através de HTTPS. Para ver mais formas de publicar conteúdo a partir de um domínio personalizado através de HTTPS, consulte a resolução de problemas da publicação através de HTTPS. Também pode usar o Cloud Storage para publicar conteúdo de domínio personalizado através de HTTP, o que não requer um balanceador de carga.

Para ver exemplos e sugestões sobre páginas Web estáticas, incluindo como alojar recursos estáticos para um Website dinâmico, consulte a página do Website estático.

As instruções nesta página descrevem como realizar os seguintes passos:

  • Carregue e partilhe os ficheiros do seu site.

  • Configure um balanceador de carga e um certificado SSL.

  • Associe o balanceador de carga ao seu contentor.

  • Direcione o seu domínio para o equilibrador de carga através de um registo A.

  • Teste o Website.

Preços

As instruções nesta página usam os seguintes componentes faturáveis do Google Cloud:

Consulte a sugestão Monitorizar os seus custos para ver detalhes sobre os custos que podem ser incorridos quando aloja um Website estático.

Limitações

Pode alojar um Website estático através de um contentor cujos objetos sejam legíveis para o público. Não pode alojar um Website estático através de um contentor com a prevenção de acesso público ativada. Para alojar um Website estático com o Cloud Storage, pode usar um dos seguintes métodos:

  • Crie um novo contentor cujos dados possam ser acedidos publicamente. Durante a criação do contentor, desmarque a caixa com a etiqueta Impor prevenção de acesso público neste contentor. Depois de criar o contentor, conceda a função Leitor de objetos do armazenamento ao principal allUsers. Para mais informações, consulte o artigo Crie um contentor.

  • Tornar públicos os dados de um contentor existente. Para mais informações, consulte o artigo Partilhe os seus ficheiros.

Antes de começar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  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 (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 (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. Ative a API Compute Engine para o seu projeto.
  7. Ter as seguintes funções de gestão de identidade e de acesso: Administrador de armazenamento e Administrador de rede de computação.
  8. Ter um domínio do qual é proprietário ou gestor. Se não tiver um domínio existente, existem muitos serviços através dos quais pode registar um novo domínio, como o Cloud Domains.

    Este tutorial usa o domínio example.com.

  9. Tiver alguns ficheiros de Website que quer publicar. Este tutorial funciona melhor se tiver, pelo menos, uma página de índice (index.html) e uma página 404 (404.html).
  10. Ter um contentor do Cloud Storage para armazenar os ficheiros que quer servir. Se não tiver atualmente um contentor, crie um contentor.
  11. (Opcional) Se quiser que o seu contentor do Cloud Storage tenha o mesmo nome que o seu domínio, tem de validar que é proprietário ou gere o domínio que vai usar. Certifique-se de que está a validar o domínio de nível superior, como example.com, e não um subdomínio, como www.example.com. Se comprou o seu domínio através do Cloud Domains, a validação é automática.
  12. Carregue os ficheiros do seu site

    Adicione os ficheiros que quer que o seu Website publique no contentor:

    Consola

    1. Na Google Cloud consola, aceda à página Recipientes do Cloud Storage.

      Aceda a Recipientes

    2. Na lista de contentores, clique no nome do contentor que criou.

      A página Detalhes do contentor é aberta com o separador Objetos selecionado.

    3. Clique no botão Carregar ficheiros.

    4. Na caixa de diálogo de ficheiros, procure o ficheiro pretendido e selecione-o.

    Após a conclusão do carregamento, deve ver o nome do ficheiro, juntamente com as informações do ficheiro, apresentado no contentor.

    Para saber como obter informações detalhadas sobre erros relativos a operações do Cloud Storage falhadas na Google Cloud consola, consulte a secção Resolução de problemas.

    Linha de comandos

    Use o comando gcloud storage cp para copiar ficheiros para o seu contentor. Por exemplo, para copiar o ficheiro index.html da respetiva localização atual Desktop para o contentor my-static-assets:

    gcloud storage cp Desktop/index.html gs://my-static-assets

    Se for bem-sucedido, a resposta é semelhante ao exemplo seguinte:

    Completed files 1/1 | 164.3kiB/164.3kiB

    Bibliotecas cliente

    C++

    Para mais informações, consulte a documentação de referência da API C++ do Cloud Storage.

    Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação 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 mais informações, consulte a documentação de referência da API C# do Cloud Storage.

    Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação 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 mais informações, consulte a documentação de referência da API Go do Cloud Storage.

    Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação 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 nil
    }
    

    Java

    Para mais informações, consulte a documentação de referência da API Java do Cloud Storage.

    Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    O exemplo seguinte carrega um objeto individual:

    
    import com.google.cloud.storage.BlobId;
    import com.google.cloud.storage.BlobInfo;
    import com.google.cloud.storage.Storage;
    import com.google.cloud.storage.StorageOptions;
    import java.io.IOException;
    import java.nio.file.Paths;
    
    public class UploadObject {
      public static void uploadObject(
          String projectId, String bucketName, String objectName, String filePath) throws IOException {
        // The ID of your GCP project
        // String projectId = "your-project-id";
    
        // The ID of your GCS bucket
        // String bucketName = "your-unique-bucket-name";
    
        // The ID of your GCS object
        // String objectName = "your-object-name";
    
        // The path to your file to upload
        // String filePath = "path/to/your/file"
    
        Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService();
        BlobId blobId = BlobId.of(bucketName, objectName);
        BlobInfo blobInfo = BlobInfo.newBuilder(blobId).build();
    
        // Optional: set a generation-match precondition to avoid potential race
        // conditions and data corruptions. The request returns a 412 error if the
        // preconditions are not met.
        Storage.BlobWriteOption precondition;
        if (storage.get(bucketName, objectName) == null) {
          // For a target object that does not yet exist, set the DoesNotExist precondition.
          // This will cause the request to fail if the object is created before the request runs.
          precondition = Storage.BlobWriteOption.doesNotExist();
        } else {
          // If the destination already exists in your bucket, instead set a generation-match
          // precondition. This will cause the request to fail if the existing object's generation
          // changes before the request runs.
          precondition =
              Storage.BlobWriteOption.generationMatch(
                  storage.get(bucketName, objectName).getGeneration());
        }
        storage.createFrom(blobInfo, Paths.get(filePath), precondition);
    
        System.out.println(
            "File " + filePath + " uploaded to bucket " + bucketName + " as " + objectName);
      }
    }

    O exemplo seguinte carrega vários objetos em simultâneo:

    import com.google.cloud.storage.transfermanager.ParallelUploadConfig;
    import com.google.cloud.storage.transfermanager.TransferManager;
    import com.google.cloud.storage.transfermanager.TransferManagerConfig;
    import com.google.cloud.storage.transfermanager.UploadResult;
    import java.io.IOException;
    import java.nio.file.Path;
    import java.util.List;
    
    class UploadMany {
    
      public static void uploadManyFiles(String bucketName, List<Path> files) throws IOException {
        TransferManager transferManager = TransferManagerConfig.newBuilder().build().getService();
        ParallelUploadConfig parallelUploadConfig =
            ParallelUploadConfig.newBuilder().setBucketName(bucketName).build();
        List<UploadResult> results =
            transferManager.uploadFiles(files, parallelUploadConfig).getUploadResults();
        for (UploadResult result : results) {
          System.out.println(
              "Upload for "
                  + result.getInput().getName()
                  + " completed with status "
                  + result.getStatus());
        }
      }
    }

    O exemplo seguinte carrega todos os objetos com um prefixo comum em simultâneo:

    import com.google.cloud.storage.transfermanager.ParallelUploadConfig;
    import com.google.cloud.storage.transfermanager.TransferManager;
    import com.google.cloud.storage.transfermanager.TransferManagerConfig;
    import com.google.cloud.storage.transfermanager.UploadResult;
    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.stream.Stream;
    
    class UploadDirectory {
    
      public static void uploadDirectoryContents(String bucketName, Path sourceDirectory)
          throws IOException {
        TransferManager transferManager = TransferManagerConfig.newBuilder().build().getService();
        ParallelUploadConfig parallelUploadConfig =
            ParallelUploadConfig.newBuilder().setBucketName(bucketName).build();
    
        // Create a list to store the file paths
        List<Path> filePaths = new ArrayList<>();
        // Get all files in the directory
        // try-with-resource to ensure pathStream is closed
        try (Stream<Path> pathStream = Files.walk(sourceDirectory)) {
          pathStream.filter(Files::isRegularFile).forEach(filePaths::add);
        }
        List<UploadResult> results =
            transferManager.uploadFiles(filePaths, parallelUploadConfig).getUploadResults();
        for (UploadResult result : results) {
          System.out.println(
              "Upload for "
                  + result.getInput().getName()
                  + " completed with status "
                  + result.getStatus());
        }
      }
    }

    Node.js

    Para mais informações, consulte a documentação de referência da API Node.js do Cloud Storage.

    Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    O exemplo seguinte carrega um objeto individual:

    /**
     * TODO(developer): Uncomment the following lines before running the sample.
     */
    // The ID of your GCS bucket
    // const bucketName = 'your-unique-bucket-name';
    
    // The path to your file to upload
    // const filePath = 'path/to/your/file';
    
    // The new ID for your GCS file
    // const destFileName = 'your-new-file-name';
    
    // Imports the Google Cloud client library
    const {Storage} = require('@google-cloud/storage');
    
    // Creates a client
    const storage = new Storage();
    
    async function uploadFile() {
      const options = {
        destination: destFileName,
        // 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 a destination
        // object that does not yet exist, set the ifGenerationMatch precondition to 0
        // If the destination object already exists in your bucket, set instead a
        // generation-match precondition using its generation number.
        preconditionOpts: {ifGenerationMatch: generationMatchPrecondition},
      };
    
      await storage.bucket(bucketName).upload(filePath, options);
      console.log(`${filePath} uploaded to ${bucketName}`);
    }
    
    uploadFile().catch(console.error);

    O exemplo seguinte carrega vários objetos em simultâneo:

    /**
     * TODO(developer): Uncomment the following lines before running the sample.
     */
    // The ID of your GCS bucket
    // const bucketName = 'your-unique-bucket-name';
    
    // The ID of the first GCS file to upload
    // const firstFilePath = 'your-first-file-name';
    
    // The ID of the second GCS file to upload
    // const secondFilePath = 'your-second-file-name';
    
    // Imports the Google Cloud client library
    const {Storage, TransferManager} = require('@google-cloud/storage');
    
    // Creates a client
    const storage = new Storage();
    
    // Creates a transfer manager client
    const transferManager = new TransferManager(storage.bucket(bucketName));
    
    async function uploadManyFilesWithTransferManager() {
      // Uploads the files
      await transferManager.uploadManyFiles([firstFilePath, secondFilePath]);
    
      for (const filePath of [firstFilePath, secondFilePath]) {
        console.log(`${filePath} uploaded to ${bucketName}.`);
      }
    }
    
    uploadManyFilesWithTransferManager().catch(console.error);

    O exemplo seguinte carrega todos os objetos com um prefixo comum em simultâneo:

    /**
     * TODO(developer): Uncomment the following lines before running the sample.
     */
    // The ID of your GCS bucket
    // const bucketName = 'your-unique-bucket-name';
    
    // The local directory to upload
    // const directoryName = 'your-directory';
    
    // Imports the Google Cloud client library
    const {Storage, TransferManager} = require('@google-cloud/storage');
    
    // Creates a client
    const storage = new Storage();
    
    // Creates a transfer manager client
    const transferManager = new TransferManager(storage.bucket(bucketName));
    
    async function uploadDirectoryWithTransferManager() {
      // Uploads the directory
      await transferManager.uploadManyFiles(directoryName);
    
      console.log(`${directoryName} uploaded to ${bucketName}.`);
    }
    
    uploadDirectoryWithTransferManager().catch(console.error);

    PHP

    Para mais informações, consulte a documentação de referência da API PHP do Cloud Storage.

    Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    use Google\Cloud\Storage\StorageClient;
    
    /**
     * Upload a file.
     *
     * @param string $bucketName The name of your Cloud Storage bucket.
     *        (e.g. 'my-bucket')
     * @param string $objectName The name of your Cloud Storage object.
     *        (e.g. 'my-object')
     * @param string $source The path to the file to upload.
     *        (e.g. '/path/to/your/file')
     */
    function upload_object(string $bucketName, string $objectName, string $source): void
    {
        $storage = new StorageClient();
        if (!$file = fopen($source, 'r')) {
            throw new \InvalidArgumentException('Unable to open file for reading');
        }
        $bucket = $storage->bucket($bucketName);
        $object = $bucket->upload($file, [
            'name' => $objectName
        ]);
        printf('Uploaded %s to gs://%s/%s' . PHP_EOL, basename($source), $bucketName, $objectName);
    }

    Python

    Para mais informações, consulte a documentação de referência da API Python do Cloud Storage.

    Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    O exemplo seguinte carrega um objeto individual:

    from google.cloud import storage
    
    
    def upload_blob(bucket_name, source_file_name, destination_blob_name):
        """Uploads a file to the bucket."""
        # The ID of your GCS bucket
        # bucket_name = "your-bucket-name"
        # The path to your file to upload
        # source_file_name = "local/path/to/file"
        # The ID of your GCS object
        # destination_blob_name = "storage-object-name"
    
        storage_client = storage.Client()
        bucket = storage_client.bucket(bucket_name)
        blob = bucket.blob(destination_blob_name)
    
        # 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 a destination
        # object that does not yet exist, set the if_generation_match precondition to 0.
        # If the destination object already exists in your bucket, set instead a
        # generation-match precondition using its generation number.
        generation_match_precondition = 0
    
        blob.upload_from_filename(source_file_name, if_generation_match=generation_match_precondition)
    
        print(
            f"File {source_file_name} uploaded to {destination_blob_name}."
        )
    
    

    O exemplo seguinte carrega vários objetos em simultâneo:

    def upload_many_blobs_with_transfer_manager(
        bucket_name, filenames, source_directory="", workers=8
    ):
        """Upload every file in a list to a bucket, concurrently in a process pool.
    
        Each blob name is derived from the filename, not including the
        `source_directory` parameter. For complete control of the blob name for each
        file (and other aspects of individual blob metadata), use
        transfer_manager.upload_many() instead.
        """
    
        # The ID of your GCS bucket
        # bucket_name = "your-bucket-name"
    
        # A list (or other iterable) of filenames to upload.
        # filenames = ["file_1.txt", "file_2.txt"]
    
        # The directory on your computer that is the root of all of the files in the
        # list of filenames. This string is prepended (with os.path.join()) to each
        # filename to get the full path to the file. Relative paths and absolute
        # paths are both accepted. This string is not included in the name of the
        # uploaded blob; it is only used to find the source files. An empty string
        # means "the current working directory". Note that this parameter allows
        # directory traversal (e.g. "/", "../") and is not intended for unsanitized
        # end user input.
        # source_directory=""
    
        # The maximum number of processes to use for the operation. The performance
        # impact of this value depends on the use case, but smaller files usually
        # benefit from a higher number of processes. Each additional process occupies
        # some CPU and memory resources until finished. Threads can be used instead
        # of processes by passing `worker_type=transfer_manager.THREAD`.
        # workers=8
    
        from google.cloud.storage import Client, transfer_manager
    
        storage_client = Client()
        bucket = storage_client.bucket(bucket_name)
    
        results = transfer_manager.upload_many_from_filenames(
            bucket, filenames, source_directory=source_directory, max_workers=workers
        )
    
        for name, result in zip(filenames, results):
            # The results list is either `None` or an exception for each filename in
            # the input list, in order.
    
            if isinstance(result, Exception):
                print("Failed to upload {} due to exception: {}".format(name, result))
            else:
                print("Uploaded {} to {}.".format(name, bucket.name))

    O exemplo seguinte carrega todos os objetos com um prefixo comum em simultâneo:

    def upload_directory_with_transfer_manager(bucket_name, source_directory, workers=8):
        """Upload every file in a directory, including all files in subdirectories.
    
        Each blob name is derived from the filename, not including the `directory`
        parameter itself. For complete control of the blob name for each file (and
        other aspects of individual blob metadata), use
        transfer_manager.upload_many() instead.
        """
    
        # The ID of your GCS bucket
        # bucket_name = "your-bucket-name"
    
        # The directory on your computer to upload. Files in the directory and its
        # subdirectories will be uploaded. An empty string means "the current
        # working directory".
        # source_directory=""
    
        # The maximum number of processes to use for the operation. The performance
        # impact of this value depends on the use case, but smaller files usually
        # benefit from a higher number of processes. Each additional process occupies
        # some CPU and memory resources until finished. Threads can be used instead
        # of processes by passing `worker_type=transfer_manager.THREAD`.
        # workers=8
    
        from pathlib import Path
    
        from google.cloud.storage import Client, transfer_manager
    
        storage_client = Client()
        bucket = storage_client.bucket(bucket_name)
    
        # Generate a list of paths (in string form) relative to the `directory`.
        # This can be done in a single list comprehension, but is expanded into
        # multiple lines here for clarity.
    
        # First, recursively get all files in `directory` as Path objects.
        directory_as_path_obj = Path(source_directory)
        paths = directory_as_path_obj.rglob("*")
    
        # Filter so the list only includes files, not directories themselves.
        file_paths = [path for path in paths if path.is_file()]
    
        # These paths are relative to the current working directory. Next, make them
        # relative to `directory`
        relative_paths = [path.relative_to(source_directory) for path in file_paths]
    
        # Finally, convert them all to strings.
        string_paths = [str(path) for path in relative_paths]
    
        print("Found {} files.".format(len(string_paths)))
    
        # Start the upload.
        results = transfer_manager.upload_many_from_filenames(
            bucket, string_paths, source_directory=source_directory, max_workers=workers
        )
    
        for name, result in zip(string_paths, results):
            # The results list is either `None` or an exception for each filename in
            # the input list, in order.
    
            if isinstance(result, Exception):
                print("Failed to upload {} due to exception: {}".format(name, result))
            else:
                print("Uploaded {} to {}.".format(name, bucket.name))

    Ruby

    Para mais informações, consulte a documentação de referência da API Ruby do Cloud Storage.

    Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    def upload_file bucket_name:, local_file_path:, file_name: nil
      # The ID of your GCS bucket
      # bucket_name = "your-unique-bucket-name"
    
      # The path to your file to upload
      # local_file_path = "/local/path/to/file.txt"
    
      # The ID of your GCS object
      # file_name = "your-file-name"
    
      require "google/cloud/storage"
    
      storage = Google::Cloud::Storage.new
      bucket  = storage.bucket bucket_name, skip_lookup: true
    
      file = bucket.create_file local_file_path, file_name
    
      puts "Uploaded #{local_file_path} as #{file.name} in bucket #{bucket_name}"
    end

    Terraform

    # Upload a simple index.html page to the bucket
    resource "google_storage_bucket_object" "indexpage" {
      name         = "index.html"
      content      = "<html><body>Hello World!</body></html>"
      content_type = "text/html"
      bucket       = google_storage_bucket.static_website.id
    }
    
    # Upload a simple 404 / error page to the bucket
    resource "google_storage_bucket_object" "errorpage" {
      name         = "404.html"
      content      = "<html><body>404!</body></html>"
      content_type = "text/html"
      bucket       = google_storage_bucket.static_website.id
    }

    APIs REST

    API JSON

    1. Ter a CLI gcloud instalada e inicializada, o que lhe permite gerar um token de acesso para o cabeçalho Authorization.

    2. Use cURL para chamar a API JSON com um pedido de POST objeto. Para o ficheiro index.html carregado para um contentor com o nome my-static-assets:

      curl -X POST --data-binary @index.html \
        -H "Content-Type: text/html" \
        -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        "https://storage.googleapis.com/upload/storage/v1/b/my-static-assets/o?uploadType=media&name=index.html"

    API XML

    1. Ter a CLI gcloud instalada e inicializada, o que lhe permite gerar um token de acesso para o cabeçalho Authorization.

    2. Use cURL para chamar a API XML com um pedido de PUT objeto. Para o ficheiro index.html carregado para um contentor com o nome my-static-assets:

      curl -X PUT --data-binary @index.html \
        -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        -H "Content-Type: text/html" \
        "https://storage.googleapis.com/my-static-assets/index.html"

    Partilhe os seus ficheiros

    Para tornar todos os objetos no seu contentor legíveis para qualquer pessoa na Internet pública:

    Consola

    1. Na Google Cloud consola, aceda à página Recipientes do Cloud Storage.

      Aceda a Recipientes

    2. Na lista de contentores, clique no nome do contentor que quer tornar público.

    3. Selecione o separador Permissões junto à parte superior da página.

    4. Se o painel Acesso público indicar Não público, clique no botão com a etiqueta Remover prevenção de acesso público e clique em Confirmar na caixa de diálogo apresentada.

    5. Clique no botão Conceder acesso.

      É apresentada a caixa de diálogo Adicionar responsáveis.

    6. No campo Novos principais, introduza allUsers.

    7. No menu pendente Selecionar uma função, selecione o submenu Cloud Storage e clique na opção Visualizador de objetos do Storage.

    8. Clique em Guardar.

    9. Clique em Permitir acesso público.

    Depois de partilhados publicamente, é apresentado um ícone de link para cada objeto na coluna de acesso público. Pode clicar neste ícone para obter o URL do objeto.

    Para saber como obter informações detalhadas sobre erros relativos a operações do Cloud Storage falhadas na Google Cloud consola, consulte a secção Resolução de problemas.

    Linha de comandos

    Use o comando buckets add-iam-policy-binding:

    gcloud storage buckets add-iam-policy-binding  gs://my-static-assets --member=allUsers --role=roles/storage.objectViewer

    Bibliotecas cliente

    C++

    Para mais informações, consulte a documentação de referência da API C++ do Cloud Storage.

    Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    namespace gcs = ::google::cloud::storage;
    using ::google::cloud::StatusOr;
    [](gcs::Client client, std::string const& bucket_name) {
      auto current_policy = client.GetNativeBucketIamPolicy(
          bucket_name, gcs::RequestedPolicyVersion(3));
      if (!current_policy) throw std::move(current_policy).status();
    
      current_policy->set_version(3);
      current_policy->bindings().emplace_back(
          gcs::NativeIamBinding("roles/storage.objectViewer", {"allUsers"}));
    
      auto updated =
          client.SetNativeBucketIamPolicy(bucket_name, *current_policy);
      if (!updated) throw std::move(updated).status();
    
      std::cout << "Policy successfully updated: " << *updated << "\n";
    }

    C#

    Para mais informações, consulte a documentação de referência da API C# do Cloud Storage.

    Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    
    using Google.Apis.Storage.v1.Data;
    using Google.Cloud.Storage.V1;
    using System;
    using System.Collections.Generic;
    
    public class MakeBucketPublicSample
    {
        public void MakeBucketPublic(string bucketName = "your-unique-bucket-name")
        {
            var storage = StorageClient.Create();
    
            Policy policy = storage.GetBucketIamPolicy(bucketName);
    
            policy.Bindings.Add(new Policy.BindingsData
            {
                Role = "roles/storage.objectViewer",
                Members = new List<string> { "allUsers" }
            });
    
            storage.SetBucketIamPolicy(bucketName, policy);
            Console.WriteLine(bucketName + " is now public ");
        }
    }

    Go

    Para mais informações, consulte a documentação de referência da API Go do Cloud Storage.

    Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    import (
    	"context"
    	"fmt"
    	"io"
    
    	"cloud.google.com/go/iam"
    	"cloud.google.com/go/iam/apiv1/iampb"
    	"cloud.google.com/go/storage"
    )
    
    // setBucketPublicIAM makes all objects in a bucket publicly readable.
    func setBucketPublicIAM(w io.Writer, bucketName string) error {
    	// bucketName := "bucket-name"
    	ctx := context.Background()
    	client, err := storage.NewClient(ctx)
    	if err != nil {
    		return fmt.Errorf("storage.NewClient: %w", err)
    	}
    	defer client.Close()
    
    	policy, err := client.Bucket(bucketName).IAM().V3().Policy(ctx)
    	if err != nil {
    		return fmt.Errorf("Bucket(%q).IAM().V3().Policy: %w", bucketName, err)
    	}
    	role := "roles/storage.objectViewer"
    	policy.Bindings = append(policy.Bindings, &iampb.Binding{
    		Role:    role,
    		Members: []string{iam.AllUsers},
    	})
    	if err := client.Bucket(bucketName).IAM().V3().SetPolicy(ctx, policy); err != nil {
    		return fmt.Errorf("Bucket(%q).IAM().SetPolicy: %w", bucketName, err)
    	}
    	fmt.Fprintf(w, "Bucket %v is now publicly readable\n", bucketName)
    	return nil
    }
    

    Java

    Para mais informações, consulte a documentação de referência da API Java do Cloud Storage.

    Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    import com.google.cloud.Identity;
    import com.google.cloud.Policy;
    import com.google.cloud.storage.Storage;
    import com.google.cloud.storage.StorageOptions;
    import com.google.cloud.storage.StorageRoles;
    
    public class MakeBucketPublic {
      public static void makeBucketPublic(String projectId, String bucketName) {
        // The ID of your GCP project
        // String projectId = "your-project-id";
    
        // The ID of your GCS bucket
        // String bucketName = "your-unique-bucket-name";
    
        Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService();
        Policy originalPolicy = storage.getIamPolicy(bucketName);
        storage.setIamPolicy(
            bucketName,
            originalPolicy.toBuilder()
                .addIdentity(StorageRoles.objectViewer(), Identity.allUsers()) // All users can view
                .build());
    
        System.out.println("Bucket " + bucketName + " is now publicly readable");
      }
    }

    Node.js

    Para mais informações, consulte a documentação de referência da API Node.js do Cloud Storage.

    Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    /**
     * TODO(developer): Uncomment the following lines before running the sample.
     */
    // The ID of your GCS bucket
    // const bucketName = 'your-unique-bucket-name';
    
    // Imports the Google Cloud client library
    const {Storage} = require('@google-cloud/storage');
    
    // Creates a client
    const storage = new Storage();
    
    async function makeBucketPublic() {
      await storage.bucket(bucketName).makePublic();
    
      console.log(`Bucket ${bucketName} is now publicly readable`);
    }
    
    makeBucketPublic().catch(console.error);

    PHP

    Para mais informações, consulte a documentação de referência da API PHP do Cloud Storage.

    Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    use Google\Cloud\Storage\StorageClient;
    
    /**
     * Update the specified bucket's IAM configuration to make it publicly accessible.
     *
     * @param string $bucketName The name of your Cloud Storage bucket.
     *        (e.g. 'my-bucket')
     */
    function set_bucket_public_iam(string $bucketName): void
    {
        $storage = new StorageClient();
        $bucket = $storage->bucket($bucketName);
    
        $policy = $bucket->iam()->policy(['requestedPolicyVersion' => 3]);
        $policy['version'] = 3;
    
        $role = 'roles/storage.objectViewer';
        $members = ['allUsers'];
    
        $policy['bindings'][] = [
            'role' => $role,
            'members' => $members
        ];
    
        $bucket->iam()->setPolicy($policy);
    
        printf('Bucket %s is now public', $bucketName);
    }

    Python

    Para mais informações, consulte a documentação de referência da API Python do Cloud Storage.

    Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    from typing import List
    
    from google.cloud import storage
    
    
    def set_bucket_public_iam(
        bucket_name: str = "your-bucket-name",
        members: List[str] = ["allUsers"],
    ):
        """Set a public IAM Policy to bucket"""
        # bucket_name = "your-bucket-name"
    
        storage_client = storage.Client()
        bucket = storage_client.bucket(bucket_name)
    
        policy = bucket.get_iam_policy(requested_policy_version=3)
        policy.bindings.append(
            {"role": "roles/storage.objectViewer", "members": members}
        )
    
        bucket.set_iam_policy(policy)
    
        print(f"Bucket {bucket.name} is now publicly readable")
    
    

    Ruby

    Para mais informações, consulte a documentação de referência da API Ruby do Cloud Storage.

    Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    def set_bucket_public_iam bucket_name:
      # The ID of your GCS bucket
      # bucket_name = "your-unique-bucket-name"
    
      require "google/cloud/storage"
    
      storage = Google::Cloud::Storage.new
      bucket = storage.bucket bucket_name
    
      bucket.policy do |p|
        p.add "roles/storage.objectViewer", "allUsers"
      end
    
      puts "Bucket #{bucket_name} is now publicly readable"
    end

    Terraform

    # Make bucket public by granting allUsers storage.objectViewer access
    resource "google_storage_bucket_iam_member" "public_rule" {
      bucket = google_storage_bucket.static_website.name
      role   = "roles/storage.objectViewer"
      member = "allUsers"
    }

    APIs REST

    API JSON

    1. Ter a CLI gcloud instalada e inicializada, o que lhe permite gerar um token de acesso para o cabeçalho Authorization.

    2. Crie um ficheiro JSON que contenha as seguintes informações:

      {
        "bindings":[
          {
            "role": "roles/storage.objectViewer",
            "members":["allUsers"]
          }
        ]
      }
    3. Use cURL para chamar a API JSON com um pedido de PUT contentor:

      curl -X PUT --data-binary @JSON_FILE_NAME \
        -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        -H "Content-Type: application/json" \
        "https://storage.googleapis.com/storage/v1/b/BUCKET_NAME/iam"

      Onde:

      • JSON_FILE_NAME é o caminho para o ficheiro JSON que criou no passo 2.
      • BUCKET_NAME é o nome do contentor cujos objetos quer tornar públicos. Por exemplo, my-static-assets.

    API XML

    Tornar todos os objetos num contentor legíveis publicamente não é suportado pela API XML. Em alternativa, use a Google Cloud consolagcloud storage ou gcloud storage, ou defina ACLs para cada objeto individual. Tenha em atenção que, para definir ACLs para cada objeto individual, tem de alterar o modo de controlo de acesso do seu contentor para Detalhado.

    Em alternativa, se quiser, pode tornar partes do seu contentor acessíveis publicamente.

    Os visitantes recebem um código de resposta http 403 quando pedem o URL de um ficheiro não público ou inexistente. Consulte a secção seguinte para ver informações sobre como adicionar uma página de erro que use um código de resposta http 404.

    Recomendado: atribua páginas especializadas

    Pode atribuir um sufixo de página de índice e uma página de erro personalizada, que são conhecidas como páginas especiais. A atribuição de qualquer um dos elementos é opcional, mas se não atribuir um sufixo da página de índice e carregar a página de índice correspondente, os utilizadores que acedem ao seu site de nível superior recebem uma árvore de documentos XML que contém uma lista dos objetos públicos no seu contentor.

    Para mais informações sobre o comportamento das páginas especiais, consulte o artigo Páginas especiais.

    Consola

    1. Na Google Cloud consola, aceda à página Recipientes do Cloud Storage.

      Aceda a Recipientes

    2. Na lista de contentores, encontre o contentor que criou.

    3. Clique no menu Overflow do contentor () associado ao contentor e selecione Editar configuração do Website.

    4. Na caixa de diálogo de configuração do Website, especifique a página principal e a página de erro.

    5. Clique em Guardar.

    Para saber como obter informações detalhadas sobre erros relativos a operações do Cloud Storage falhadas na Google Cloud consola, consulte a secção Resolução de problemas.

    Linha de comandos

    Use o comando buckets update com os indicadores --web-main-page-suffix e --web-error-page.

    No exemplo seguinte, MainPageSuffix está definido como index.html e NotFoundPage está definido como 404.html:

    gcloud storage buckets update gs://my-static-assets --web-main-page-suffix=index.html --web-error-page=404.html

    Se for bem-sucedido, o comando devolve:

    Updating gs://www.example.com/...
      Completed 1

    Bibliotecas cliente

    C++

    Para mais informações, consulte a documentação de referência da API C++ do Cloud Storage.

    Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    namespace gcs = ::google::cloud::storage;
    using ::google::cloud::StatusOr;
    [](gcs::Client client, std::string const& bucket_name,
       std::string const& main_page_suffix, std::string const& not_found_page) {
      StatusOr<gcs::BucketMetadata> original =
          client.GetBucketMetadata(bucket_name);
    
      if (!original) throw std::move(original).status();
      StatusOr<gcs::BucketMetadata> patched = client.PatchBucket(
          bucket_name,
          gcs::BucketMetadataPatchBuilder().SetWebsite(
              gcs::BucketWebsite{main_page_suffix, not_found_page}),
          gcs::IfMetagenerationMatch(original->metageneration()));
      if (!patched) throw std::move(patched).status();
    
      if (!patched->has_website()) {
        std::cout << "Static website configuration is not set for bucket "
                  << patched->name() << "\n";
        return;
      }
    
      std::cout << "Static website configuration successfully set for bucket "
                << patched->name() << "\nNew main page suffix is: "
                << patched->website().main_page_suffix
                << "\nNew not found page is: "
                << patched->website().not_found_page << "\n";
    }

    C#

    Para mais informações, consulte a documentação de referência da API C# do Cloud Storage.

    Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    
    using Google.Apis.Storage.v1.Data;
    using Google.Cloud.Storage.V1;
    using System;
    
    public class BucketWebsiteConfigurationSample
    {
        public Bucket BucketWebsiteConfiguration(
            string bucketName = "your-bucket-name",
            string mainPageSuffix = "index.html",
            string notFoundPage = "404.html")
        {
            var storage = StorageClient.Create();
            var bucket = storage.GetBucket(bucketName);
    
            if (bucket.Website == null)
            {
                bucket.Website = new Bucket.WebsiteData();
            }
            bucket.Website.MainPageSuffix = mainPageSuffix;
            bucket.Website.NotFoundPage = notFoundPage;
    
            bucket = storage.UpdateBucket(bucket);
            Console.WriteLine($"Static website bucket {bucketName} is set up to use {mainPageSuffix} as the index page and {notFoundPage} as the 404 not found page.");
            return bucket;
        }
    }

    Go

    Para mais informações, consulte a documentação de referência da API Go do Cloud Storage.

    Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    import (
    	"context"
    	"fmt"
    	"io"
    	"time"
    
    	"cloud.google.com/go/storage"
    )
    
    // setBucketWebsiteInfo sets website configuration on a bucket.
    func setBucketWebsiteInfo(w io.Writer, bucketName, indexPage, notFoundPage string) error {
    	// bucketName := "www.example.com"
    	// indexPage := "index.html"
    	// notFoundPage := "404.html"
    	ctx := context.Background()
    	client, err := storage.NewClient(ctx)
    	if err != nil {
    		return fmt.Errorf("storage.NewClient: %w", err)
    	}
    	defer client.Close()
    
    	ctx, cancel := context.WithTimeout(ctx, time.Second*10)
    	defer cancel()
    
    	bucket := client.Bucket(bucketName)
    	bucketAttrsToUpdate := storage.BucketAttrsToUpdate{
    		Website: &storage.BucketWebsite{
    			MainPageSuffix: indexPage,
    			NotFoundPage:   notFoundPage,
    		},
    	}
    	if _, err := bucket.Update(ctx, bucketAttrsToUpdate); err != nil {
    		return fmt.Errorf("Bucket(%q).Update: %w", bucketName, err)
    	}
    	fmt.Fprintf(w, "Static website bucket %v is set up to use %v as the index page and %v as the 404 page\n", bucketName, indexPage, notFoundPage)
    	return nil
    }
    

    Java

    Para mais informações, consulte a documentação de referência da API Java do Cloud Storage.

    Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    import com.google.cloud.storage.Bucket;
    import com.google.cloud.storage.Storage;
    import com.google.cloud.storage.StorageOptions;
    
    public class SetBucketWebsiteInfo {
      public static void setBucketWesbiteInfo(
          String projectId, String bucketName, String indexPage, String notFoundPage) {
        // The ID of your GCP project
        // String projectId = "your-project-id";
    
        // The ID of your static website bucket
        // String bucketName = "www.example.com";
    
        // The index page for a static website bucket
        // String indexPage = "index.html";
    
        // The 404 page for a static website bucket
        // String notFoundPage = "404.html";
    
        Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService();
        Bucket bucket = storage.get(bucketName);
        bucket.toBuilder().setIndexPage(indexPage).setNotFoundPage(notFoundPage).build().update();
    
        System.out.println(
            "Static website bucket "
                + bucketName
                + " is set up to use "
                + indexPage
                + " as the index page and "
                + notFoundPage
                + " as the 404 page");
      }
    }

    Node.js

    Para mais informações, consulte a documentação de referência da API Node.js do Cloud Storage.

    Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    /**
     * TODO(developer): Uncomment the following lines before running the sample.
     */
    // The ID of your GCS bucket
    // const bucketName = 'your-unique-bucket-name';
    
    // The name of the main page
    // const mainPageSuffix = 'http://example.com';
    
    // The Name of a 404 page
    // const notFoundPage = 'http://example.com/404.html';
    
    // Imports the Google Cloud client library
    const {Storage} = require('@google-cloud/storage');
    
    // Creates a client
    const storage = new Storage();
    
    async function addBucketWebsiteConfiguration() {
      await storage.bucket(bucketName).setMetadata({
        website: {
          mainPageSuffix,
          notFoundPage,
        },
      });
    
      console.log(
        `Static website bucket ${bucketName} is set up to use ${mainPageSuffix} as the index page and ${notFoundPage} as the 404 page`
      );
    }
    
    addBucketWebsiteConfiguration().catch(console.error);

    PHP

    Para mais informações, consulte a documentação de referência da API PHP do Cloud Storage.

    Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    use Google\Cloud\Storage\StorageClient;
    
    /**
     * Update the given bucket's website configuration.
     *
     * @param string $bucketName The name of your Cloud Storage bucket.
     *        (e.g. 'my-bucket')
     * @param string $indexPageObject the name of an object in the bucket to use as
     *        (e.g. 'index.html')
     *     an index page for a static website bucket.
     * @param string $notFoundPageObject the name of an object in the bucket to use
     *        (e.g. '404.html')
     *     as the 404 Not Found page.
     */
    function define_bucket_website_configuration(string $bucketName, string $indexPageObject, string $notFoundPageObject): void
    {
        $storage = new StorageClient();
        $bucket = $storage->bucket($bucketName);
    
        $bucket->update([
            'website' => [
                'mainPageSuffix' => $indexPageObject,
                'notFoundPage' => $notFoundPageObject
            ]
        ]);
    
        printf(
            'Static website bucket %s is set up to use %s as the index page and %s as the 404 page.',
            $bucketName,
            $indexPageObject,
            $notFoundPageObject
        );
    }

    Python

    Para mais informações, consulte a documentação de referência da API Python do Cloud Storage.

    Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    from google.cloud import storage
    
    
    def define_bucket_website_configuration(bucket_name, main_page_suffix, not_found_page):
        """Configure website-related properties of bucket"""
        # bucket_name = "your-bucket-name"
        # main_page_suffix = "index.html"
        # not_found_page = "404.html"
    
        storage_client = storage.Client()
    
        bucket = storage_client.get_bucket(bucket_name)
        bucket.configure_website(main_page_suffix, not_found_page)
        bucket.patch()
    
        print(
            "Static website bucket {} is set up to use {} as the index page and {} as the 404 page".format(
                bucket.name, main_page_suffix, not_found_page
            )
        )
        return bucket
    
    

    Ruby

    Para mais informações, consulte a documentação de referência da API Ruby do Cloud Storage.

    Para se autenticar no Cloud Storage, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para bibliotecas de cliente.

    def define_bucket_website_configuration bucket_name:, main_page_suffix:, not_found_page:
      # The ID of your static website bucket
      # bucket_name = "www.example.com"
    
      # The index page for a static website bucket
      # main_page_suffix = "index.html"
    
      # The 404 page for a static website bucket
      # not_found_page = "404.html"
    
      require "google/cloud/storage"
    
      storage = Google::Cloud::Storage.new
      bucket = storage.bucket bucket_name
    
      bucket.update do |b|
        b.website_main = main_page_suffix
        b.website_404 = not_found_page
      end
    
      puts "Static website bucket #{bucket_name} is set up to use #{main_page_suffix} as the index page and " \
           "#{not_found_page} as the 404 page"
    end

    APIs REST

    API JSON

    1. Ter a CLI gcloud instalada e inicializada, o que lhe permite gerar um token de acesso para o cabeçalho Authorization.

    2. Crie um ficheiro JSON que defina as propriedades mainPageSuffix e notFoundPage num objeto website para as páginas pretendidas.

      No exemplo seguinte, mainPageSuffix está definido como index.html e notFoundPage está definido como 404.html:

      {
        "website":{
          "mainPageSuffix": "index.html",
          "notFoundPage": "404.html"
        }
      }
    3. Use cURL para chamar a API JSON com um pedido de PATCH contentor. Para o contentor my-static-assets:

      curl -X PATCH --data-binary @web-config.json \
        -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        -H "Content-Type: application/json" \
        "https://storage.googleapis.com/storage/v1/b/my-static-assets"

    API XML

    1. Ter a CLI gcloud instalada e inicializada, o que lhe permite gerar um token de acesso para o cabeçalho Authorization.

    2. Crie um ficheiro XML que defina os elementos MainPageSuffix e NotFoundPage num elemento WebsiteConfiguration para as páginas pretendidas.

      No exemplo seguinte, MainPageSuffix está definido como index.html e NotFoundPage está definido como 404.html:

      <WebsiteConfiguration>
        <MainPageSuffix>index.html</MainPageSuffix>
        <NotFoundPage>404.html</NotFoundPage>
      </WebsiteConfiguration>
    3. Use cURL para chamar a API XML com um pedido de PUT contentor e um parâmetro de string de consulta websiteConfig. Para my-static-assets:

      curl -X PUT --data-binary @web-config.xml \
        -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        https://storage.googleapis.com/my-static-assets?websiteConfig

    Configure o balanceador de carga e o certificado SSL

    O Cloud Storage não suporta domínios personalizados com HTTPS por si só, pelo que também tem de configurar um certificado SSL anexado a um equilibrador de carga HTTPS para publicar o seu Website através de HTTPS. Esta secção mostra como adicionar o seu contentor ao back-end de um equilibrador de carga e como adicionar um novo certificado SSL gerido pela Google ao front-end do equilibrador de carga.

    Selecione o tipo de balanceador de carga

    1. Na Google Cloud consola, aceda à página Equilíbrio de carga.

      Aceda a Balanceamento de carga

    2. Clique em Criar equilibrador de carga.
    3. Em Tipo de balanceador de carga, selecione Balanceador de carga de aplicações (HTTP/HTTPS) e clique em Seguinte.
    4. Clique em Configurar.

    É apresentada a janela de configuração do equilibrador de carga.

    Configuração básica

    Antes de continuar com a configuração, introduza um nome do equilibrador de carga, como example-lb.

    Configure a interface

    Esta secção mostra como configurar o protocolo HTTPS e criar um certificado SSL. Também pode selecionar um certificado existente ou carregar um certificado SSL autogerido.

    1. Clique em Configuração do front-end.
    2. (Opcional) Atribua um nome à configuração do frontend.
    3. Para Protocolo, selecione HTTPS (inclui HTTP/2).
    4. Para Versão do IP, selecione IPv4. Se preferir o IPv6, consulte o artigo Encerramento do IPv6 para ver informações adicionais.
    5. Para o campo Endereço IP:

      • No menu pendente, clique em Criar endereço IP.
      • Na caixa de diálogo Reservar um novo endereço IP estático, introduza um nome, como example-ip, para o Nome do endereço IP.
      • Clique em Reservar.
    6. Em Porta, selecione 443.

    7. No menu pendente do campo Certificado, selecione Criar um novo certificado. O formulário de criação de certificados é apresentado num painel. Configure o seguinte:

      • Atribua um nome ao certificado, como example-ssl.
      • Para o Modo de criação, selecione Criar certificado gerido pela Google.
      • Para Domínios, introduza o nome do seu Website, como www.example.com. Se quiser publicar o seu conteúdo através de domínios adicionais, como o domínio raiz example.com, prima Enter para os adicionar em linhas adicionais. Cada certificado tem um limite de 100 domínios.
    8. Clique em Criar.

    9. (Opcional) Se quiser Google Cloud configurar automaticamente um balanceador de carga HTTP parcial para redirecionar o tráfego HTTP, selecione a caixa de verificação junto a Ativar redirecionamento de HTTP para HTTPS.

    10. Clique em Concluído.

    Configure o back-end

    1. Clique em Configuração de back-end.
    2. No menu pendente Serviços de back-end e contentores de back-end, clique em Criar um contentor de back-end.
    3. Escolha um nome do contentor de back-end, como example-bucket. O nome que escolher pode ser diferente do nome do contentor que criou anteriormente.
    4. Clique em Procurar, que se encontra no campo Contentor do Cloud Storage.
    5. Selecione o contentor my-static-assets que criou anteriormente e clique em Selecionar.
    6. (Opcional) Se quiser usar o Cloud CDN, selecione a caixa de verificação Ativar Cloud CDN e configure o Cloud CDN conforme pretendido. Tenha em atenção que o Cloud CDN pode incorrer em custos adicionais.
    7. Clique em Criar.

    Configure regras de encaminhamento

    As regras de encaminhamento são os componentes do mapa de URLs de um balanceador de carga de aplicações externo. Para este tutorial, deve ignorar esta parte da configuração do equilibrador de carga, porque está automaticamente definida para usar o back-end que acabou de configurar.

    Reveja a configuração

    1. Clique em Rever e finalizar.
    2. Reveja o front-end, as regras de encaminhamento e o back-end.
    3. Clique em Criar.

    Pode ter de aguardar alguns minutos para que o equilibrador de carga seja criado.

    Associe o seu domínio ao balanceador de carga

    Depois de criar o balanceador de carga, clique no nome do balanceador de carga: example-lb. Tome nota do endereço IP associado ao balanceador de carga: por exemplo, 30.90.80.100. Para direcionar o seu domínio para o equilibrador de carga, crie um registo A através do serviço de registo de domínios. Se adicionou vários domínios ao seu certificado SSL, tem de adicionar um registo A para cada um, todos a apontar para o endereço IP do equilibrador de carga. Por exemplo, para criar registos A para www.example.com e example.com:

    NAME                  TYPE     DATA
    www                   A        30.90.80.100
    @                     A        30.90.80.100

    Consulte o artigo Resolução de problemas do estado do domínio para mais informações sobre como associar o seu domínio ao equilibrador de carga.

    O aprovisionamento do certificado e a disponibilização do site através do equilibrador de carga podem demorar até 60 a 90 minutos. Google Cloud Para monitorizar o estado do seu certificado:

    Consola

    1. Aceda à página Balanceamento de carga na Google Cloud consola.
      Aceda a Balanceamento de carga
    2. Clique no nome do balanceador de carga: example-lb.
    3. Clique no nome do certificado SSL associado ao balanceador de carga: example-ssl.
    4. As linhas Estado e Estado do domínio mostram o estado do certificado. Ambos têm de estar ativos para que o certificado seja válido para o seu Website.

    Linha de comandos

    1. Para verificar o estado do certificado, execute o seguinte comando:

      gcloud compute ssl-certificates describe CERTIFICATE_NAME \
        --global \
        --format="get(name,managed.status)"
      
    2. Para verificar o estado do domínio, execute o seguinte comando:

      gcloud compute ssl-certificates describe CERTIFICATE_NAME \
        --global \
        --format="get(managed.domainStatus)"
      

    Consulte o artigo Resolução de problemas de certificados SSL para mais informações sobre o estado do certificado.

    Teste o Website

    Assim que o certificado SSL estiver ativo, verifique se o conteúdo é publicado a partir do contentor acedendo a https://www.example.com/test.html, onde test.html é um objeto armazenado no contentor que está a usar como back-end. Se definir a propriedade MainPageSuffix, https://www.example.com passa a index.html.

    Limpar

    Depois de concluir o tutorial, pode limpar os recursos que criou para que deixem de usar a quota e incorrer em custos. As secções seguintes descrevem como eliminar ou desativar estes recursos.

    Elimine o projeto

    A forma mais fácil de eliminar a faturação é eliminar o projeto que criou para o tutorial.

    Para eliminar o projeto:

    1. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    2. In the project list, select the project that you want to delete, and then click Delete.
    3. In the dialog, type the project ID, and then click Shut down to delete the project.

    Elimine o balanceador de carga e o contentor

    Se não quiser eliminar todo o projeto, elimine o balanceador de carga e o contentor que criou para o tutorial:

    1. Aceda à página Balanceamento de carga na Google Cloud consola.
      Aceda a Balanceamento de carga
    2. Selecione a caixa de verificação junto a example-lb.
    3. Clique em Eliminar.
    4. (Opcional) Selecione a caixa de verificação junto aos recursos que quer eliminar juntamente com o balanceador de carga, como o contentor my-static-assets ou o certificado SSL example-ssl.
    5. Clique em Eliminar balanceador de carga ou Eliminar balanceador de carga e os recursos selecionados.

    Liberte um endereço IP reservado

    Para eliminar o endereço IP reservado que usou para o tutorial:

    1. Na Google Cloud consola, aceda à página Endereços IP externos.

      Aceda a Endereços IP externos

    2. Selecione as caixas de verificação junto a example-ip.

    3. Clique em Retirar endereço estático.

    4. Na janela de confirmação, clique em Eliminar.

    O que se segue?

    Experimente

    Se está a usar o Google Cloud pela primeira vez, crie uma conta para avaliar o desempenho do Cloud Storage em cenários reais. Os novos clientes também recebem 300 USD em créditos gratuitos para executar, testar e implementar cargas de trabalho.

    Experimentar o Cloud Storage gratuitamente