クロスオリジン リソース シェアリング(CORS)の構成

コンセプトに移動

クロスオリジン リソース シェアリング(CORS)は、さまざまな生成元のリソース間でのやり取りを可能にし、通常は悪意のある動作を防ぐために禁止されています。Cloud Storage バケットの CORS を構成する方法については、このトピックをご覧ください。

バケットの CORS を構成する

バケットの CORS 構成を設定するには、受け入れられるリクエストのタイプを識別する情報(HTTP メソッドや発信元のドメインなど)を指定します。バケットの CORS 構成の設定には、gsutil コマンドライン ツールXML APIJSON APICloud Storage 用クライアント ライブラリを使用できます。

次の例は、バケットに CORS を構成する方法を示しています。

gsutil

  1. 次の内容を含む JSON ファイルを作成します。

    [
        {
          "origin": ["ORIGIN"],
          "method": ["METHOD"],
          "responseHeader": ["HEADER"],
          "maxAgeSeconds": MAX-AGE
        }
    ]

    ここで

    • ORIGIN は、このバケットとのクロスオリジン リソース シェアリングで使用できるオリジンです。例: example.appspot.com
    • METHOD は、このバケットとのクロスオリジン リソース シェアリングで使用できる HTTP メソッドです。たとえば、GETPUT です。
    • HEADER は、このバケットとのクロスオリジン リソース シェアリングで使用できるヘッダーです。例: Content-Type
    • MAX-AGE は、プリフライト リクエストを繰り返す前に、ブラウザでリクエストを行える秒数です。例: 3600

    詳細については、CORS 構成の要素をご覧ください。

  2. gsutil cors コマンドを使用して、バケットの CORS を構成します。

    gsutil cors set JSON_FILE_NAME.json gs://BUCKET_NAME

    ここで

    • JSON_FILE_NAME は、手順 1 で作成した JSON ファイルへのパスです。
    • BUCKET_NAME はバケットの名前です。例: my-bucket

コードサンプル

C++

詳細については、Cloud Storage C++ API のリファレンス ドキュメントをご覧ください。

namespace gcs = google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string const& bucket_name,
   std::string const& origin) {
  StatusOr<gcs::BucketMetadata> original =
      client.GetBucketMetadata(bucket_name);

  if (!original) throw std::runtime_error(original.status().message());
  std::vector<gcs::CorsEntry> cors_configuration;
  cors_configuration.emplace_back(
      gcs::CorsEntry{3600, {"GET"}, {origin}, {"Content-Type"}});

  StatusOr<gcs::BucketMetadata> patched_metadata = client.PatchBucket(
      bucket_name,
      gcs::BucketMetadataPatchBuilder().SetCors(cors_configuration),
      gcs::IfMetagenerationMatch(original->metageneration()));

  if (!patched_metadata) {
    throw std::runtime_error(patched_metadata.status().message());
  }

  if (patched_metadata->cors().empty()) {
    std::cout << "Cors configuration is not set for bucket "
              << patched_metadata->name() << "\n";
    return;
  }

  std::cout << "Cors configuration successfully set for bucket "
            << patched_metadata->name() << "\nNew cors configuration: ";
  for (auto const& cors_entry : patched_metadata->cors()) {
    std::cout << "\n  " << cors_entry << "\n";
  }
}

Java

詳細については、Cloud Storage Java API のリファレンス ドキュメントをご覧ください。

import com.google.cloud.storage.Bucket;
import com.google.cloud.storage.Cors;
import com.google.cloud.storage.HttpMethod;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;
import com.google.common.collect.ImmutableList;

