概要
Cloud Run functions は、Google Cloud の Functions as a Service ソリューションである Google Cloud Run functions の最新バージョンです。このバージョンは、Cloud Run と Eventarc を活用した高度な機能セットを備えているため、パフォーマンスとスケーラビリティのさらに高度な制御、関数のランタイムに関するより細かい制御、90 を超えるイベントソースを使ったトリガーを実現できます。
このラボでは、HTTP リクエストに応答する Cloud Run functions の関数と、Cloud Storage イベントによってトリガーされるイベント ドリブン関数を作成します。また、Cloud Run functions 関数の複数のリビジョンをデプロイし、新しい設定を試します。
新機能
この新しいバージョンである Cloud Run functions は、Cloud Run、Cloud Build、Artifact Registry、Eventarc を利用した FaaS の拡張エクスペリエンスを提供します。
-
より長いリクエストの処理時間: Cloud Run functions の関数はデフォルトの 5 分よりも長く実行できるため、Cloud Storage や BigQuery からの大量なデータ ストリームの処理など、より時間のかかるリクエストのワークロードの実行が簡単になります。HTTP 関数の場合、タイムアウトは最長 60 分です。イベント ドリブン関数の場合、タイムアウトは最長 10 分です。
-
より大きいインスタンス: Cloud Run functions の関数で最大 16 GB の RAM と 4 つの vCPU を活用することで、大規模でコンピューティング負荷が高いワークロードをインメモリでより並列に実行することが可能になります。
-
同時実行: 単一の関数インスタンスで最大 1,000 件の同時リクエストを処理し、コールド スタートを最小限に抑え、スケーリング時のレイテンシを改善します。
-
最小インスタンス: コールド スタートを最小限に抑え、アプリケーションのブートストラップ時間がアプリケーションのパフォーマンスに影響しないように、事前にウォームアップされたインスタンスを提供します。
-
トラフィック分割: 関数の複数のバージョンをサポートします。異なるバージョン間でトラフィックを分割し、関数を以前のバージョンにロールバックします。
目標
このラボの内容:
- HTTP リクエストに応答する関数を作成し、その関数を Google Cloud コンソールを使用してデプロイする。
- Cloud Storage イベントに応答する関数を作成し、その関数をローカルの Cloud Shell 環境からデプロイする。
- 関数の単体テストを作成し、関数をローカルでテストする。
- Google Cloud コンソールを使用して、Cloud Run functions 関数の複数のリビジョンをデプロイする。
- 関数の最新のリビジョンをテストし、想定どおりに機能することを確認する。
設定
各ラボでは、新しい Google Cloud プロジェクトとリソースセットを一定時間無料で利用できます。
-
Qwiklabs にシークレット ウィンドウでログインします。
-
ラボのアクセス時間(例: 1:15:00
)に注意し、時間内に完了できるようにしてください。
一時停止機能はありません。必要な場合はやり直せますが、最初からになります。
-
準備ができたら、[ラボを開始] をクリックします。
-
ラボの認証情報(ユーザー名とパスワード)をメモしておきます。この情報は、Google Cloud Console にログインする際に使用します。
-
[Google Console を開く] をクリックします。
-
[別のアカウントを使用] をクリックし、このラボの認証情報をコピーしてプロンプトに貼り付けます。
他の認証情報を使用すると、エラーが発生したり、料金の請求が発生したりします。
-
利用規約に同意し、再設定用のリソースページをスキップします。
Google Cloud Shell の有効化
Google Cloud Shell は、開発ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働します。
Google Cloud Shell を使用すると、コマンドラインで Google Cloud リソースにアクセスできます。
-
Google Cloud コンソールで、右上のツールバーにある [Cloud Shell をアクティブにする] ボタンをクリックします。

-
[続行] をクリックします。
環境がプロビジョニングされ、接続されるまでしばらく待ちます。接続した時点で認証が完了しており、プロジェクトに各自のプロジェクト ID が設定されます。次に例を示します。

