【Google Cloud】Cloud Run functionsの基本的な使い方

目次

Cloud Run functionsとは

Google Cloud Run functionsは、Google Cloudが提供するサーバーレス関数サービスです。
従来のCloud Functions(関数単位の実行モデル)をベースに、Cloud Runの仕組みの上で動作する形になっており、アプリケーション開発者がコードを関数として記述するだけで即座に実行可能です。

特徴

  1. HTTPベースの実行モデル
    • デプロイすると HTTPS エンドポイントが自動的に割り当てられます
    • curl コマンドやブラウザ、外部サービスからリクエストを送るだけで関数を呼び出せます
  2. サーバーレス
    • サーバーの構築やOSの管理は不要です
    • Googleがスケーリングや稼働環境の管理を自動で行います
    • リクエストがないときは課金されません
  3. イベント駆動
    • Pub/SubやCloud Schedulerと組み合わせることで、HTTPリクエスト以外のイベントトリガーでも関数を実行できます。(例:「毎日午前9時に実行」、「Cloud Storage にファイルがアップロードされたら実行」など)
  4. 柔軟な言語サポート
    • 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)をカレントディレクトリに保管しておきます。

<コマンド例>

<ソースコード>

関数を実行する

関数の作成ができたら関数を実行してみます。関数の画面上にエンドポイントURLが表示されているのでそれをクリックします。

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

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

テスト用のcurlコマンドをコピーしてCLI上で実行すると同じようにメッセージを確認できます。

セキュリティ設定を変更する

前章で関数が実行できるようになりましたが、セキュリティの観点からいくつか見直したい設定項目があります。ここではそれらの設定項目について説明します。

外部からのアクセスを拒否する(非公開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オプションを用いることで変更することも可能です。

アクセス権限を付与する

関数には、アクセス権限に関する「認証」という設定項目があります(デフォルトでは未選択)。「公開アクセスを許可する」を選択した場合、誰でもその関数を実行できる状態になります。一部のユーザやサービスアカウントのみがその関数を実行できるようにしたい場合は、「認証が必要」を選択してください。(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ヘッダーに付与することでエラーは解消されます。

なお、IAMを使用してアクセスを許可する場合、関数に対するroles/run.invokerロールをallUsersに付与すると、誰でもその関数を実行できる状態になります。

gcloud CLIの場合、gcloud run services add-iam-policy-bindingコマンドで関数にロールを付与できます。

以上ここまで、Cloud Run functionsで関数をデプロイして実行し、セキュリティ設定を見直しました。

この記事を書いた人

目次