public class ConfigureBucketCors {
  public static void configureBucketCors(
      String projectId,
      String bucketName,
      String origin,
      String responseHeader,
      Integer maxAgeSeconds) {
    // The ID of your GCP project
    // String projectId = "your-project-id";

    // The ID of your GCS bucket
    // String bucketName = "your-unique-bucket-name";

    // The origin for this CORS config to allow requests from
    // String origin = "http://example.appspot.com";

    // The response header to share across origins
    // String responseHeader = "Content-Type";

    // The maximum amount of time the browser can make requests before it must repeat preflighted
    // requests
    // Integer maxAgeSeconds = 3600;

    Storage storage = StorageOptions.newBuilder().setProjectId(projectId).build().getService();
    Bucket bucket = storage.get(bucketName);

    // See the HttpMethod documentation for other HTTP methods available:
    // https://cloud.google.com/appengine/docs/standard/java/javadoc/com/google/appengine/api/urlfetch/HTTPMethod
    HttpMethod method = HttpMethod.GET;

    Cors cors =
        Cors.newBuilder()
            .setOrigins(ImmutableList.of(Cors.Origin.of(origin)))
            .setMethods(ImmutableList.of(method))
            .setResponseHeaders(ImmutableList.of(responseHeader))
            .setMaxAgeSeconds(maxAgeSeconds)
            .build();

    bucket.toBuilder().setCors(ImmutableList.of(cors)).build().update();

    System.out.println(
        "Bucket "
            + bucketName
            + " was updated with a CORS config to allow GET requests from "
            + origin
            + " sharing "
            + responseHeader
            + " responses across origins");
  }
}

C#

詳細については、Cloud Storage C# API のリファレンス ドキュメントをご覧ください。

現在、C# クライアント ライブラリでは CORS を構成できません。

Go

詳細については、Cloud Storage Go API のリファレンス ドキュメントをご覧ください。

Go を使用してバケットの CORS 構成を設定するには、CORS のリファレンス ドキュメントをご覧ください。

Node.js

詳細については、Cloud Storage Node.js API のリファレンス ドキュメントをご覧ください。

NodeJS を使用してバケットの CORS 構成を設定するには、バケットのリファレンス ドキュメントをご覧ください。

PHP

詳細については、Cloud Storage PHP API のリファレンス ドキュメントをご覧ください。

PHP を使用してバケットの CORS 構成を設定するには、Google\Cloud\Storage\Bucket のリファレンス ドキュメントをご覧ください。

Python

詳細については、Cloud Storage Python API のリファレンス ドキュメントをご覧ください。

Python を使用してバケットの CORS 構成を設定するには、cors のリファレンス ドキュメントをご覧ください。

Ruby

詳細については、Cloud Storage Ruby API のリファレンス ドキュメントをご覧ください。

Ruby を使用してバケットの CORS 構成を設定するには、Google::Cloud::Storage のリファレンス ドキュメントをご覧ください。

REST API

JSON API

  1. OAuth 2.0 Playground から承認アクセス トークンを取得します。固有の OAuth 認証情報を使用するようにプレイグラウンドを構成します。
  2. 次の内容を含む JSON ファイルを作成します。

    {
     "cors": [
       {
         "origin": [
           "ORIGIN"
         ],
         "method": [
           "METHOD"
         ],
         "responseHeader": [
           "HEADER"
         ],
         "maxAgeSeconds": MAX-AGE
       }
     ]
    }

    ここで

    • ORIGIN は、このバケットとのクロスオリジン リソース シェアリングで使用できるオリジンです。例: example.appspot.com
    • METHOD は、このバケットとのクロスオリジン リソース シェアリングで使用できる HTTP メソッドです。たとえば、GETPUT です。
    • HEADER は、このバケットとのクロスオリジン リソース シェアリングで使用できるヘッダーです。例: Content-Type
    • MAX-AGE は、プリフライト リクエストを繰り返す前に、ブラウザでリクエストを行える秒数です。例: 3600

    詳細については、CORS 構成の要素をご覧ください。

  3. cURL を使用して JSON API を呼び出し、PATCH Bucket リクエストを行います。

    curl --request PATCH \
     'https://storage.googleapis.com/storage/v1/b/BUCKET_NAME' \
     --header 'Authorization: Bearer OAUTH2_TOKEN' \
     --header 'Content-Type: application/json' \
     --data-binary @JSON_FILE_NAME.json

    ここで

    • BUCKET_NAME はバケットの名前です。例: my-bucket
    • OAUTH2_TOKEN は、手順 1 で生成したアクセス トークンです。
    • JSON_FILE_NAME は、手順 2 で作成したファイルへのパスです。

