gRPC を使用して Cloud Storage に接続する

gRPC は、Google が開発した高パフォーマンスのオープンソース ユニバーサル RPC フレームワークです。gRPC を使用すると、プロトコル バッファを使ってサービスを定義できます。また、gRPC で Cloud Storage を操作することも可能です。gRPC は Google Front End(GFE)をバイパスして、Compute Engine と Cloud Storage バケット間の直接接続を使用します。

gRPC を使用して Cloud Storage に直接接続することはできませんが、次のサポート対象のクライアント経由であれば、gRPC で Cloud Storage に接続できます。

クライアント ライブラリで gRPC を有効にする

C++

始める前に

  1. 次のバージョンがインストールされていることを確認します。

    • gRPC バージョン 1.65.1 以降。
    • C++ クライアント ライブラリ バージョン v2.30.0 以降。
    • C++ バージョン 14 以降。

    インストール手順については、C++ 開発環境の設定をご覧ください。

  2. 認証を設定します

C++ クライアント ライブラリを構成する

  1. gcs::MakeGrpcClient() を使用して gRPC クライアントを作成します。

      namespace gcs = google::cloud::storage;
      void App() {
       auto client = gcs::MakeGrpcClient();
    
      // application code
    
      }
    

    C++ クライアント ライブラリは、アプリケーションが Google Cloud で実行されていることを検出すると、自動的に直接接続を使用します。

  2. gRPC を使用するように C++ クライアント ライブラリを構成するには、Cloud Storage gRPC クライアントを有効にして、CMakeBazel のビルドシステム構成を更新します。

    CMake

    1. コンパイル時に Cloud Storage gRPC クライアント プラグインを有効にします。

      cmake -DGOOGLE_CLOUD_CPP_ENABLE=storage_grpc [other options here]
      
    2. コードベースで、target_link_libraries() コマンドの google-cloud-cpp::storagegoogle-cloud-cpp::storage_grpc に置き換えます。

      たとえば、gRPC のクイックスタート プログラムでは、次のコードを使用します。

      add_executable(quickstart_grpc quickstart_grpc.cc)
      target_link_libraries(quickstart_grpc google-cloud-cpp::storage_grpc)
      

    Bazel

    依存関係を @google_cloud_cpp//:storage から @google_cloud_cpp//:storage_grpc に置き換えます。

    たとえば、gRPC のクイックスタート プログラムでは、次のコードを使用します。

      cc_binary(
          name = "quickstart",
          srcs = [
              "quickstart.cc",
          ],
          deps = [
              "@com_github_googleapis_google_cloud_cpp//:storage_grpc",
          ],
      )
    

Java

始める前に

  1. 次のバージョンがインストールされていることを確認します。

    • Java クライアント ライブラリ:

      • com.google.cloud:google-cloud-storage:2.43.1 以降
      • com.google.cloud:libraries-bom:26.48 以降
    • Java 8 以降

    インストール手順については、Java 開発環境の設定をご覧ください。

  2. 認証を設定します

BOM を使用するようにプロジェクトを更新する

互換性のあるバージョンの Google Cloud クライアント ライブラリがプロジェクトで使用されるようにするには、Google Cloud ライブラリの部品構成表(BOM)で指定されているバージョンを使用します。BOM を使用するようにプロジェクトを更新するには、次のいずれかの方法を使用します。

スタンドアロンの Cloud Storage

Cloud Storage クライアント ライブラリを単独で(他の Google Cloud ライブラリを使用せずに)使用する場合は、Cloud Storage クライアント ライブラリ固有の BOM を使用します。

Maven

pom.xml ファイルの dependencyManagement セクションに BOM をインポートします。

次の例は、BOM をインポートして google-cloud-storage アーティファクトを含める方法を示しています。

<dependencyManagement>
  <dependencies>
  <dependency>
   <groupId>com.google.cloud</groupId>
   <artifactId>google-cloud-storage-bom</artifactId>
   <version>2.43.1</version>
   <type>pom</type>
   <scope>import</scope>
  </dependency>
  </dependencies>
</dependencyManagement>

<dependencies>
  <dependency>
   <groupId>com.google.cloud</groupId>
   <artifactId>google-cloud-storage</artifactId>
  </dependency>
</dependencies>

Gradle

com.google.cloud:google-cloud-storage-bom に対するプラットフォーム依存関係を追加します。

implementation platform('com.google.cloud:google-cloud-storage-bom:2.43.1')
implementation 'com.google.cloud:google-cloud-storage'

Cloud Storage と他の Google Cloud ライブラリ

Cloud Storage クライアント ライブラリを他の Google Cloud ライブラリと併せて使用する場合は、Google Cloud クライアント ライブラリ BOM を使用します。

Maven

pom.xml ファイルの dependencyManagement セクションに BOM をインポートします。

次の例は、BOM をインポートして libraries-bom アーティファクトを含める方法を示しています。

<dependencyManagement>
  <dependencies>
  <dependency>
   <groupId>com.google.cloud</groupId>
   <artifactId>libraries-bom</artifactId>
   <version>26.48.0</version>
   <type>pom</type>
   <scope>import</scope>
  </dependency>
  </dependencies>
</dependencyManagement>

<dependencies>
  <dependency>
   <groupId>com.google.cloud</groupId>
   <artifactId>google-cloud-storage</artifactId>
  </dependency>
</dependencies>

Gradle

com.google.cloud:libraries-bom に対するプラットフォーム依存関係を追加します。

