Cloud Run functionsとは
Google Cloud Run functionsは、Google Cloudが提供するサーバーレス関数サービスです。
従来のCloud Functions(関数単位の実行モデル)をベースに、Cloud Runの仕組みの上で動作する形になっており、アプリケーション開発者がコードを関数として記述するだけで即座に実行可能です。
特徴
- HTTPベースの実行モデル
- デプロイすると HTTPS エンドポイントが自動的に割り当てられます
curl
コマンドやブラウザ、外部サービスからリクエストを送るだけで関数を呼び出せます
- サーバーレス
- サーバーの構築やOSの管理は不要です
- Googleがスケーリングや稼働環境の管理を自動で行います
- リクエストがないときは課金されません
- イベント駆動
- Pub/SubやCloud Schedulerと組み合わせることで、HTTPリクエスト以外のイベントトリガーでも関数を実行できます。(例:「毎日午前9時に実行」、「Cloud Storage にファイルがアップロードされたら実行」など)
- 柔軟な言語サポート
- Python、Node.js、Go、Java など複数言語に対応
- 開発者は慣れた言語で最小限のコードを書けばすぐに関数を公開可能
関数を作成して実行してみる
ここではCloud Run functionsを試しに使ってみて、どのように動作するのか確認してみましょう。
関数を作成しソースコードをデプロイする
Google Cloudコンソールから[Cloud Run]ページに移動します。
「関数を作成」をクリックし、以下のように設定してから「作成」をクリックします。関数が作成されたら、サービスの詳細画面の「ソース」タブで「保存して再デプロイ」をクリックします。これによりサンプルのソースコードがデプロイされ、関数が実行できるようになります。
設定項目 | 設定値 |
---|---|
サービスの名前 | sample-function-1 |
リージョン | asia-northeast1(東京) |
ランタイム | Python 3.12 |
トリガー(省略可) | (省略)(デフォルト) |
認証 | 公開アクセスを許可する |
課金 | リクエストベース(デフォルト) |
サービスのスケーリング | 自動スケーリング(デフォルト) ※インスタンスの最小数:0 |
Ingress | すべて(デフォルト) |
CloudShellやローカル環境からgcloud CLIを用いて関数を作成およびデプロイしたい場合は、以下のようにパラメータを指定してgcloud run deploy
コマンドを実行します(パラメータは上記設定に合わせています)。本コマンドを実行する場合、以下のサンプルのソースコード(main.py, requirements.txt)をカレントディレクトリに保管しておきます。
<コマンド例>
1 |
gcloud run deploy sample-function-1 --source . --function hello_http --base-image python312 --region asia-northeast1 --no-invoker-iam-check |
<ソースコード>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import functions_framework @functions_framework.http def hello_http(request): """HTTP Cloud Function. Args: request (flask.Request): The request object. <https://flask.palletsprojects.com/en/1.1.x/api/#incoming-request-data> Returns: The response text, or any set of values that can be turned into a Response object using `make_response` <https://flask.palletsprojects.com/en/1.1.x/api/#flask.make_response>. """ request_json = request.get_json(silent=True) request_args = request.args if request_json and 'name' in request_json: name = request_json['name'] elif request_args and 'name' in request_args: name = request_args['name'] else: name = 'World' return 'Hello {}!'.format(name) |
1 |
functions-framework==3.* |
関数を実行する
関数の作成ができたら関数を実行してみます。関数の画面上にエンドポイントURLが表示されているのでそれをクリックします。

エンドポイントURLにアクセスすると、以下のように「Hello World!」のメッセージを確認できます。

CloudShellもしくはgcloud CLIがインストールされた端末のCLIからも関数を実行できます。関数の画面に戻り、「テスト」をクリックします。


テスト用のcurlコマンドをコピーしてCLI上で実行すると同じようにメッセージを確認できます。
1 2 3 4 5 |
$ curl -X POST "https://sample-function-1-xxxxxxxxxxxx.asia-northeast1.run.app" \ > -H "Authorization: bearer $(gcloud auth print-identity-token)" \ > -H "Content-Type: application/json" \ > -d '{ "name": "Developer" }' Hello Developer! |
セキュリティ設定を変更する
前章で関数が実行できるようになりましたが、セキュリティの観点からいくつか見直したい設定項目があります。ここではそれらの設定項目について説明します。
外部からのアクセスを拒否する(非公開APIにする)
関数を作成する際、デフォルトでは「Ingress」という設定項目の設定値が「すべて」になっていますが、これはアクセス範囲が制限されていない状態です。関数の利用範囲がGoogle Cloud内部であれば設定値を「内部」に変更しておくと、インターネットからのアクセスを遮断し非公開APIとなるため、関数を安全に利用することができます。
「Ingress」の設定を「内部」に変更してからブラウザでエンドポイントURLにアクセスしてみると、以下のように「Page not found」というエラーメッセージが表示されます。
Error: Page not found
The requested URL was not found on this server.
「Ingress」の設定は、サービスの詳細画面の「ネットワーキング」タブから変更可能です。

または、以下のようにgcloud run services update
コマンドに--ingress
オプションを用いることで変更することも可能です。
1 |
gcloud run services update sample-function-1 --region asia-northeast1 --ingress internal |
アクセス権限を付与する
関数には、アクセス権限に関する「認証」という設定項目があります(デフォルトでは未選択)。「公開アクセスを許可する」を選択した場合、誰でもその関数を実行できる状態になります。一部のユーザやサービスアカウントのみがその関数を実行できるようにしたい場合は、「認証が必要」を選択してください。(IAPを使用して許可するユーザを管理する方式はプレビューのため、IAMを使用して許可するIDを管理する方式を選択します)

関数の設定画面で「認証が必要」を選択し、設定を保存してからブラウザでエンドポイントURLにアクセスしてみると、以下のように「Forbidden」というWebサイトへのアクセスを拒否するエラーメッセージが表示されます。
Error: Forbidden
Your client does not have permission to get URL / from this server.
アクセスを許可したいユーザやサービスアカウントにroles/run.invoker
ロールを付与し、以下のテスト用のcurlコマンドのようにIDトークンを発行してAuthorizationヘッダーに付与することでエラーは解消されます。
1 2 3 4 5 6 |
curl -X POST "https://sample-function-1-xxxxxxxxxxxx.asia-northeast1.run.app" \ -H "Authorization: bearer $(gcloud auth print-identity-token)" \ -H "Content-Type: application/json" \ -d '{ "name": "Developer" }' |
なお、IAMを使用してアクセスを許可する場合、関数に対するroles/run.invoker
ロールをallUsers
に付与すると、誰でもその関数を実行できる状態になります。
gcloud CLIの場合、gcloud run services add-iam-policy-binding
コマンドで関数にロールを付与できます。
1 |
gcloud run services add-iam-policy-binding sample-function-1 --region asia-northeast1 --member="allUsers" --role="roles/run.invoker" |
以上ここまで、Cloud Run functionsで関数をデプロイして実行し、セキュリティ設定を見直しました。