gcloud は Google Cloud のコマンドライン ツールです。このツールは、Cloud Shell にプリインストールされており、タブ補完がサポートされています。
- 次のコマンドを使用すると、有効なアカウント名を一覧表示できます。
gcloud auth list
出力:
Credentialed accounts:
- @.com (active)
出力例:
Credentialed accounts:
- google1623327_student@qwiklabs.net
- 次のコマンドを使用すると、プロジェクト ID を一覧表示できます。
gcloud config list project
出力:
[core]
project =
出力例:
[core]
project = qwiklabs-gcp-44776a13dea667a6
注:
gcloud ドキュメントの全文については、
gcloud CLI の概要ガイド
をご覧ください。
タスク 1. API を有効にする
Cloud Run functions の関数を作成する前に、関連する API を有効にする必要があります。
-
ラボの認証情報を使用して Google Cloud コンソールにログインし、Cloud Shell ターミナル ウィンドウを開きます。
-
Cloud Shell で次のコマンドを実行して、プロジェクト ID とリージョンの環境変数を設定します。
PROJECT_ID=$(gcloud config get-value project)
REGION={{{project_0.default_region|set at lab start}}}
-
次のコマンドを実行して、必要なすべてのサービス API を有効にします。
gcloud services enable \
artifactregistry.googleapis.com \
cloudfunctions.googleapis.com \
cloudbuild.googleapis.com \
eventarc.googleapis.com \
run.googleapis.com \
logging.googleapis.com \
storage.googleapis.com \
pubsub.googleapis.com
-
プロンプトが表示されたら、[承認] をクリックします。
タスク 2. HTTP 関数を作成する
最初に、HTTP リクエストに応答して、温度値を華氏から摂氏に変換し、変換された温度値を返す認証された Node.js 関数を作成します。
関数を作成する
-
Cloud Run functions にアクセスするには、ナビゲーション メニュー(
)で [Cloud Run functions] をクリックします。
注: ナビゲーション メニューに [Cloud Run functions] が表示されない場合は、[すべてのプロダクトを表示] をクリックします。[サーバーレス] セクションまでスクロールし、[Cloud Run functions] の横にあるピンをクリックしてから、[Cloud Run functions] をクリックします。
コンソールで [Cloud Run] にリダイレクトされます。
-
[関数を作成] をクリックします。
-
[サービス名] に「temperature-converter
」と入力します。
-
[リージョン] で [] リージョンを選択します。
-
[認証] で、[認証が必要] を選択します。
-
一番下までスクロールして、[コンテナ、ボリューム、ネットワーキング、セキュリティ] を開きます。
-
[リビジョン スケーリング] の [インスタンスの最大数] に「1」と入力します。
-
残りの設定はデフォルトのままにして、[作成] をクリックします。
-
この関数は Node.js に実装されます。[ソース] タブで、ベースイメージの横にある編集アイコンをクリックし、Node.js 言語ランタイムの最新バージョンを選択して [保存] をクリックします。
-
[関数のエントリ ポイント] に「convertTemp
」と入力します。
-
インライン エディタで、index.js
ファイル内の既存のサンプルコードを次のコードに置き換えます。
const functions = require('@google-cloud/functions-framework');
functions.http('convertTemp', (req, res) => {
var dirn = req.query.convert;
var ctemp = (req.query.temp - 32) * 5/9;
var target_unit = 'Celsius';
if (req.query.temp === undefined) {
res.status(400);
res.send('Temperature value not supplied in request.');
}
if (dirn === undefined)
dirn = process.env.TEMP_CONVERT_TO;
if (dirn === 'ctof') {
ctemp = (req.query.temp * 9/5) + 32;
target_unit = 'Fahrenheit';
}
res.send(`Temperature in ${target_unit} is: ${ctemp.toFixed(2)}.`);
});
これは、リクエストで渡された温度値を華氏または摂氏に変換し、変換された値で応答する、Node.js の単純な HTTP 関数です。
Functions Framework は、Cloud Run functions、ローカル開発マシン、Cloud Run など、さまざまな環境で実行される軽量の関数を作成できるオープンソースの FaaS(Function as a Service)フレームワークおよびライブラリです。詳しくは、Functions Framework のドキュメントをご覧ください。
関数をデプロイしてテストする
-
関数をデプロイするには、[保存して再デプロイ] をクリックします。Cloud Build とその基盤となる Cloud Run サービスが作成されるまで待ちます。
関数がデプロイされると、関数の詳細ページで、関数名の横に緑色のチェックマークが表示されます。