implementation platform('com.google.cloud:libraries-bom:26.48.0')
implementation 'com.google.cloud:google-cloud-storage'

gRPC クライアントを作成する

次のサンプルでは、gRPC 中心のビルダーを使用します。gRPC Java クライアントは、アプリケーションが Google Cloud で実行されていることを検出すると、自動的に直接接続を使用します。

// Imports the Google Cloud client library
import com.google.cloud.storage.Bucket;
import com.google.cloud.storage.BucketInfo;
import com.google.cloud.storage.Storage;
import com.google.cloud.storage.StorageOptions;

public class QuickstartGrpcSample {
  public static void main(String... args) throws Exception {

    // Create an instance of options which will use the Google Cloud Storage gRPC API for all
    // operations
    StorageOptions options = StorageOptions.grpc().build();

    // Instantiates a client in a try-with-resource to automatically cleanup underlying resources
    try (Storage storage = options.getService()) {
      // The name for the new bucket
      String bucketName = args[0]; // "my-new-bucket";

      // Creates the new bucket using a request to the gRPC API
      Bucket bucket = storage.create(BucketInfo.of(bucketName));

      System.out.printf("Bucket %s created.%n", bucket.getName());
    }
  }
}

Go

始める前に

  1. 開発環境を設定します。

  2. Cloud Storage Go クライアント ライブラリのバージョン 1.44 以降を使用していることを確認します。

  3. 認証を設定します

gRPC クライアントを作成する

クライアントを使用するには、アプリケーションで NewClient ではなく NewGRPCClient コンストラクタを呼び出す必要があります。

import (
  "context"
  "fmt"
  "log"
  "time"
  "cloud.google.com/go/storage"
  )
  func main() {
      ctx := context.Background()
      // The project ID and bucket name
      projectID := "project-id"
      bucketName := "bucket-name

      // Creates a gRPC enabled client.
      client, err := storage.NewGRPCClient(ctx)
      if err != nil {
          log.Fatalf("Failed to create client: %v", err)
      }
      defer client.Close()
      // Creates the new bucket.
      ctx, cancel := context.WithTimeout(ctx, time.Second*10)
      defer cancel()
      if err := client.Bucket(*bucketName).Create(ctx, *projectID, nil); err != nil {
          log.Fatalf("Failed to create bucket: %v", err)
      }
      fmt.Printf("Bucket %v created.\n", *bucketName)
  }

Go クライアント ライブラリは、アプリケーションが Google Cloud で実行されていることを検出すると、自動的に直接接続を使用します。

gRPC クライアントの使用方法については、gRPC API をご覧ください。

VPC Service Controls を構成する

仮想 IP アドレスを制限した Virtual Private Cloud(VPC Service Controls)を使用してネットワークのセキュリティを強化している場合は、Compute Engine 仮想マシン インスタンスと Cloud Storage 間のパフォーマンスを最適化するために、直接接続を有効にするようにファイアウォール ルールを更新する必要があります。

それには、許可リスト ファイアウォール ルールを追加して、次の CIDR ブロックのトラフィックをすべてのポートで許可します。

  • IPv4 トラフィックの場合: 34.126.0.0/18
  • IPv6 トラフィックの場合: 2001:4860:8040::/42

上記のルールに加えて、199.36.153.4/30 の既存の許可リスト ルールを保持します。

ファイアウォール ルールの変更が制限されていてルールを更新できない場合は、google-c2p://storage.googleapis.com ではなく storage.googleapis.com を Cloud Storage エンドポイントとして使用して、トラフィックに強制的に直接接続を回避させることができます。

たとえば、C++ では google-c2p:///storage.googleapis.com ではなく .set<google::cloud::EndpointOption>(storage.googleapis.com) を使用します。

Cloud Monitoring で gRPC 関連の指標を生成するように Cloud Storage クライアント ライブラリを構成できます。gRPC 関連の指標は、次の目的に役立ちます。

  • Cloud Storage に対する gRPC リクエストのパフォーマンスをモニタリングして最適化する。

  • 問題のトラブルシューティングとデバッグを行う。

  • アプリの使用状況と動作に関する分析情報を取得する。

gRPC 関連の指標を生成する方法については、クライアントサイドの指標を使用するをご覧ください。

ユースケースで指標を収集する必要がない場合は、指標の収集をオプトアウトできます。手順については、クライアントサイドの指標をオプトアウトするをご覧ください。

制限事項

  • IPv6 リクエストをレガシー ネットワーク経由で送信することはできません。

  • gRPC を使って Cloud Storage に接続すると、Google Cloud で実行される分析ワークロードの読み取りパフォーマンスの向上が期待されるのは、コンピューティング VM と Cloud Storage バケットが同じリージョンにある場合のみです。マルチリージョンとデュアルリージョン内のバケットに gRPC を使用することはおすすめしません。

  • IPv4 専用のクラスタで次の GKE バージョンを使用している場合、直接接続はサポートされません。

    • 1.28(1.28.0-gke.100 以降から 1.28.5-gke.1199000 まで)
    • 1.27(1.27.4-gke.1900 以降)
    • 1.26(1.26.10-gke.1238000 以降)
    • 1.25(1.25.15-gke.1045000 以降)
  • gRPC では、通知hmacKeysserviceAccount メソッドはサポートされません。

  • WithHTTPClient などの HTTP 固有のクライアント コンストラクタ オプションは、Go クライアント ライブラリではサポートされません。

次のステップ