Haz públicos los datos

En esta página, se muestra cómo hacer que los objetos que posees sean legibles para todos en la Internet pública. Para obtener más información sobre cómo acceder a los datos que se hicieron públicos, consulta Accede a datos públicos.

Cuando un objeto se comparte de forma pública, cualquier usuario que conozca el URI del objeto puede acceder a él mientras sea público.

Roles obligatorios

Para obtener los permisos necesarios para que los objetos sean legibles de forma pública, pídele a tu administrador que te otorgue los siguientes roles para el bucket que contiene los datos que quieres hacer públicos:

  • Para que todos los objetos de un bucket sean legibles de forma pública: administrador de Storage (roles/storage.admin)

  • Para que los objetos individuales sean legibles de forma pública: administrador de objetos de Storage (roles/storage.objectAdmin)

    • Si planeas usar la consola de Google Cloud, necesitarás el rol de administrador de Storage (roles/storage.admin) en lugar del rol de administrador de objetos de Storage.

Estos roles contienen los permisos necesarios para hacer públicos los objetos. Para ver los permisos exactos que son necesarios, expande la sección Permisos requeridos:

Permisos necesarios

  • storage.buckets.get
  • storage.buckets.getIamPolicy
  • storage.buckets.setIamPolicy
  • storage.buckets.update
  • storage.objects.get
  • storage.objects.getIamPolicy
  • storage.objects.setIamPolicy
  • storage.objects.update

Los siguientes permisos solo son necesarios para usar la consola de Google Cloud para realizar la tarea en esta página:

  • storage.buckets.list
  • storage.objects.list

También puedes obtener estos permisos con otros roles predefinidos o roles personalizados.

Para obtener instrucciones para otorgar roles a los buckets, consulta Usa IAM con buckets.

Haz que todos los objetos de un bucket se puedan leer de forma pública

Para que todos los objetos de un bucket sean legibles para todos en la Internet pública, otorga a la principal allUsers el rol de visualizador de objetos de Storage (roles/storage.objectViewer):

Console

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

    Ir a Buckets

  2. En la lista de buckets, haz clic en el nombre del bucket que deseas hacer público.

  3. Selecciona la pestaña Permisos cerca de la parte superior de la página.

  4. En la sección Permisos, haz clic en el botón Otorgar acceso.

    Aparecerá el cuadro de diálogo Otorgar acceso.

  5. En el campo Principales nuevas, ingresa allUsers.

  6. En el menú desplegable Seleccionar un rol, ingresa Storage Object Viewer en el cuadro de filtro y selecciona Visualizador de objetos de almacenamiento a partir de los resultados filtrados.

  7. Haz clic en Guardar.

  8. Haga clic en Permitir acceso público.

Una vez que se otorgue el acceso público, aparecerá Copiar URL para cada objeto de la columna de acceso público. Puedes hacer clic en este botón para obtener la URL pública del objeto.

Para obtener información sobre cómo ver detalles de errores acerca de operaciones fallidas de Cloud Storage en la consola de Google Cloud, consulta Solución de problemas.

Línea de comandos

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. En tu entorno de desarrollo, ejecuta el comando buckets add-iam-policy-binding:

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

    En este comando, BUCKET_NAME es el nombre del bucket cuyos objetos quieres hacer públicos. Por ejemplo, my-bucket

Bibliotecas cliente

C++

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

Para autenticarte en Cloud Storage, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas 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#

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

Para autenticarte en Cloud Storage, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas 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

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

Para autenticarte en Cloud Storage, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas 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

Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud Storage Java.

Para autenticarte en Cloud Storage, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas 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

Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud Storage Node.js.

Para autenticarte en Cloud Storage, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas 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

Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud Storage PHP.

Para autenticarte en Cloud Storage, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas 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

Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud Storage Python.

Para autenticarte en Cloud Storage, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas 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

Si deseas obtener más información, consulta la documentación de referencia de la API de Cloud Storage Ruby.

Para autenticarte en Cloud Storage, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas 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

Puedes usar un recurso de Terraform para hacer públicos todos los objetos en un bucket.

# Make bucket public
resource "google_storage_bucket_iam_member" "member" {
  provider = google
  bucket   = google_storage_bucket.default.name
  role     = "roles/storage.objectViewer"
  member   = "allUsers"
}

API de REST

API de JSON

  1. Tener la gcloud CLI instalada e inicializada, lo que te permite generar un token de acceso para el encabezado Authorization.

  2. Crea un archivo JSON que contenga la siguiente información:

    {
      "bindings":[
        {
          "role": "roles/storage.objectViewer",
          "members":["allUsers"]
        }
      ]
    }
  3. Usa cURL para llamar a la API de JSON con una solicitud de bucket PUT:

    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"

    Aquí:

    • JSON_FILE_NAME es la ruta de acceso del archivo que creaste en el paso 2.
    • BUCKET_NAME es el nombre del bucket cuyos objetos quieres hacer públicos. Por ejemplo, my-bucket.

API de XML

La API de XML no admite que todos los objetos de un bucket se hagan legibles de forma pública. En su lugar, usa la consola de Google Cloud o gcloud storage.

Haz que una parte de un bucket sea de lectura pública

Usa una carpeta administrada para controlar el acceso a los objetos cuyo prefijo de nombre coincida con el nombre de la carpeta administrada. Por ejemplo, se puede usar una carpeta administrada llamada my-folder para controlar el acceso a los objetos llamados my-folder/cats.jpg y my-folder/dogs.jpg.