-
Cloud Shell で、関数の HTTP URI を取得し、環境変数に保存します。
FUNCTION_URI=$(gcloud run services describe temperature-converter --region $REGION --format 'value(status.url)'); echo $FUNCTION_URI
-
Cloud Shell で、次のコマンドを使用して関数をテストします。
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" "${FUNCTION_URI}?temp=70"
次のようなメッセージがレスポンスとして表示されます。
Temperature in Celsius is: 21.11.
-
摂氏の温度値と変換単位を渡して、コマンドを再実行します。
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" "${FUNCTION_URI}?temp=21.11&convert=ctof"
次のようなメッセージがレスポンスとして表示されます。
Temperature in Fahrenheit is: 70.00.
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
HTTP 関数を作成する
タスク 3. Cloud Storage 関数を作成する
このタスクでは、Cloud Storage バケットからのイベントに応答するイベント ドリブン関数を Node.js に作成します。
設定
Cloud Run functions の関数で Cloud Storage トリガーを使用するには、Cloud Storage サービス エージェントに、プロジェクト対する Pub/Sub パブリッシャー(roles/pubsub.publisher
)の IAM ロールが必要です。
Cloud Storage の関数は Cloud Storage からの Pub/Sub 通知に基づいており、finalize
、delete
、archive
、metadata update
イベントタイプに対応しています。
-
Cloud Storage エージェントのサービス アカウントの環境変数を設定します。
SERVICE_ACCOUNT=$(gcloud storage service-agent)
-
プロジェクトの Cloud Storage サービス エージェントに Pub/Sub パブリッシャーのロールを付与します。サービス エージェントは、Google が管理するサービス アカウントで、そのサービスがユーザーのリソースにアクセスできるようにするものです。
gcloud projects add-iam-policy-binding $PROJECT_ID --member serviceAccount:$SERVICE_ACCOUNT --role roles/pubsub.publisher
-
後のタスクでこの関数をトリガーできるように、Cloud Storage にファイルをアップロードします。サンプルの温度データを含むこのファイルを、Cloud Shell 環境にコピーします。
gcloud storage cp gs://cloud-training/CBL491/data/average-temps.csv .
関数を作成する
-
このサブタスクでは、Cloud Shell で関数をローカルに開発します。新しいディレクトリを作成し、そのディレクトリに移動します。
mkdir ~/temp-data-checker && cd $_
-
Node.js の関数に使用する index.js
ファイルと package.json
ファイルを作成します。
touch index.js && touch package.json
-
Cloud Shell ツールバーで [エディタを開く] をクリックします。
Cloud Shell とコードエディタを切り替えるには、[エディタを開く] と [ターミナルを開く] を使用します。または、[新しいウィンドウで開く] をクリックして、別のタブでエディタを開いたままにすることもできます。
-
エディタの [エクスプローラ] で、temp-data-checker
フォルダを開きます。
-
temp-data-checker/index.js
ファイルに次のコードを追加します。
const functions = require('@google-cloud/functions-framework');
// Cloud Storage イベントによってトリガーされる CloudEvent コールバックを
// Functions Framework に登録します。
functions.cloudEvent('checkTempData', cloudEvent => {
console.log(`Event ID: ${cloudEvent.id}`);
console.log(`Event Type: ${cloudEvent.type}`);
const file = cloudEvent.data;
console.log(`Bucket: ${file.bucket}`);
console.log(`File: ${file.name}`);
console.log(`Created: ${file.timeCreated}`);
});
この関数では、「console.log」ステートメントを使用して、メッセージを stdout にロギングします。Cloud Run functions には、デフォルトで簡単なランタイムのロギング機能が含まれています。ログ メッセージは Cloud Run functions によって取得、解析された後、Cloud Logging に送信されます。Cloud Logging は、Cloud コンソールで確認できます。
-
Node.js 関数の依存関係やその他のパッケージ情報を指定するには、temp-data-checker/package.json
ファイルに次の内容を追加します。
{
"name": "temperature-data-checker",
"version": "0.0.1",
"main": "index.js",
"dependencies": {
"@google-cloud/functions-framework": "^2.1.0"
}
}
関数をデプロイする
-
Cloud Shell ターミナル ウィンドウで、まずバケット名の環境変数を設定します。
BUCKET="gs://gcf-temperature-data-$PROJECT_ID"
-
温度データファイルを保存する Cloud Storage バケットを作成します。
gcloud storage buckets create -l $REGION $BUCKET
-
関数をデプロイするには、Cloud Shell で次のコマンドを実行します。
gcloud functions deploy temperature-data-checker \
--gen2 \
--runtime nodejs20 \
--entry-point checkTempData \
--source . \
--region $REGION \
--trigger-bucket $BUCKET \
--trigger-location $REGION \
--max-instances 1
trigger-bucket
を指定すると、このバケット内のファイルに変更が加えられるたびに、関数の実行がトリガーされます。
注: 権限エラーが表示された場合は、数分待ってからデプロイを再試行してください。API が有効になるまで、しばらく時間がかかります。
-
関数が正常にデプロイされたことを確認します。