XML API

  1. OAuth 2.0 Playground から承認アクセス トークンを取得します。固有の OAuth 認証情報を使用するようにプレイグラウンドを構成します。
  2. 次の内容を含む XML ファイルを作成します。

    <?xml version="1.0" encoding="UTF-8"?>
    <CorsConfig>
     <Cors>
       <Origins>
         <Origin>ORIGIN</Origin>
       </Origins>
       <Methods>
         <Method>METHOD</Method>
       </Methods>
       <ResponseHeaders>
         <ResponseHeader>HEADER</ResponseHeader>
       </ResponseHeaders>
       <MaxAgeSec>MAX-AGE</MaxAgeSec>
     </Cors>
    </CorsConfig>
    

    ここで

    • ORIGIN は、このバケットとのクロスオリジン リソース シェアリングで使用できるオリジンです。例: example.appspot.com
    • METHOD は、このバケットとのクロスオリジン リソース シェアリングで使用できる HTTP メソッドです。たとえば、GETPUT です。
    • HEADER は、このバケットとのクロスオリジン リソース シェアリングで使用できるヘッダーです。例: Content-Type
    • MAX-AGE は、プリフライト リクエストを繰り返す前に、ブラウザでリクエストを行える秒数です。例: 3600

    詳細については、CORS 構成の要素をご覧ください。

  3. cURL を使用して、Set Bucket CORS リクエストで XML API を呼び出します。

    curl -X PUT --data-binary @XML_FILE_NAME.xml \
    -H "Authorization: Bearer OAUTH2_TOKEN" \
    -H "x-goog-project-id: PROJECT_ID" \
    "https://storage.googleapis.com/BUCKET_NAME?cors"

    ここで

    • BUCKET_NAME はバケットの名前です。例: my-bucket
    • OAUTH2_TOKEN は、手順 1 で生成したアクセス トークンです。
    • PROJECT_ID は、バケットに関連付けられているプロジェクトの ID です。例: my-project
    • XML_FILE_NAME は、手順 2 で作成したファイルへのパスです。

バケットの CORS 構成の表示

バケットの CORS 構成を表示するには:

gsutil

gsutil cors コマンドを使用して、バケットの CORS 構成を取得します。

gsutil cors get gs://BUCKET_NAME

ここで、BUCKET_NAME はバケットの名前です。例: my-bucket

コードサンプル

クライアント ライブラリを使用してバケットの CORS 構成を表示するには、バケットのメタデータを表示する手順に従い、レスポンスで CORS フィールドを探します。

C++

詳細については、Cloud Storage C++ API のリファレンス ドキュメントをご覧ください。

namespace gcs = google::cloud::storage;
using ::google::cloud::StatusOr;
[](gcs::Client client, std::string const& bucket_name) {
  StatusOr<gcs::BucketMetadata> bucket_metadata =
      client.GetBucketMetadata(bucket_name);

  if (!bucket_metadata) {
    throw std::runtime_error(bucket_metadata.status().message());
  }

  std::cout << "The metadata for bucket " << bucket_metadata->name() << " is "
            << *bucket_metadata << "\n";
}

C#

詳細については、Cloud Storage C# API のリファレンス ドキュメントをご覧ください。

