Pubblicazione dei dati

In questa pagina viene spiegato come rendere gli oggetti di tua proprietà leggibili a tutti su Internet. Per informazioni su come accedere ai dati resi pubblici, leggi l'articolo su come accedere ai dati pubblici.

Quando un oggetto è condiviso pubblicamente, qualsiasi utente che conosce l'URI dell'oggetto può accedere all'oggetto finché l'oggetto è pubblico.

Prerequisiti

I prerequisiti possono variare in base allo strumento utilizzato:

console

Per completare questa guida utilizzando Google Cloud Console, devi disporre delle autorizzazioni IAM appropriate. Se gli oggetti o i bucket a cui vuoi accedere esistono in un progetto che non hai creato, potresti avere bisogno del proprietario del progetto per assegnarti un ruolo contenente le autorizzazioni necessarie.

Per un elenco delle autorizzazioni necessarie per azioni specifiche, consulta Autorizzazioni IAM per Google Cloud Console.

Per un elenco dei ruoli pertinenti, consulta Ruoli di Cloud Storage. In alternativa, puoi creare un ruolo personalizzato con autorizzazioni specifiche e limitate.

Riga di comando

Per completare questa guida utilizzando un'utilità a riga di comando, devi disporre delle autorizzazioni IAM appropriate. Se gli oggetti o i bucket a cui vuoi accedere esistono in un progetto che non hai creato, potresti avere bisogno del proprietario del progetto per assegnarti un ruolo contenente le autorizzazioni necessarie.

Per un elenco delle autorizzazioni necessarie per azioni specifiche, consulta Autorizzazioni IAM per comandi gsutil.

Per un elenco dei ruoli pertinenti, consulta Ruoli di Cloud Storage. In alternativa, puoi creare un ruolo personalizzato con autorizzazioni specifiche e limitate.

Esempi di codice

Per completare questa guida utilizzando le librerie client di Cloud Storage, devi disporre delle autorizzazioni IAM appropriate. Se gli oggetti o i bucket a cui vuoi accedere esistono in un progetto che non hai creato, potresti avere bisogno del proprietario del progetto per assegnarti un ruolo contenente le autorizzazioni necessarie. Se non diversamente indicato, le richieste della libreria client vengono effettuate tramite l'API JSON.

Per un elenco delle autorizzazioni necessarie per azioni specifiche, consulta le autorizzazioni IAM per i metodi JSON.

Per un elenco dei ruoli pertinenti, consulta Ruoli di Cloud Storage. In alternativa, puoi creare un ruolo personalizzato con autorizzazioni specifiche e limitate.

API REST

API JSON

Per completare questa guida utilizzando l'API JSON, devi disporre delle autorizzazioni IAM appropriate. Se gli oggetti o i bucket a cui vuoi accedere esistono in un progetto non creato da te, potresti dover chiedere al proprietario del progetto di assegnarti un ruolo contenente le autorizzazioni necessarie.

Per un elenco delle autorizzazioni necessarie per azioni specifiche, consulta le autorizzazioni IAM per i metodi JSON.

Per un elenco dei ruoli pertinenti, consulta Ruoli di Cloud Storage. In alternativa, puoi creare un ruolo personalizzato con autorizzazioni specifiche e limitate.

Rendi i singoli oggetti leggibili pubblicamente

Per rendere singoli oggetti leggibili da chiunque sulla rete Internet pubblica:

console

  1. In Google Cloud Console, vai alla pagina Browser di Cloud Storage.

    Vai al browser

  2. Fai clic sul nome del bucket che contiene l'oggetto che vuoi rendere pubblico e vai all'oggetto se si trova in una sottodirectory.

  3. Fai clic sul menu Altre azioni () associato all'oggetto che vuoi rendere pubblico.

  4. Seleziona Accesso in modifica dal menu a discesa.

  5. Nell'overlay visualizzato, fai clic sul pulsante + Aggiungi voce.

  6. Aggiungi un'autorizzazione per allUsers.

    • Seleziona Pubblico per l'entità.
    • Seleziona tutti gli utenti per il Nome.
    • Seleziona Lettore per l'accesso.
  7. Fai clic su Salva.

Una volta autorizzato l'accesso pubblico, nella colonna accesso pubblico viene visualizzato Copia URL. Puoi fare clic su questo pulsante per ottenere l'URL pubblico dell'oggetto.