Para hacer que esos objetos tengan acceso público, primero crea la carpeta administrada y, luego, establece una política de IAM en la carpeta que otorga a allUsers el rol de visualizador de objetos de Storage (roles/storage.objectViewer):

Console

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

    Ir a Buckets

  2. Haz clic en el nombre del bucket que contiene los objetos que quieres hacer públicos.

  3. Sigue estos pasos para crear una carpeta:

    1. Haz clic en el botón Crear carpeta.

    2. Ingresa el nombre de la carpeta. Una vez que la carpeta se convierta en una carpeta administrada, los objetos cuyo nombre comience con este nombre estarán sujetos a los roles de IAM establecidos en la carpeta.

    3. Haz clic en Crear.

  4. Sigue estos pasos para convertir la carpeta en una carpeta administrada:

    1. En el panel que muestra el contenido del bucket, busca el nombre de la carpeta que creaste y haz clic en el ícono Más opciones .

    2. Haz clic en acceso de edición.

    3. En la ventana que aparece, haz clic en Habilitar.

  5. Agrega una política de IAM a la carpeta que otorgue a allUsers el rol de visualizador de objetos de Storage (roles/storage.objectViewer) con los siguientes pasos:

    1. Si el panel Permisos de tu carpeta administrada aún no está abierto, haz clic en el ícono Más opciones de la carpeta administrada y, luego, en Editar acceso.

    2. En el panel Permissions, haz clic en el botón Agregar principal.

    3. En el campo Principales nuevas, ingresa allUsers.

    4. En el menú desplegable Seleccionar un rol, ingresa Storage Object Viewer en el cuadro de filtro y selecciona Visualizador de objetos de almacenamiento a partir de los resultados filtrados.

    5. Haz clic en Guardar.

    6. Haz clic en Permitir acceso público.

Una vez que se otorgue el acceso público, aparecerá Copiar URL para cada objeto de la columna de acceso público. Puedes hacer clic en este botón para obtener la URL pública del objeto.

Para obtener información sobre cómo ver detalles de errores acerca de operaciones fallidas de Cloud Storage en la consola de Google Cloud, consulta Solución de problemas.

Línea de comandos

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. En tu entorno de desarrollo, crea una carpeta administrada con el comando gcloud storage managed-folders create:

    gcloud storage managed-folders create gs://BUCKET_NAME/MANAGED_FOLDER_NAME/

    Aquí:

    • BUCKET_NAME es el nombre del bucket en el que deseas crear una carpeta administrada. Por ejemplo, my-bucket

    • MANAGED_FOLDER_NAME es el nombre de la carpeta administrada que deseas crear. Por ejemplo, my-managed-folder

  3. En tu entorno de desarrollo, agrega allUsers a la política de IAM de la carpeta administrada con el comando gcloud storage managed-folders add-iam-policy-binding:

    gcloud storage managed-folders add-iam-policy-binding gs://BUCKET_NAME/MANAGED_FOLDER_NAME --member=allUsers --role=roles/storage.objectViewer

    Aquí:

    • BUCKET_NAME es el nombre del bucket que contiene la carpeta administrada a la que agregas la política de IAM. Por ejemplo, my-bucket
    • MANAGED_FOLDER_NAME es el nombre de la carpeta administrada a la que deseas agregar acceso público. Por ejemplo, my-managed-folder

API de REST

API de JSON

  1. Tener la gcloud CLI instalada e inicializada, lo que te permite generar un token de acceso para el encabezado Authorization.

  2. Crea un archivo JSON que contenga la siguiente información:

    {
      "name": "MANAGED_FOLDER_NAME"
    }

    En el que MANAGED_FOLDER_NAME es el nombre de la carpeta administrada que deseas crear. Por ejemplo, my-managed-folder

  3. Usa cURL para llamar a la API de JSON con una solicitud Insert ManagedFolder:

    curl -X POST --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/managedFolders"

    Aquí:

    • JSON_FILE_NAME es la ruta de acceso al archivo que creaste en el paso anterior.
    • BUCKET_NAME es el nombre del bucket en el que deseas crear una carpeta administrada. Por ejemplo, my-bucket
  4. Crea un archivo JSON que contenga la siguiente información:

    {
      "bindings":[
        {
          "role": "roles/storage.objectViewer",
          "members":["allUsers"]
        }
      ]
    }
  5. Usa cURL para llamar a la API de JSON con una solicitud de ManagedFolder setIamPolicy:

    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/managedFolders/MANAGED_FOLDER_NAME/iam"

    Aquí:

    • JSON_FILE_NAME es la ruta de acceso al archivo que creaste en el paso anterior.
    • BUCKET_NAME es el nombre del bucket que contiene la carpeta administrada a la que agregas la política de IAM. Por ejemplo, my-bucket
    • MANAGED_FOLDER_NAME es el nombre de la carpeta administrada a la que agregas la política de IAM. Por ejemplo, my-managed-folder

API de XML

La API de XML no admite el trabajo con carpetas administradas. Usa una herramienta diferente, como la consola de Google Cloud, o establece las LCA en objetos individuales con las solicitudes Set Object ACL. El siguiente es un archivo de LCA de ejemplo que otorgaría acceso a allUsers a un objeto:

<AccessControlList>
  <Entries>
    <Entry>
      <Scope type="AllUsers"/>
      <Permission>READ</Permission>
    </Entry>
  </Entries>
</AccessControlList>

¿Qué sigue?