private void GetBucketMetadata(string bucketName)
{
    var storage = StorageClient.Create();
    var bucket = storage.GetBucket(bucketName);
    Console.WriteLine($"Bucket:\t{bucket.Name}");
    Console.WriteLine($"Acl:\t{bucket.Acl}");
    Console.WriteLine($"Billing:\t{bucket.Billing}");
    Console.WriteLine($"Cors:\t{bucket.Cors}");
    Console.WriteLine($"DefaultEventBasedHold:\t{bucket.DefaultEventBasedHold}");
    Console.WriteLine($"DefaultObjectAcl:\t{bucket.DefaultObjectAcl}");
    Console.WriteLine($"Encryption:\t{bucket.Encryption}");
    if (bucket.Encryption != null)
    {
        Console.WriteLine($"KmsKeyName:\t{bucket.Encryption.DefaultKmsKeyName}");
    }
    Console.WriteLine($"Id:\t{bucket.Id}");
    Console.WriteLine($"Kind:\t{bucket.Kind}");
    Console.WriteLine($"Lifecycle:\t{bucket.Lifecycle}");
    Console.WriteLine($"Location:\t{bucket.Location}");
    Console.WriteLine($"LocationType:\t{bucket.LocationType}");
    Console.WriteLine($"Logging:\t{bucket.Logging}");
    Console.WriteLine($"Metageneration:\t{bucket.Metageneration}");
    Console.WriteLine($"Owner:\t{bucket.Owner}");
    Console.WriteLine($"ProjectNumber:\t{bucket.ProjectNumber}");
    Console.WriteLine($"RetentionPolicy:\t{bucket.RetentionPolicy}");
    Console.WriteLine($"SelfLink:\t{bucket.SelfLink}");
    Console.WriteLine($"StorageClass:\t{bucket.StorageClass}");
    Console.WriteLine($"TimeCreated:\t{bucket.TimeCreated}");
    Console.WriteLine($"Updated:\t{bucket.Updated}");
    Console.WriteLine($"Versioning:\t{bucket.Versioning}");
    Console.WriteLine($"Website:\t{bucket.Website}");
}

Go

詳細については、Cloud Storage Go API のリファレンス ドキュメントをご覧ください。

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

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

// getBucketMetadata gets the bucket metadata.
func getBucketMetadata(w io.Writer, bucketName string) (*storage.BucketAttrs, error) {
	// bucketName := "bucket-name"
	ctx := context.Background()
	client, err := storage.NewClient(ctx)
	if err != nil {
		return nil, fmt.Errorf("storage.NewClient: %v", err)
	}
	defer client.Close()

	ctx, cancel := context.WithTimeout(ctx, time.Second*10)
	defer cancel()
	attrs, err := client.Bucket(bucketName).Attrs(ctx)
	if err != nil {
		return nil, fmt.Errorf("Bucket(%q).Attrs: %v", bucketName, err)
	}
	fmt.Fprintf(w, "BucketName: %v\n", attrs.Name)
	fmt.Fprintf(w, "Location: %v\n", attrs.Location)
	fmt.Fprintf(w, "LocationType: %v\n", attrs.LocationType)
	fmt.Fprintf(w, "StorageClass: %v\n", attrs.StorageClass)
	fmt.Fprintf(w, "TimeCreated: %v\n", attrs.Created)
	fmt.Fprintf(w, "Metageneration: %v\n", attrs.MetaGeneration)
	fmt.Fprintf(w, "PredefinedACL: %v\n", attrs.PredefinedACL)
	if attrs.Encryption != nil {
		fmt.Fprintf(w, "DefaultKmsKeyName: %v\n", attrs.Encryption.DefaultKMSKeyName)
	}
	if attrs.Website != nil {
		fmt.Fprintf(w, "IndexPage: %v\n", attrs.Website.MainPageSuffix)
		fmt.Fprintf(w, "NotFoundPage: %v\n", attrs.Website.NotFoundPage)
	}
	fmt.Fprintf(w, "DefaultEventBasedHold: %v\n", attrs.DefaultEventBasedHold)
	if attrs.RetentionPolicy != nil {
		fmt.Fprintf(w, "RetentionEffectiveTime: %v\n", attrs.RetentionPolicy.EffectiveTime)
		fmt.Fprintf(w, "RetentionPeriod: %v\n", attrs.RetentionPolicy.RetentionPeriod)
		fmt.Fprintf(w, "RetentionPolicyIsLocked: %v\n", attrs.RetentionPolicy.IsLocked)
	}
	fmt.Fprintf(w, "RequesterPays: %v\n", attrs.RequesterPays)
	fmt.Fprintf(w, "VersioningEnabled: %v\n", attrs.VersioningEnabled)
	if attrs.Logging != nil {
		fmt.Fprintf(w, "LogBucket: %v\n", attrs.Logging.LogBucket)
		fmt.Fprintf(w, "LogObjectPrefix: %v\n", attrs.Logging.LogObjectPrefix)
	}
	if attrs.CORS != nil {
		fmt.Fprintln(w, "CORS:")
		for _, v := range attrs.CORS {
			fmt.Fprintf(w, "\tMaxAge: %v\n", v.MaxAge)
			fmt.Fprintf(w, "\tMethods: %v\n", v.Methods)
			fmt.Fprintf(w, "\tOrigins: %v\n", v.Origins)
			fmt.Fprintf(w, "\tResponseHeaders: %v\n", v.ResponseHeaders)
		}
	}
	if attrs.Labels != nil {
		fmt.Fprintf(w, "\n\n\nLabels:")
		for key, value := range attrs.Labels {
			fmt.Fprintf(w, "\t%v = %v\n", key, value)
		}
	}
	return attrs, nil
}