Per informazioni dettagliate sugli errori nelle operazioni non riuscite nel browser di Cloud Storage, consulta la sezione Risoluzione dei problemi.

Riga di comando

Utilizza il comando gsutil acl ch:

gsutil acl ch -u AllUsers:R gs://BUCKET_NAME/OBJECT_NAME

Dove:

  • BUCKET_NAME è il nome del bucket che contiene l'oggetto che vuoi rendere pubblico. Ad esempio, my-bucket.
  • OBJECT_NAME è il nome dell'oggetto che vuoi rendere pubblico. Ad esempio, pets/dog.png.

In caso di esito positivo, la risposta sarà simile al seguente esempio:

Updated ACL on gs://my-bucket/pets/dog.png

Esempi di codice

C++

Per maggiori informazioni, consulta la documentazione di riferimento dell'API Cloud Storage C++.

namespace gcs = ::google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string const& bucket_name,
   std::string const& object_name) {
  StatusOr<gcs::ObjectMetadata> updated = client.PatchObject(
      bucket_name, object_name, gcs::ObjectMetadataPatchBuilder(),
      gcs::PredefinedAcl::PublicRead());

  if (!updated) throw std::runtime_error(updated.status().message());
  std::cout << "Object updated. The full metadata after the update is: "
            << *updated << "\n";
}

C#

Per maggiori informazioni, consulta la documentazione di riferimento dell'API Cloud Storage C# .


using Google.Apis.Storage.v1.Data;
using Google.Cloud.Storage.V1;
using System;
using System.Collections.Generic;

public class MakePublicSample
{
    public string MakePublic(
        string bucketName = "your-unique-bucket-name",
        string objectName = "your-object-name")
    {
        var storage = StorageClient.Create();
        var storageObject = storage.GetObject(bucketName, objectName);
        storageObject.Acl ??= new List<ObjectAccessControl>();
        storage.UpdateObject(storageObject, new UpdateObjectOptions { PredefinedAcl = PredefinedObjectAcl.PublicRead });
        Console.WriteLine(objectName + " is now public and can be fetched from " + storageObject.MediaLink);

        return storageObject.MediaLink;
    }
}

Go

Per maggiori informazioni, consulta la documentazione di riferimento dell'API Cloud Storage Go.

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

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

// makePublic gives all users read access to an object.
func makePublic(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: %v", err)
	}
	defer client.Close()

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

	acl := client.Bucket(bucket).Object(object).ACL()
	if err := acl.Set(ctx, storage.AllUsers, storage.RoleReader); err != nil {
		return fmt.Errorf("ACLHandle.Set: %v", err)
	}
	fmt.Fprintf(w, "Blob %v is now publicly accessible.\n", object)
	return nil
}

Java

Per maggiori informazioni, consulta la documentazione di riferimento dell'API Cloud Storage Java.

import com.google.cloud.storage.Acl;
import com.google.cloud.storage.BlobId;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;

public class MakeObjectPublic {
  public static void makeObjectPublic(String projectId, String bucketName, String objectName) {
    // String projectId = "your-project-id";
    // String bucketName = "your-bucket-name";
    // String objectName = "your-object-name";
    Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService();
    BlobId blobId = BlobId.of(bucketName, objectName);
    storage.createAcl(blobId, Acl.of(Acl.User.ofAllUsers(), Acl.Role.READER));

    System.out.println(
        "Object " + objectName + " in bucket " + bucketName + " was made publicly readable");
  }
}

Node.js

Per maggiori informazioni, consulta la documentazione di riferimento dell'API Cloud Storage Node.js.

/**
 * 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 your GCS file
// const fileName = 'your-file-name';

// Imports the Google Cloud client library
const {Storage} = require('@google-cloud/storage');

// Creates a client
const storage = new Storage();

async function makePublic() {
  await storage.bucket(bucketName).file(fileName).makePublic();

  console.log(`gs://${bucketName}/${fileName} is now public.`);
}

makePublic().catch(console.error);

PHP

Per maggiori informazioni, consulta la documentazione di riferimento dell'API Cloud Storage PHP.

use Google\Cloud\Storage\StorageClient;

/**
 * Make an object publically accessible.
 *
 * @param string $bucketName The name of your Cloud Storage bucket.
 * @param string $objectName The name of your Cloud Storage object.
 */
