Service Extensions プラグイン用に作成するカスタムコードは、他のサービスがアクセスできるように、パッケージ化して Artifact Registry にアップロードする必要があります。このページでは、プラグイン コードを作成し、コードをパッケージ化して、Artifact Registry リポジトリにアップロードする方法について説明します。
この機能は Media CDN のプレビュー版です。
Service Extensions については、Service Extensions の概要をご覧ください。
始める前に、プラグイン コードの作成に関するベスト プラクティスを確認してください。
その他の例については、プラグインのコードサンプルをご覧ください。
始める前に
- Google Cloud アカウントにログインします。 Google Cloudを初めて使用する場合は、 アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
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 role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Network Services, Network Actions, Artifact Registry, Cloud Build, Cloud Logging, and Cloud Monitoring APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init -
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 role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Network Services, Network Actions, Artifact Registry, Cloud Build, Cloud Logging, and Cloud Monitoring APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init
ツールチェーンを設定する
C++
Proxy-Wasm C++ SDK を使用すると、デベロッパーは C++ を使用して Service Extensions 用の WebAssembly(Wasm)プラグインを実装できます。この SDK は、C++ WebAssembly ツールチェーン Emscripten と、protobuf などの他のライブラリ(Abseil はオプション)を使用します。
C++ で記述されたプラグインのビルドは、これらのツールとライブラリの特定のバージョンに依存するため、Proxy-Wasm C++ SDK によって提供される Docker イメージを使用することをおすすめします。このページの C++ の手順では、Docker メソッドを使用します。Docker を使用せずに C++ プラグインをビルドするには、Proxy-Wasm C++ SDK のドキュメントをご覧ください。
Docker をまだインストールしていなければ、インストールします。Docker は、 Google Cloud インタラクティブ シェル環境である Cloud Shell に含まれています。
Proxy-Wasm C++ SDK のコピーをダウンロードします。最も簡単な方法は、Git リポジトリのクローンを作成することです。
git clone https://github.com/proxy-wasm/proxy-wasm-cpp-sdk.gitSDK で提供されている Dockerfile から Proxy-Wasm C++ SDK Docker イメージをビルドします。
cd proxy-wasm-cpp-sdk docker build -t wasmsdk:v3 -f Dockerfile-sdk .コマンドが SDK ライブラリと依存関係のビルドを完了すると、結果の Docker イメージが指定されたタグ(この例では
wasmsdk:v3)に関連付けられます。
Go
Proxy-Wasm Go SDK は、フル機能の Go SDK を提供します。Go は、優れたパフォーマンスと、純粋な Go で記述されたサードパーティ ライブラリの豊富なサポートを提供します。
Rust
Service Extensions のカスタマイズ機能は、WebAssembly と Proxy-Wasm を使用して提供されます。WebAssembly は、多くのプログラミング言語をサポートしています。Google は、優れた WebAssembly サポートを提供し、Proxy-Wasm がフル機能の Rust SDK を提供しているため、Rust を推奨しています。Rust は、優れたパフォーマンスと強力な型安全性も提供します。
-
インストール プロセスの最後に、コンソールに表示された手順に沿って構成プロセスを完了します。
Rust ツールチェーンに Wasm のサポートを追加します。
rustup target add wasm32-wasip1
プラグイン パッケージを作成する
C++
proxy-wasm-cpp-sdkとは別の新しいディレクトリを作成します。mkdir myprojectディレクトリに、次の内容の Makefile を作成します。
# Express any dependencies PROTOBUF= # full / lite / none WASM_DEPS= # absl_base re2 ... # Include the SDK Makefile PROXY_WASM_CPP_SDK=/sdk include ${PROXY_WASM_CPP_SDK}/Makefile同じディレクトリにプラグイン用の C++ ソースファイルを追加します。C++ ソースファイルの名前は、Makefile がターゲットとする Wasm ファイルと一致する必要があります。ただし、
.wasm接尾辞は.ccに置き換えられます。この例では、ソースファイルの名前はmyproject.ccにする必要があります。プラグイン コードをソースファイルに追加します。
次のサンプル ソースコードは、リクエスト ホストを書き換え、レスポンス ヘッダーを出力するプラグインです。
onRequestHeadersメソッドは、Service Extensions が呼び出すコールバックです。
Go
プラグイン用の新しいディレクトリを作成します。
mkdir go-pluginディレクトリで、Go ツールを使用して
go.modファイルを作成します。go mod init go-plugin同じディレクトリに、
main.goという名前のソースファイルを作成し、プラグイン コードをファイルに追加します。次のサンプル ソースコードは、リクエスト ホストを書き換え、レスポンス ヘッダーを出力するプラグインです。
OnHttpRequestHeadersメソッドは、Service Extensions が呼び出すコールバックです。ライブラリの依存関係をダウンロードして固定するには、
go mod tidyを実行します。go mod tidy
Rust
Rust のパッケージ マネージャーである Cargo の
cargo newコマンドを使用して、Rust パッケージ ディレクトリを作成します。cargo new --lib my-wasm-pluginこのコマンドにより、Rust パッケージのビルド方法を記述するために更新できる
cargo.tomlファイルと、プラグイン コードを保存するsrcディレクトリを含むディレクトリが作成されます。cargo.tomlファイルを更新して、パッケージのビルドに必要なパラメータを指定します。[package] name = "my-wasm-plugin" version = "0.1.0" edition = "2021"Proxy-Wasm Rust SDK とロギング サポートを依存関係として登録するには、
dependenciesセクションを追加します。次に例を示します。[dependencies] proxy-wasm = "0.2" log = "0.4"プラグインに必要な動的ライブラリをビルドするには、
libセクションを追加します。次に例を示します。[lib] crate-type = ["cdylib"]コンパイル済みプラグインのサイズを小さくするには、
profile.releaseセクションを追加します。次に例を示します。[profile.release] lto = true opt-level = 3 codegen-units = 1 panic = "abort" strip = "debuginfo"プラグイン コードを
srcディレクトリのlib.rsファイルに追加します。次のサンプル ソースコードは、リクエスト ホストを書き換え、レスポンス ヘッダーを出力するプラグインです。
on_http_request_headersメソッドは、Service Extensions が呼び出すコールバックです。
プラグインをコンパイルする
C++
プラグインをコンパイルするには、Makefile と C++ プラグインのソースファイルが置かれているディレクトリから次のコマンドを実行します。
docker run -v $PWD:/work -w /work wasmsdk:v3 /build_wasm.sh myproject.wasm
このコマンドは、現在のディレクトリを Docker イメージ内の work ディレクトリにマッピングし、Docker イメージで提供される build_wasm.sh スクリプトを実行してプラグイン コードをビルドします。コンパイル オペレーションが正常に完了すると、コンパイルされた Wasm バイトコードを含む myproject.wasm ファイルが現在のディレクトリに作成されます。
Docker イメージを使用してプラグイン コードを初めてコンパイルすると、Emscripten によって標準ライブラリが生成されます。これらを Docker イメージにキャッシュに保存して、毎回再生成する必要がないようにするには、最初のコンパイルが成功した後に、標準ライブラリを含むイメージを commit します。
docker commit `docker ps -l | grep wasmsdk:v3 | awk '{print $1}'` wasmsdk:v3
C++ プラグインのビルドの詳細については、Proxy-Wasm C++ SDK のドキュメントをご覧ください。
Go
プラグイン コードをコンパイルするには、go build コマンドを実行します。
env GOOS=wasip1 GOARCH=wasm go build -buildmode=c-shared -o main.wasm main.go
コンパイルが成功すると、現在のディレクトリに main.wasm ファイルが作成されます。
Rust
プラグイン コードをコンパイルするには、cargo build コマンドを実行します。
cargo build --release --target wasm32-wasip1
ビルドが正常に完了すると、Finished release [optimized] target(s) メッセージが表示されます。Envoy に精通している場合は、Envoy にプラグインを読み込んで、その動作を確認することをおすすめします。
コンパイルされたプラグイン コードを Artifact Registry にアップロードする
コンパイルされたプラグイン コードを Artifact Registry リポジトリにアップロードして、 Google Cloud サービスがアクセスできるようにします。
グローバル ロードバランサで Service Extensions を使用している場合は、マルチリージョン us ロケーションのリポジトリを使用します。リージョン ロードバランサを使用している場合は、同じリージョンまたは同じ大陸のマルチリージョン ロケーションにあるリポジトリを使用します。
プラグインをグローバル ロードバランサにアタッチすると、Service Extensions は Artifact Registry リポジトリから世界各地の独自のストレージに Wasm モジュールをコピーします。そのため、リポジトリのロケーションは、ロードバランサに送信されるリクエストのレイテンシに影響しません。リージョン ロードバランサの場合、プラグインはロードバランサが配置されている同じリージョンのロケーションにコピーされます。
Service Extensions プラグインは、Artifact Registry の汎用リポジトリまたは Docker リポジトリにアップロードできます。
スタンドアロン バイナリをより直接的に管理するには、汎用リポジトリを使用して Wasm ファイルを保存することをおすすめします。このオプションはプレビュー版です。
汎用リポジトリ
ローカルの
package/ディレクトリを作成し、公開可能なプラグイン モジュールをコピーします。プラグイン アーティファクトの名前はplugin.wasmにする必要があります。次のサンプル コマンドは、Rust でビルドされたプラグイン アーティファクトをコピーします。mkdir -p package && cp -f target/wasm32-wasip1/release/my_wasm_plugin.wasm package/plugin.wasm--repository-formatをgenericに設定して、Artifact Registry リポジトリを作成します。リポジトリに必要な権限が付与されていることを確認します。
Wasm モジュールを汎用アーティファクトとしてリポジトリにアップロードするには、
gcloud artifacts generic uploadコマンドを使用します。gcloud artifacts generic upload \ --project=PROJECT_ID \ --location=LOCATION \ --repository=REPOSITORY \ --source=package/plugin.wasm \ --package=PACKAGE \ --version=VERSION次のように置き換えます。
PROJECT_ID: 実際の Google Cloud プロジェクト IDLOCATION: リポジトリのリージョンまたはマルチリージョンのロケーションREPOSITORY: Wasm モジュールをアップロードするリポジトリの名前PACKAGE: ファイルのパッケージ名VERSION: Wasm モジュールのバージョン
アップロードが完了したら、
nameラベルで指定された汎用アーティファクトの名前(次の例のadd_header_plugin:v4など)をメモします。この名前は、プラグインまたはプラグイン バージョンを作成するときに指定します。Uploading file: plugin.wasm...done. '@type': type.googleapis.com/google.devtools.artifactregistry.v1.GenericArtifact createTime: '2025-06-16T11:02:25.080248Z' name: projects/my-project/locations/us/repositories/my-generic-repo/genericArtifacts/add_header_plugin:v4 updateTime: '2025-06-16T11:02:25.080248Z' version: v4アーティファクトが Artifact Registry に正常にアップロードされたことを確認するには、
gcloud artifacts files listコマンドを実行し、リストにPACKAGE:VERSION:plugin.wasmという名前のファイルがあることを確認します。gcloud artifacts files list \ --project=PROJECT_ID \ --location=LOCATION \ --repository=REPOSITORY
Docker リポジトリ
--repository-formatをdockerに設定して、Artifact Registry リポジトリを作成します。リポジトリに必要な権限が付与されていることを確認します。
ローカルの
package/ディレクトリを作成し、公開可能なプラグイン アーティファクトをそのディレクトリにコピーします。次のサンプルは、Rust でビルドされたプラグイン アーティファクトをコピーします。mkdir -p package && cp -f target/wasm32-wasip1/release/my_wasm_plugin.wasm package/plugin.wasmpackage/Dockerfileファイルを作成し、次の内容を追加します。FROM scratch COPY plugin.wasm plugin.wasmCloud Build または Docker を使用して、プラグイン コードをパッケージ化します。
Cloud Build
次の内容の
package/cloudbuild.yamlビルド構成ファイルを作成します。steps: - name: 'gcr.io/cloud-builders/docker' args: [ 'build', '--no-cache', '--platform', 'wasm', '-t', 'LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE:IMAGE_TAG', '.' ] images: [ 'LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE:IMAGE_TAG' ]プラグインを保存するパスは次の形式にする必要があります。
LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE:IMAGE_TAG
次のように置き換えます。
プラグイン コンテナをビルドして Artifact Registry にアップロードするオペレーションをトリガーします。
gcloud builds submit --config package/cloudbuild.yaml package/
Docker
Docker をまだインストールしていなければ、インストールします。Docker は、 Google Cloud インタラクティブ シェル環境である Cloud Shell に含まれています。
Artifact Registry で認証するように Docker を構成します。次に例を示します。
gcloud auth login gcloud auth configure-docker LOCATION-docker.pkg.dev gcloud auth print-access-token | docker login -u oauth2accesstoken --password-stdin https://LOCATION-docker.pkg.dev
コンテナ イメージをビルドします。
docker build --no-cache --platform wasm -t my-wasm-plugin package/
ローカル イメージにリポジトリ イメージ名をタグ付けするには、イメージタグを使用します。
docker tag my-wasm-plugin LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE:IMAGE_TAG
次のように置き換えます。
タグ付きコンテナ イメージを Artifact Registry にアップロードします。
docker push LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE:IMAGE_TAG
イメージが Artifact Registry に正常にアップロードされたことを確認するには、
gcloud artifacts docker images listコマンドを実行します。gcloud artifacts docker images list LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE \ --include-tags
構成ファイルを準備してアップロードする
プラグインは、必要に応じて構成データを受け取ることがあります。このデータは、実行時のプラグインの動作に影響を与える可能性があります。構成データはテキストまたはバイナリで、プラグインで受け入れられる任意の形式にできます。構成データのサイズが大きい場合は、構成ファイルを Artifact Registry にアップロードする必要があります。
構成データを読み取るプラグイン コードを記述する
C++
構成データは、ルート コンテキスト オブジェクトの onConfigure メソッドに渡されます。このオブジェクトは、プラグインの起動時に 1 回インスタンス化され、プラグインをホストする Wasm ランタイムの存続期間中アクティブなままになります。ルート コンテキスト オブジェクトは、RootContext クラスのインスタンスまたは RootContext のサブクラスのインスタンスです。
プラグイン コードは、RegisterContextFactory 値を使用して、ルート コンテキストに使用するクラスを制御できます。たとえば、次のプラグイン コードは、ルート コンテキスト インスタンスとストリーム コンテキスト インスタンスに使用するクラスとして MyRootContext と MyHttpContext を登録します。次に、プラグイン構成データからシークレット値を読み取ります。このシークレット値は、ストリーム コンテキスト インスタンスがルート コンテキスト オブジェクトを介してアクセスできます。
Go
構成データは、OnPluginStart の実行中に読み取られます。これは、プラグインの起動時に PluginContext 構造体でランタイムが 1 回実行するメソッド レシーバです。構成データは、プラグインをホストする Wasm ランタイムの存続期間中に変更されません。PluginContext は、初期化ロジックの実行や、多くのリクエストにわたる状態の維持に役立ちます。
プラグイン コードは、VMContext で NewPluginContext メソッドを実装することで、PluginContext に使用するコンテキストを制御できます。このメソッドは PluginContext をインスタンス化します。PluginContext は HttpContext コンテキストをインスタンス化します。
たとえば、次のプラグイン コードは VMContext を登録します。これは、構成データの読み取りと、必要に応じた HttpContext コンテキストのインスタンス化を担当するコンテキストである PluginContext をインスタンス化します。PluginContext は、プラグイン構成データからシークレット値を読み取り、PluginContext コンテキスト内に保存して、NewHttpContext の HttpContext に渡します。
Rust
構成データは RootContext トレイトから読み取られます。このトレイトは、プラグインの起動時に 1 回インスタンス化され、プラグインをホストする Wasm ランタイムのライフタイムの間アクティブなままになります。RootContext トレイトは、多くのリクエストにわたってオペレーションを実行したり、状態を維持したりする場合に便利です。
プラグイン コードは、set_root_context メソッドを介してルート コンテキストに使用されるクラスを制御できます。ルート コンテキストはストリーム コンテキストをインスタンス化します。たとえば、次のプラグイン コードは MyRootContext を登録します。これにより、必要に応じて MyHttpContext がインスタンス化されます。ルート コンテキストは、プラグイン構成データからシークレット値を読み取り、ストリーム コンテキストに渡します。
構成ファイルをアップロードする
on_configure でプラグインに配信されるデータのサイズが 900 KiB を超える場合は、コンパイル済みプラグイン コードを Artifact Registry にアップロードするで説明されている方法に沿って、Artifact Registry にアップロードします。この場合、構成ファイルは plugin.config という名前で保存します(plugin.wasm ではありません)。
次のステップは、プラグインを作成することです。
プラグインの作成時に、アップロードされた Wasm モジュールまたはイメージの URI を指定する必要があります。
プラグイン コードの新しいバージョンを作成する
プラグイン コードの新しいバージョンを作成するには、プラグイン ファイルを編集します。次に、前のセクションで説明したように、プラグイン コードをコンパイルして再パッケージ化し、Artifact Registry にアップロードします。
コールバック
Wasm にコンパイルするコードでは、任意のメソッドや関数を定義できますが、その一部には特別な意味があります。これらは、選択した言語の Proxy-Wasm SDK で定義され、Proxy-Wasm アプリケーション バイナリ インターフェース(ABI)仕様にマッピングされるメソッドです。Service Extensions は、ユーザー リクエストに応じて、またはプラグインのライフサイクル イベントに応じて、これらのコールバックを呼び出します。
これらのコールバックは、通常呼び出される順序で次の表に示されています。
| コールバックの名前と説明 | C++ メソッド名 | Go メソッド名 | Rust メソッド名 |
|---|---|---|---|
START_PLUGIN: プラグインの起動時に呼び出されます。 |
RootContext::onStart |
VMContext.OnVmStart |
RootContext::on_vm_start |
CONFIGURE_PLUGIN: プラグインの起動後に呼び出され、プラグインに構成データを提供します。 |
RootContext::onConfigure |
PluginContext.OnPluginStart |
RootContext::on_configure |
CREATE_CONTEXT: 新しいストリーム コンテキストが作成されたときに呼び出されます。各ストリームはクライアントの HTTP リクエストに対応します。 |
Context::onCreate |
PluginContext.NewHttpContext |
RootContext::create_http_context |
HTTP_REQUEST_HEADERS: HTTP リクエスト ヘッダーを処理するために呼び出されます。 |
Context::onRequestHeaders |
HttpContext.OnHttpRequestHeaders |
HttpContext::on_http_request_headers |
HTTP_REQUEST_BODY: HTTP リクエスト本文のチャンクを処理するために繰り返し呼び出されます。 |
Context::onRequestBody |
HttpContext.OnHttpRequestBody |
HttpContext::on_http_request_body |
HTTP_RESPONSE_HEADERS: HTTP レスポンス ヘッダーを処理するために呼び出されます。 |
Context::onResponseHeaders |
HttpContext.OnHttpResponseHeaders |
HttpContext::on_http_response_headers |
HTTP_RESPONSE_BODY: HTTP レスポンス本文のチャンクを処理するために繰り返し呼び出されます。 |
Context::onResponseBody |
HttpContext.OnHttpResponseBody |
HttpContext::on_http_response_body |
DONE: プラグインの処理が完了したときに呼び出されます。 |
Context::onDone |
HttpContext.OnHttpStreamDone |
Context::on_done |
DELETE: クライアント HTTP リクエストに対応するストリーム コンテキスト オブジェクトが削除されたときに呼び出されます。 |
Context::onDelete |
(コールバックなし) | (コールバックなし) |
次のステップ
- プラグインを作成する
- Service Extensions の概要をご覧ください。