Java

詳細については、Cloud Storage Java API のリファレンス ドキュメントをご覧ください。

import com.google.cloud.storage.Bucket;
import com.google.cloud.storage.BucketInfo;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;
import java.util.Map;

public class GetBucketMetadata {
  public static void getBucketMetadata(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();

    // Select all fields. Fields can be selected individually e.g. Storage.BucketField.NAME
    Bucket bucket =
        storage.get(bucketName, Storage.BucketGetOption.fields(Storage.BucketField.values()));

    // Print bucket metadata
    System.out.println("BucketName: " + bucket.getName());
    System.out.println("DefaultEventBasedHold: " + bucket.getDefaultEventBasedHold());
    System.out.println("DefaultKmsKeyName: " + bucket.getDefaultKmsKeyName());
    System.out.println("Id: " + bucket.getGeneratedId());
    System.out.println("IndexPage: " + bucket.getIndexPage());
    System.out.println("Location: " + bucket.getLocation());
    System.out.println("LocationType: " + bucket.getLocationType());
    System.out.println("Metageneration: " + bucket.getMetageneration());
    System.out.println("NotFoundPage: " + bucket.getNotFoundPage());
    System.out.println("RetentionEffectiveTime: " + bucket.getRetentionEffectiveTime());
    System.out.println("RetentionPeriod: " + bucket.getRetentionPeriod());
    System.out.println("RetentionPolicyIsLocked: " + bucket.retentionPolicyIsLocked());
    System.out.println("RequesterPays: " + bucket.requesterPays());
    System.out.println("SelfLink: " + bucket.getSelfLink());
    System.out.println("StorageClass: " + bucket.getStorageClass().name());
    System.out.println("TimeCreated: " + bucket.getCreateTime());
    System.out.println("VersioningEnabled: " + bucket.versioningEnabled());
    if (bucket.getLabels() != null) {
      System.out.println("\n\n\nLabels:");
      for (Map.Entry<String, String> label : bucket.getLabels().entrySet()) {
        System.out.println(label.getKey() + "=" + label.getValue());
      }
    }
    if (bucket.getLifecycleRules() != null) {
      System.out.println("\n\n\nLifecycle Rules:");
      for (BucketInfo.LifecycleRule rule : bucket.getLifecycleRules()) {
        System.out.println(rule);
      }
    }
  }
}

Node.js

詳細については、Cloud Storage Node.js API のリファレンス ドキュメントをご覧ください。

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

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

async function getBucketMetadata() {
  // Get bucket metadata.
  /**
   * TODO(developer): Uncomment the following line before running the sample.
   */
  // const bucketName = 'Name of a bucket, e.g. my-bucket';

  // Get Bucket Metadata
  const [metadata] = await storage.bucket(bucketName).getMetadata();

  for (const [key, value] of Object.entries(metadata)) {
    console.log(`${key}: ${value}`);
  }
}

PHP

詳細については、Cloud Storage PHP API のリファレンス ドキュメントをご覧ください。

use Google\Cloud\Storage\StorageClient;

/**
 * Get bucket metadata.
 *
 * @param string $bucketName the name of your Cloud Storage bucket.
 *
 * @return void
 */
function get_bucket_metadata($bucketName)
{
    $storage = new StorageClient();
    $bucket = $storage->bucket($bucketName);
    $info = $bucket->info();

    printf("Bucket Metadata: %s" . PHP_EOL, print_r($info));
}

Python

詳細については、Cloud Storage Python API のリファレンス ドキュメントをご覧ください。

import pprint

from google.cloud import storage