function make_public($bucketName, $objectName)
{
    // $bucketName = 'my-bucket';
    // $objectName = 'my-object';

    $storage = new StorageClient();
    $bucket = $storage->bucket($bucketName);
    $object = $bucket->object($objectName);
    $object->update(['acl' => []], ['predefinedAcl' => 'PUBLICREAD']);
    printf('gs://%s/%s is now public' . PHP_EOL, $bucketName, $objectName);
}

Python

Per maggiori informazioni, consulta la documentazione di riferimento dell'API Cloud Storage Python.

from google.cloud import storage

def make_blob_public(bucket_name, blob_name):
    """Makes a blob publicly accessible."""
    # bucket_name = "your-bucket-name"
    # blob_name = "your-object-name"

    storage_client = storage.Client()
    bucket = storage_client.bucket(bucket_name)
    blob = bucket.blob(blob_name)

    blob.make_public()

    print(
        f"Blob {blob.name} is publicly accessible at {blob.public_url}"
    )

Ruby

Per maggiori informazioni, consulta la documentazione di riferimento dell'API Cloud Storage Ruby.

def make_public bucket_name:, file_name:
  # The ID of your GCS bucket
  # bucket_name = "your-unique-bucket-name"

  # The ID of your GCS object to make public
  # file_name = "your-file-name"

  require "google/cloud/storage"

  storage = Google::Cloud::Storage.new
  bucket  = storage.bucket bucket_name, skip_lookup: true
  file    = bucket.file file_name

  file.acl.public!

  puts "#{file.name} is publicly accessible at #{file.public_url}"
end

API REST

API JSON

  1. Ottieni un token di accesso all'autorizzazione da OAuth 2.0 Playground. Configura il parco giochi in modo che utilizzi le tue credenziali OAuth. Per le istruzioni, consulta la pagina relativa all'autenticazione API.
  2. Crea un file JSON contenente le seguenti informazioni:

    {
      "entity": "allUsers",
      "role": "READER"
    }
  3. Utilizza cURL per chiamare l'API JSON con una richiestaInsert ACL:

    curl -X POST --data-binary @JSON_FILE_NAME \
      -H "Authorization: Bearer OAUTH2_TOKEN" \
      -H "Content-Type: application/json" \
      "https://storage.googleapis.com/storage/v1/b/BUCKET_NAME/o/OBJECT_NAME/acl"

    Dove:

    • JSON_FILE_NAME è il percorso del file che hai creato nel passaggio 2.
    • OAUTH2_TOKEN è il token di accesso che hai creato nel passaggio 1.
    • BUCKET_NAME è il nome del bucket contenente l'oggetto che vuoi rendere pubblico. Ad esempio, my-bucket.
    • OBJECT_NAME è il nome con codifica URL dell'oggetto che vuoi rendere pubblico. Ad esempio, pets/dog.png, ha la codifica URL come pets%2Fdog.png.

API XML

  1. Ottieni un token di accesso all'autorizzazione da OAuth 2.0 Playground. Configura il parco giochi in modo che utilizzi le tue credenziali OAuth. Per le istruzioni, consulta la pagina relativa all'autenticazione API.
  2. Crea un file XML contenente le seguenti informazioni:

    <AccessControlList>
      <Entries>
        <Entry>
          <Scope type="AllUsers"/>
          <Permission>READ</Permission>
        </Entry>
      </Entries>
    </AccessControlList>
  3. Utilizza cURL per chiamare l'API XML con una richiesta Set Object ACL:

    curl -X PUT --data-binary @XML_FILE_NAME \
      -H "Authorization: Bearer OAUTH2_TOKEN" \
      "https://storage.googleapis.com/BUCKET_NAME/OBJECT_NAME?acl"

    Dove:

    • XML_FILE_NAME è il percorso del file che hai creato nel passaggio 2.
    • OAUTH2_TOKEN è il token di accesso che hai creato nel passaggio 1.
    • BUCKET_NAME è il nome del bucket contenente l'oggetto che vuoi rendere pubblico. Ad esempio, my-bucket.
    • OBJECT_NAME è il nome con codifica URL dell'oggetto che vuoi rendere pubblico. Ad esempio, pets/dog.png, ha la codifica URL come pets%2Fdog.png.

Rendi pubblicamente leggibili tutti gli oggetti in un bucket

Per rendere tutti gli oggetti di un bucket leggibili da chiunque su Internet:

console

  1. In Google Cloud Console, vai alla pagina Browser di Cloud Storage.

    Vai al browser

  2. Nell'elenco dei bucket, fai clic sul nome del bucket che vuoi rendere pubblico.

  3. Seleziona la scheda Autorizzazioni nella parte superiore della pagina.

  4. Nella sezione Autorizzazioni, fai clic sul pulsante + Aggiungi.

    Viene visualizzata la finestra di dialogo Aggiungi entità.

  5. Nel campo Nuove entità, inserisci allUsers.

  6. Nel menu a discesa Seleziona un ruolo, inserisci Storage Object Visualizzatore nella casella dei filtri e seleziona il oggetto Visualizzatore oggetti dai risultati filtrati.

  7. Fai clic su Salva.

  8. Fai clic su Consenti accesso pubblico.

Una volta concesso l'accesso pubblico, viene visualizzato Copia URL per ogni oggetto nella colonna accesso pubblico. Puoi fare clic su questo pulsante per ottenere l'URL pubblico dell'oggetto.

Per informazioni dettagliate sugli errori nelle operazioni non riuscite nel browser di Cloud Storage, consulta la sezione Risoluzione dei problemi.

Riga di comando

Utilizza il comando gsutil iam ch:

gsutil iam ch allUsers:objectViewer gs://BUCKET_NAME

Dove BUCKET_NAME è il nome del bucket di cui vuoi rendere pubblici gli oggetti. Ad esempio, my-bucket.

Esempi di codice

C++

Per maggiori informazioni, consulta la documentazione di riferimento dell'API Cloud Storage C++.

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::runtime_error(current_policy.status().message());
  }

  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::runtime_error(updated.status().message());

  std::cout << "Policy successfully updated: " << *updated << "\n";
}

Go

Per maggiori informazioni, consulta la documentazione di riferimento dell'API Cloud Storage Go.

import (
	"context"
	"fmt"
	"io"

	"cloud.google.com/go/iam"
	"cloud.google.com/go/storage"
	iampb "google.golang.org/genproto/googleapis/iam/v1"
)

// 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: %v", err)
	}
	defer client.Close()

	policy, err := client.Bucket(bucketName).IAM().V3().Policy(ctx)
	if err != nil {
		return fmt.Errorf("Bucket(%q).IAM().V3().Policy: %v", 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: %v", bucketName, err)
	}
	fmt.Fprintf(w, "Bucket %v is now publicly readable\n", bucketName)
	return nil
}

Java

Per maggiori informazioni, consulta la documentazione di riferimento dell'API Cloud Storage Java.

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

Per maggiori informazioni, consulta la documentazione di riferimento dell'API Cloud Storage Node.js.

/**
 * 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);

Python

Per maggiori informazioni, consulta la documentazione di riferimento dell'API Cloud Storage Python.

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

Per maggiori informazioni, consulta la documentazione di riferimento dell'API Cloud Storage Ruby.

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

Puoi utilizzare una risorsa Terraform per rendere pubblici tutti gli oggetti in un bucket.

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

API REST

API JSON

  1. Ottieni un token di accesso all'autorizzazione da OAuth 2.0 Playground. Configura il parco giochi in modo che utilizzi le tue credenziali OAuth. Per le istruzioni, consulta la pagina relativa all'autenticazione API.
  2. Crea un file JSON contenente le seguenti informazioni:

    {
      "bindings":[
        {
          "role": "roles/storage.objectViewer",
          "members":["allUsers"]
        }
      ]
    }
  3. Utilizza cURL per chiamare l'API JSON con una richiesta di PUT bucket:

    curl -X PUT --data-binary @JSON_FILE_NAME \
      -H "Authorization: Bearer OAUTH2_TOKEN" \
      -H "Content-Type: application/json" \
      "https://storage.googleapis.com/storage/v1/b/BUCKET_NAME/iam"

    Dove:

    • JSON_FILE_NAME è il percorso del file che hai creato nel passaggio 2.
    • OAUTH2_TOKEN è il token di accesso che hai creato nel passaggio 1.
    • BUCKET_NAME è il nome del bucket di cui vuoi rendere pubblici gli oggetti. Ad esempio, my-bucket.

API XML

La disponibilità pubblica di tutti gli oggetti in un bucket non è supportata dall'API XML. Usa gsutil o l'API JSON.

Passaggi successivi