関数をテストする
-
温度データファイルを Cloud Storage バケットにアップロードして、関数をテストします。
gcloud storage cp ~/average-temps.csv $BUCKET/average-temps.csv
-
以下のコマンドを実行します。受信した CloudEvent の情報がログに表示されます。
gcloud functions logs read temperature-data-checker \
--region $REGION --gen2 --limit=100 --format "value(log)"
注: ログの生成には 1 分ほどかかることがあります。
出力は次のようになります。
Created: 2024-08-28T13:18:34.980Z
File: average-temps.csv
Bucket: gcf-temperature-data-cf-project
Event Type: google.cloud.storage.object.v1.finalized
Event ID: 5834307012388233
このラボで作成した Cloud Storage 関数は、バケットと作成されたリソースに関するメタデータを抽出します。ダウンストリーム サービスでデータを抽出して処理するには、使用している言語ランタイムの Cloud Storage クライアント ライブラリを使用します。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
Cloud Storage 関数を作成する
タスク 4. ローカルで開発とテストを行う
Cloud Run functions は、Cloud Run functions の外部で関数を実行するための方法をいくつかサポートしています。これは、反復的な開発、ローカル環境でのデプロイ前テスト、データ局所性のコンプライアンス、マルチクラウドのデプロイを実施するうえで役立ちます。
このタスクでは、既存の HTTP 関数を変更し、単体テストと統合テストを開発して、関数をローカルでテストしてから、Cloud Run functions にデプロイします。
関数のソースコードをダウンロードする
-
Cloud Run functions にアクセスするには、ナビゲーション メニュー(
)で [Cloud Run] をクリックします。
-
temperature-converter 関数の詳細を表示するには、関数名を選択します。
-
関数のソースコードを表示するには、[ソース] タブをクリックします。
-
[ZIP をダウンロード] をクリックし、ファイル名を function-source.zip
に変更し、パソコンのフォルダに ZIP ファイルを保存します。
-
Cloud Shell のツールバーで、その他メニュー(
)をクリックし、[アップロード] を選択します。
-
[アップロード] ダイアログで、[ファイル選択] をクリックします。
-
先ほどフォルダにダウンロードした ZIP ファイルを選択してから [開く] をクリックし、ダイアログで [アップロード] をクリックします。
-
ファイルがアップロードされたら、Cloud Shell で次のコマンドを実行します。
mkdir ~/temp-data-converter && cd $_
-
ZIP ファイルのコンテンツを抽出します。
unzip ../function-source.zip
関数コードに単体テストを追加する
まず、temperature-convert 関数に単体テストを追加しましょう。
-
すべての関数テストと単体テストのソースファイルを含めるディレクトリを作成します。
mkdir tests && touch tests/unit.http.test.js
-
Cloud Shell ツールバーで [エディタを開く] をクリックします。
-
エディタで、temp-data-converter/tests/unit.http.test.js
ファイルに次のコードを追加します。テストコードは、HTTP リクエストとレスポンスをラップするモックを作成し、Sinon スタブを使用して、関数から受け取ったレスポンスを解釈します。
const {getFunction} = require('@google-cloud/functions-framework/testing');
describe('functions_convert_temperature_http', () => {
// Sinon は、Express で作成された Node.js アプリケーションのモックを作成するために使用されるテスト フレームワークです。
// Express は、HTTP 関数を実装するために使用される Node.js ウェブ アプリケーション フレームワークです。
const sinon = require('sinon');
const assert = require('assert');
require('../');
const getMocks = () => {
const req = {body: {}, query: {}};
return {
req: req,
res: {
send: sinon.stub().returnsThis(),
status: sinon.stub().returnsThis()
},
};
};
let envOrig;
before(() => {
envOrig = JSON.stringify(process.env);
});
after(() => {
process.env = JSON.parse(envOrig);
});
it('convertTemp: should convert a Fahrenheit temp value by default', () => {
const mocks = getMocks();
mocks.req.query = {temp: 70};
const convertTemp = getFunction('convertTemp');
convertTemp(mocks.req, mocks.res);
assert.strictEqual(mocks.res.send.calledOnceWith('Temperature in Celsius is: 21.11.'), true);
});
it('convertTemp: should convert a Celsius temp value', () => {
const mocks = getMocks();
mocks.req.query = {temp: 21.11, convert: 'ctof'};
const convertTemp = getFunction('convertTemp');
convertTemp(mocks.req, mocks.res);
assert.strictEqual(mocks.res.send.calledOnceWith('Temperature in Fahrenheit is: 70.00.'), true);
});
it('convertTemp: should convert a Celsius temp value by default', () => {
process.env.TEMP_CONVERT_TO = 'ctof';
const mocks = getMocks();
mocks.req.query = {temp: 21.11};
const convertTemp = getFunction('convertTemp');
convertTemp(mocks.req, mocks.res);
assert.strictEqual(mocks.res.send.calledOnceWith('Temperature in Fahrenheit is: 70.00.'), true);
});
it('convertTemp: should return an error message', () => {
const mocks = getMocks();
const convertTemp = getFunction('convertTemp');
convertTemp(mocks.req, mocks.res);
assert.strictEqual(mocks.res.status.calledOnce, true);
assert.strictEqual(mocks.res.status.firstCall.args[0], 400);
});
});
注: 4 つの単体テストが記述されており、そのうち 3 つは、関数からのレスポンスに特定の温度値が含まれることを想定しているポジティブ テストです。4 番目のテストはネガティブ テストです。リクエスト オブジェクトに渡される温度値がないため、関数がレスポンス ステータス コード 400(不正なリクエスト)を返すことを想定しています。
-
temp-data-converter/package.json
ファイルで、Node.js 関数の依存関係を更新し、scripts
セクションと devDependencies
セクションを追加します。
{
"name": "temperature-converter",
"version": "0.0.1",
"main": "index.js",
"scripts": {
"unit-test": "mocha tests/unit*test.js --timeout=6000 --exit",
"test": "npm -- run unit-test"
},
"devDependencies": {
"mocha": "^9.0.0",
"sinon": "^14.0.0"
},
"dependencies": {
"@google-cloud/functions-framework": "^2.1.0"
}
}
単体テストを実行する
-
Cloud Shell ターミナル ウィンドウで、まず次のコマンドを実行して関数の依存関係をインストールします。
npm install
このコマンドは、package.json ファイルで定義されているすべての依存関係をダウンロードする Node Package Manager を実行します。
-
単体テストを実行します。
npm test
-
コマンド出力から、すべてのテストに合格したことを確認します。
> temperature-converter@0.0.1 test
> npm -- run unit-test
> temperature-converter@0.0.1 unit-test
> mocha tests/unit*test.js --timeout=6000 --exit
functions_convert_temperature_http
✔ convertTemp: should convert a Fahrenheit temp value by default
✔ convertTemp: should convert a Celsius temp value
✔ convertTemp: should convert a Celsius temp value by default
✔ convertTemp: should return an error message
4 passing (10ms)
Mocha は、Node.js 上で動作する JavaScript テスト フレームワークで、シンプルかつ柔軟な方法による非同期テストを可能にします。
HTTP とイベント ドリブンの Cloud Run functions 関数については、単体テスト、統合テスト、システムテストを実装することも検討してください。デプロイ前のテストの実装について詳しくは、このラボの最後にある「詳細」セクションのリンクをご覧ください。
タスク 5. 関数のリビジョン
Cloud Run functions では、関数の複数のリビジョンがサポートされ、トラフィックを異なるリビジョン間で分割したり、関数を以前のリビジョンにロールバックしたりできます。
関数をデプロイまたは再デプロイすると、基盤となる Cloud Run サービスの新しいリビジョンが自動的に作成されます。リビジョンは不変であり、作成後は変更できません。関数を変更するには、関数を再デプロイする必要があります。
このタスクでは、前のタスクで作成した HTTP 関数を環境変数とともにデプロイし、Google Cloud コンソールを使用して、その関数の 2 つのリビジョン間のトラフィックを管理します。
関数を再デプロイする
-
Google Cloud コンソールで、temperature-converter
関数の [関数の詳細] ページに移動します。
-
[新しいリビジョンの編集とデプロイ] をクリックします。
-
[コンテナ] タブで、[変数とシークレット] タブを選択します。
-
環境変数を追加するには、[環境変数] セクションで [変数を追加] をクリックします。
-
[名前 1] に「TEMP_CONVERT_TO」と入力します。
-
環境変数の値を指定するには、[値 1] に「ctof」と入力します。
-
[デプロイ] をクリックします。
-
デプロイ プロセスが完了するまで待ちます。プロセスが完了すると、関数の 2 つのリビジョンが表示されます。
デフォルトでは、関数へのトラフィックの 100% が、新たにデプロイされたリビジョンに送られます。このリビジョンは、すべての温度値をデフォルトで摂氏から華氏に変換するよう関数に指示する環境変数とともにデプロイされています。
関数の最新リビジョンをテストする
-
関数をテストするには、Cloud Shell で、摂氏で示された temp
クエリ パラメータ値を含む次の curl
コマンドを実行します。
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" "${FUNCTION_URI}?temp=21.11"
関数から返された、次のレスポンス メッセージが表示されます。
Temperature in Fahrenheit is: 70.00.
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
関数のリビジョンを作成する
お疲れさまでした
このラボでは、HTTP リクエストと Cloud Storage イベントに応答する Cloud Run functions の関数をデプロイしました。HTTP 関数の単体テストを使用してデプロイ前テストを実装し、テストを実行することで、関数を呼び出す際のポジティブおよびネガティブなシナリオを検証しました。また、関数の複数リビジョンをデプロイし、最新のリビジョンをテストして関数の動作も確認しました。
次のステップと詳細情報
Cloud Run functions の詳細については、以下のドキュメントをご覧ください。
Copyright 2025 Google LLC All rights reserved. Google および Google のロゴは、Google LLC の商標です。その他すべての社名および製品名は、それぞれ該当する企業の商標である可能性があります。