def bucket_metadata(bucket_name):
    """Prints out a bucket's metadata."""
    # bucket_name = 'your-bucket-name'

    storage_client = storage.Client()
    bucket = storage_client.get_bucket(bucket_name)

    print("ID: {}".format(bucket.id))
    print("Name: {}".format(bucket.name))
    print("Storage Class: {}".format(bucket.storage_class))
    print("Location: {}".format(bucket.location))
    print("Location Type: {}".format(bucket.location_type))
    print("Cors: {}".format(bucket.cors))
    print(
        "Default Event Based Hold: {}".format(bucket.default_event_based_hold)
    )
    print("Default KMS Key Name: {}".format(bucket.default_kms_key_name))
    print("Metageneration: {}".format(bucket.metageneration))
    print(
        "Retention Effective Time: {}".format(
            bucket.retention_policy_effective_time
        )
    )
    print("Retention Period: {}".format(bucket.retention_period))
    print("Retention Policy Locked: {}".format(bucket.retention_policy_locked))
    print("Requester Pays: {}".format(bucket.requester_pays))
    print("Self Link: {}".format(bucket.self_link))
    print("Time Created: {}".format(bucket.time_created))
    print("Versioning Enabled: {}".format(bucket.versioning_enabled))
    print("Labels:")
    pprint.pprint(bucket.labels)

Ruby

詳細については、Cloud Storage Ruby API のリファレンス ドキュメントをご覧ください。

# bucket_name = "Your Google Cloud Storage bucket name"

require "google/cloud/storage"

storage = Google::Cloud::Storage.new
bucket  = storage.bucket bucket_name

puts "ID:                       #{bucket.id}"
puts "Name:                     #{bucket.name}"
puts "Storage Class:            #{bucket.storage_class}"
puts "Location:                 #{bucket.location}"
puts "Location Type:            #{bucket.location_type}"
puts "Cors:                     #{bucket.cors}"
puts "Default Event Based Hold: #{bucket.default_event_based_hold?}"
puts "Default KMS Key Name:     #{bucket.default_kms_key}"
puts "Logging Bucket:           #{bucket.logging_bucket}"
puts "Logging Prefix:           #{bucket.logging_prefix}"
puts "Metageneration:           #{bucket.metageneration}"
puts "Retention Effective Time: #{bucket.retention_effective_at}"
puts "Retention Period:         #{bucket.retention_period}"
puts "Retention Policy Locked:  #{bucket.retention_policy_locked?}"
puts "Requester Pays:           #{bucket.requester_pays}"
puts "Self Link:                #{bucket.api_url}"
puts "Time Created:             #{bucket.created_at}"
puts "Versioning Enabled:       #{bucket.versioning?}"
puts "Index Page:               #{bucket.website_main}"
puts "Not Found Page:           #{bucket.website_404}"
puts "Labels:"
bucket.labels.each do |key, value|
  puts " - #{key} = #{value}"
end

REST API

JSON API

  1. OAuth 2.0 Playground から承認アクセス トークンを取得します。固有の OAuth 認証情報を使用するようにプレイグラウンドを構成します。
  2. cURL を使用して JSON API を呼び出し、GET Bucket リクエストを行います。

    curl -X GET \
        -H "Authorization: Bearer OAUTH2_TOKEN" \
        "https://storage.googleapis.com/storage/v1/b/BUCKET_NAME?fields=cors"

    ここで

    • OAUTH2_TOKEN は、手順 1 で生成したアクセス トークンの名前です。
    • BUCKET_NAME は、関連するバケットの名前です。例: my-bucket

XML API

  1. OAuth 2.0 Playground から承認アクセス トークンを取得します。固有の OAuth 認証情報を使用するようにプレイグラウンドを構成します。
  2. cURL を使用して XML API を呼び出し、GET Bucket リクエストを行います。

    curl -X GET \
      -H "Authorization: Bearer OAUTH2_TOKEN" \
      "https://storage.googleapis.com/BUCKET_NAME?cors"

    ここで

    • OAUTH2_TOKEN は、手順 1 で生成したアクセス トークンの名前です。
    • BUCKET_NAME は、関連するバケットの名前です。例: my-bucket

バケットからの CORS の削除

バケットから CORS 構成を削除するには:

gsutil

  1. 次の内容を含む JSON ファイルを作成します。

    []
  2. gsutil cors コマンドを使用して、バケットの CORS を構成します。

    gsutil cors set JSON_FILE_NAME.json gs://BUCKET_NAME

    ここで

    • JSON_FILE_NAME は、手順 1 で作成した JSON ファイルへのパスです。
    • BUCKET_NAME はバケットの名前です。例: my-bucket

コードサンプル

Java

詳細については、Cloud Storage Java API のリファレンス ドキュメントをご覧ください。

import com.google.cloud.storage.Bucket;
import com.google.cloud.storage.Cors;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;
import java.util.ArrayList;
import java.util.List;

public class RemoveBucketCors {
  public static void removeBucketCors(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();
    Bucket bucket =
        storage.get(bucketName, Storage.BucketGetOption.fields(Storage.BucketField.CORS));

    // getCors() returns the List and copying over to an ArrayList so it's mutable.
    List<Cors> cors = new ArrayList<>(bucket.getCors());

    // Clear bucket CORS configuration.
    cors.clear();

    // Update bucket to remove CORS.
    bucket.toBuilder().setCors(cors).build().update();
    System.out.println("Removed CORS configuration from bucket " + bucketName);
  }
}

C#

詳細については、Cloud Storage C# API のリファレンス ドキュメントをご覧ください。

現時点では、C# クライアント ライブラリを使用して CORS を操作することはできません。

Go

詳細については、Cloud Storage Go API のリファレンス ドキュメントをご覧ください。

Go を使用してバケットの CORS 構成を操作するには、CORS のリファレンス ドキュメントをご覧ください。

Node.js

詳細については、Cloud Storage Node.js API のリファレンス ドキュメントをご覧ください。

NodeJS を使用してバケットの CORS 構成を操作するには、バケットのリファレンス ドキュメントをご覧ください。

PHP

詳細については、Cloud Storage PHP API のリファレンス ドキュメントをご覧ください。

PHP を使用してバケットの CORS 構成を操作するには、Google\Cloud\Storage\Bucket のリファレンス ドキュメントをご覧ください。

Python

詳細については、Cloud Storage Python API のリファレンス ドキュメントをご覧ください。

Python を使用してバケットの CORS 構成を操作するには、CORS のリファレンス ドキュメントをご覧ください。

Ruby

詳細については、Cloud Storage Ruby API のリファレンス ドキュメントをご覧ください。

Ruby を使用してバケットの CORS 構成を操作するには、Google::Cloud::Storage のリファレンス ドキュメントをご覧ください。

REST API

JSON API

  1. OAuth 2.0 Playground から承認アクセス トークンを取得します。固有の OAuth 認証情報を使用するようにプレイグラウンドを構成します。
  2. 次の内容を含む JSON ファイルを作成します。

    {
     "cors": []
    }
  3. cURL を使用して JSON API を呼び出し、PATCH Bucket リクエストを行います。

    curl --request PATCH \
    'https://storage.googleapis.com/storage/v1/b/BUCKET_NAME' \
    --header 'Authorization: Bearer OAUTH2_TOKEN' \
    --header 'Content-Type: application/json' \
    --data-binary @JSON_FILE_NAME.json

    ここで

    • BUCKET_NAME はバケットの名前です。例: my-bucket
    • OAUTH2_TOKEN は、手順 1 で生成したアクセス トークンです。
    • JSON_FILE_NAME は、手順 2 で作成したファイルへのパスです。

XML API

  1. OAuth 2.0 Playground から承認アクセス トークンを取得します。固有の OAuth 認証情報を使用するようにプレイグラウンドを構成します。
  2. 次の内容を含む XML ファイルを作成します。

    <CorsConfig></CorsConfig>
  3. cURL を使用して、Set Bucket CORS リクエストで XML API を呼び出します。

    curl -X PUT --data-binary @XML_FILE_NAME.xml \
    -H "Authorization: Bearer OAUTH2_TOKEN" \
    -H "x-goog-project-id: PROJECT_ID" \
    "https://storage.googleapis.com/BUCKET_NAME?cors"

    ここで

    • BUCKET_NAME はバケットの名前です。例: my-bucket
    • OAUTH2_TOKEN は、手順 1 で生成したアクセス トークンです。
    • PROJECT_ID は、バケットに関連付けられているプロジェクトの ID です。例: my-project
    • XML_FILE_NAME は、手順 2 で作成したファイルへのパスです。

CORS リクエストのトラブルシューティング

別の生成元から Cloud Storage バケットにアクセスしているときに予期しない動作が発生した場合は、次の手順を試してください。

  1. ターゲットのバケットに対して gsutil cors get を使用して、その CORS 構成を取得します。複数の CORS 構成エントリがある場合は、次の手順に従って、リクエスト値が同じ単一の CORS 構成エントリ内の値にマッピングされていることを確認します。

  2. CORS リクエストを許可しない storage.cloud.google.com エンドポイントに対してリクエストを行っていないことを確認します。CORS でサポートされているエンドポイントの詳細については、Cloud Storage CORS のサポートをご覧ください。

  3. 任意のツールを使用して、リクエストとレスポンスをレビューします。Chrome ブラウザでは、標準のデベロッパー ツールを使用してこの情報を確認できます。

    1. ブラウザのツールバーで Chrome メニュー Chrome メニュー アイコン をクリックします。
    2. [その他のツール] > [デベロッパー ツール] の順に選択します。
    3. [Network] タブをクリックします。
    4. アプリケーションまたはコマンドラインから、リクエストを送信します。
    5. ネットワーク アクティビティが表示されているペインで、リクエストを探します。
    6. [Name] 列で、リクエストに対応する名前をクリックします。
    7. [Headers] タブをクリックしてレスポンス ヘッダーを確認するか、[Response] タブをクリックしてレスポンスの内容を表示します。

    リクエストとレスポンスが表示されない場合は、ブラウザのキャッシュに以前の失敗したプリフライト リクエストが入っている可能性があります。ブラウザのキャッシュをクリアすると、プリフライトのキャッシュもクリアされます。クリアされない場合は、CORS 構成の MaxAgeSec 値を低い値に設定し、古い MaxAgeSec の設定時間待機した後、再度リクエストを試してみてください。指定されていない場合のデフォルト値は 1,800(30 分)です。これにより新しいプリフライト リクエストが実行されて、新しい CORS 構成が取得され、キャッシュ エントリが削除されます。問題をデバッグし終えたら、MaxAgeSec を高い値に戻して、バケットへのプリフライトのトラフィックを削減します。

  4. リクエストに Origin ヘッダーがあること、およびヘッダー値がバケットの CORS 構成内の Origins 値の少なくとも 1 つと一致することを確認します。値のスキーム、ホスト、およびポートが正確に一致している必要があります。受け入れ可能な一致の例を次に示します。

    • http://origin.example.comhttp://origin.example.com:80 と一致しています(80 がデフォルトの HTTP ポートであるため)が、https://origin.example.comhttp://origin.example.com:8080http://origin.example.com:5151http://sub.origin.example.com とは一致していません。

    • https://example.com:443https://example.com と一致しますが、http://example.comhttp://example.com:443 とは一致しません。

    • http://localhost:8080 のみが http://localhost:8080 と正確に一致していて、http://localhost:5555http://localhost.example.com:8080 には一致していません。

  5. リクエストの HTTP メソッド(簡単なリクエストの場合)、または Access-Control-Request-Method で指定されたメソッド(プリフライト リクエストの場合)が、バケットの CORS 構成内の Methods 値の少なくとも 1 つと一致していることを確認します。

  6. これがプリフライト リクエストの場合は、Access-Control-Request-Header ヘッダーが含まれているかどうかを確認します。含まれている場合は、各 Access-Control-Request-Header 値がバケットの CORS 構成内の ResponseHeader 値と一致することを確認します。プリフライト リクエストが正常に終了し、レスポンスに CORS ヘッダーが含まれるためには、Access-Control-Request-Header に指定されたすべてのヘッダーが CORS 構成に含まれていることが必要です。

次のステップ