ソースコードからサービスをデプロイする

このページでは、1 つの gcloud CLI コマンド gcloud run deploy--source フラグを使用して、新しいサービスまたはサービス リビジョンをソースコードから直接 Cloud Run にデプロイする方法について説明します。Hello World サービスをデプロイするチュートリアルの例については、クイックスタート: ソースからデプロイするをご覧ください。

この機能を使用するには、次の 2 つの方法があります。

ソースデプロイでは、Artifact Registry を使用してビルドされたコンテナが保存されます。プロジェクトで、デプロイ先のリージョンに cloud-run-source-deploy という名前の Artifact Registry リポジトリがまだない場合、この機能により、cloud-run-source-deploy という名前の Artifact Registry リポジトリが自動的に作成されます。

Dockerfile がソースコード ディレクトリにある場合、アップロードしたソースコードはその Dockerfile を使用してビルドされます。ソースコード ディレクトリに Dockerfile が存在しない場合、Google Cloud の Buildpack は、使用されている言語を自動的に検出してコードの依存関係を取得し、Google が管理する安全なベースイメージを使用してプロダクション レディなコンテナ イメージを作成します。

デフォルトでは、セキュリティ修正は Cloud Run サービスがデプロイされた場合にのみ適用されます。サービスのセキュリティの自動更新を有効にすると、そのサービスはダウンタイムなしでパッチを自動的に受け取ります。詳しくは、セキュリティ更新の構成をご覧ください。

始める前に

  • 設定ページの説明に従って、Cloud Run に新しいプロジェクトを設定したことを確認してください。
  • ドメイン制限の組織のポリシーでプロジェクトの未認証呼び出しが制限されている場合は、限定公開サービスのテストの説明に従って、デプロイされたサービスにアクセスする必要があります。

  • Enable the Cloud Run Admin API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

    Cloud Run Admin API を有効にすると、Compute Engine のデフォルトのサービス アカウントが自動的に作成されます。

必要なロール

ソースからデプロイするには、ユーザーまたは管理者がデプロイ担当者アカウントに次の IAM ロールを付与する必要があります。

ここをクリックしてデプロイ担当者のアカウントに必要なロールを表示

ソースからビルドしてデプロイするために必要な権限を取得するには、次の IAM ロールを付与するよう管理者に依頼してください。

Cloud Run に関連付けられている IAM ロールと権限のリストについては、Cloud Run IAM ロールCloud Run IAM 権限をご覧ください。Cloud Run サービスがGoogle Cloud APIs(Cloud クライアント ライブラリなど)と連携している場合は、サービス ID の構成ガイドをご覧ください。ロールの付与の詳細については、デプロイ権限アクセスの管理をご覧ください。

サポートされている言語

Dockerfile を含むソースに加えて、ソースからのデプロイでは Google Cloud の Buildpack を使用して次の言語がサポートされています。

ランタイム ソースのデプロイ Buildpack の構成
Go Go サービスをデプロイする Go Buildpack を構成する
Node.js Node.js サービスをデプロイする Node.js Buildpack を構成する
Python Python サービスをデプロイする Python Buildpack を構成する
Java
(Kotlin、Groovy、Scala を含む)
Java サービスをデプロイする Java Buildpack を構成する
.NET .NET サービスをデプロイする .NET Buildpack を構成する
Ruby Ruby サービスをデプロイする Ruby Buildpack を構成する
PHP PHP サービスをデプロイする PHP Buildpack を構成する

詳細については、サポートされている言語のバージョンをご覧ください。

ビルドを使用してソースからデプロイする

このセクションでは、Google Cloud の Buildpack と Cloud Build を使用して、ソースコードからコンテナ イメージを自動的にビルドする方法について説明します。Docker をマシンにインストールしたり、Buildpack や Cloud Build の設定を行う必要はありません。

制限事項

  • ソースからのデプロイでは Artifact Registry と Cloud Build が使用されるため、この機能は Artifact RegistryCloud Build でサポートされているリージョンでのみ使用できます。
  • ソースからデプロイする機能は便利ですが、ビルドを完全にカスタマイズすることはできません。より細かく制御するには、Cloud Build を使用してコンテナ イメージをビルドします。たとえば、gcloud builds submit を使用し、次に gcloud run deploy --image などを使用してコンテナ イメージをデプロイします。
  • Google Cloud の Buildpack を使用してソースからデプロイすると、ソースファイルの最終更新日は 1980 年 1 月 1 日に設定されます。これは Buildpack のデフォルトの動作で、再現性のあるビルドをサポートするように設計されています。言語フレームワークによっては、静的ファイルのブラウザ側のキャッシュに影響する可能性があります。アプリケーションがこの影響を受ける場合は、アプリケーションで etagLast-Modified の HTTP ヘッダーを無効にすることをおすすめします。
  • Google Cloud の Buildpack でソースからデプロイする場合は、常に gcr.io/buildpacks/builder:latest を使用します。latest で優先言語または OS 構成を使用できない場合は、特定のビルダーを使用し、優先ビルダーでアプリケーション イメージを作成します。
  • Kotlin や Java などの JVM 言語を使用して、ソースからサービスをデプロイできます。使用する言語は、次のルールに準拠している必要があります。

    • アプリケーションは Maven または Gradle を使用してビルドできます。
    • ビルドファイルには、クラスを生成するために必要なすべてのプラグインが含まれています。

ビルドを使用してデプロイする前に

ビルドを使用してソースからデプロイする前に:

  • 始める前にの手順に沿って操作します。

  • Enable the Cloud Build API.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the API

必要なロール

ビルドを使用してソースからデプロイするには、ユーザーまたは管理者が Cloud Build サービス アカウントに次の IAM ロールを付与する必要があります。

クリックして Cloud Build サービス アカウントに必要なロールを表示

この動作をオーバーライドしない限り、Cloud Build は、ソースコードと Cloud Run リソースのビルドにデフォルトの Cloud Build サービス アカウントとして Compute Engine のデフォルトのサービス アカウントを自動的に使用します。Cloud Build がソースをビルドできるようにするには、プロジェクトの Compute Engine のデフォルトのサービス アカウントに Cloud Run ビルダーroles/run.builder)を付与するよう管理者に依頼します。

  gcloud projects add-iam-policy-binding PROJECT_ID \
      --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
      --role=roles/run.builder
  

PROJECT_NUMBER は Google Cloudプロジェクト番号に、PROJECT_ID は Google Cloudプロジェクト ID に置き換えます。プロジェクト ID とプロジェクト番号を確認する方法については、プロジェクトの作成と管理をご覧ください。

Compute Engine のデフォルト サービス アカウントに Cloud Run ビルダーのロールを付与すると、反映されるまでに数分かかることがあります。

Cloud Run に関連付けられている IAM ロールと権限のリストについては、Cloud Run IAM ロールCloud Run IAM 権限をご覧ください。Cloud Run サービスがGoogle Cloud APIs(Cloud クライアント ライブラリなど)と連携している場合は、サービス ID の構成ガイドをご覧ください。ロールの付与の詳細については、デプロイ権限アクセスの管理をご覧ください。

ビルドを使用してデプロイする

ソースコードからデプロイするには、使用するツールのタブをクリックして、手順を確認してください。

gcloud

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. ソース ディレクトリに移動します。ソース ディレクトリでは、Dockerfile が存在する場合はそれが使用されます(必須ではありません)。

  3. サービスをビルドしてデプロイします。

    gcloud run deploy SERVICE --source .

    SERVICE は、サービスに付ける名前で置き換えます。

  4. プロンプトが表示されたら、「y」と応答して、必要な API をインストールします。これが必要なのはプロジェクトに対して 1 回だけです。設定ページに記載されているように、デフォルト値を設定しない場合は、別のプロンプトにプラットフォームとリージョンを指定して応答します。

  5. ビルドとデプロイが完了するまで待ちます。完了すると、Cloud Run に成功メッセージが表示されます。

  6. デプロイ後、このサービスのリビジョンはトラフィックを 100% 処理します。

    Cloud Code

    Cloud Code を使用してソースからデプロイするには、IntelliJVisual Studio Code のガイドをご覧ください。

    Gemini CLI

    Gemini CLI ツールの /deploy コマンドを使用して、ソースコードから Cloud Run サービスをデプロイします。

    Cloud Run 拡張機能で Gemini CLI を使用する手順は次のとおりです。

    1. 次のいずれかの開発環境に、Gemini CLI の最新バージョンをインストールします。

      • ターミナル
      • Cloud Shell
      • Gemini Code Assist エージェント モードを使用する VS Code(「VS Code」タブを参照)
    2. Cloud Run 拡張機能をインストールします。

      gemini extensions install https://github.com/GoogleCloudPlatform/cloud-run-mcp
    3. Google Cloud CLI にログインします。

      gcloud auth login
    4. アプリケーションのデフォルト認証情報を設定します。

      gcloud auth application-default login
    5. ソースコード ディレクトリに移動します。

    6. Gemini CLI を起動します。

      gemini
    7. サービスをビルドしてデプロイします。

      /deploy
      • Google Cloud プロジェクトの入力を求められたら、プロジェクト名を入力します。
      • ツールを選択するよう求められたら、deploy_local_folder を選択します。
    8. ビルドとデプロイが完了するまで待ちます。完了すると、Cloud Run に成功メッセージが表示されます。

    MCP

    Model Context Protocol(MCP)クライアントのソースコードから Cloud Run サービスをデプロイするには、Cloud Run Model Context Protocol(MCP)サーバーをインストールします。

    インストール手順は MCP クライアントによって異なります。多くの場合、設定の JSON ファイルに次の行を追加する必要があります。

    "mcpServers":{
      "cloud-run": {
        "command": "npx",
        "args": ["-y", "@google-cloud/cloud-run-mcp"]
      }
    }

    Compose

    Compose SpecificationYAML ファイルに保存し、1 つの gcloud コマンドを使用して、ソースコードから Cloud Run サービスとしてデプロイできます。

    1. ソース ディレクトリに移動します。ソース ディレクトリでは、Dockerfile が存在する場合はそれが使用されます(必須ではありません)。

    2. プロジェクト ディレクトリに、サービス定義を含む compose.yaml ファイルを作成します。

      services:
        web:
          build: .
          ports:
            - "8080:8080"

      環境変数、シークレット、ボリューム マウントなど、他の構成オプションを指定することもできます。

    3. サービスをデプロイするには、gcloud beta run compose up コマンドを実行します。

      gcloud beta run compose up compose.yaml
    4. 必要なコンポーネントをインストールするプロンプトや API を有効にするプロンプトが表示されたら、「y」と応答します。

    5. 省略可: サービスへの未認証アクセスを許可したい場合は、サービスを一般公開にします

    デプロイが完了すると、Cloud Run サービスの URL が表示されます。この URL をコピーしてブラウザに貼り付けると、実行中のコンテナが表示されます。 Google Cloud コンソールからデフォルトの認証を無効にできます。

ビルドなしでソースからデプロイする

ソース アーティファクトを Cloud Run に直接デプロイして、Cloud Build のステップをバイパスできます。この方法では、ソースからコンテナ イメージをビルドする代わりに、アプリケーションの事前パッケージ化されたアーカイブを Cloud Storage バケットに直接アップロードできます。Cloud Run はこのアーカイブを取得し、ベースイメージで直接実行します。このアプローチにより、デプロイ時間が大幅に短縮されます。

制限事項

ビルドなしでソースにデプロイする場合、サポート対象が次のものに制限されます。

  • Cloud Run サービス。
  • サポートされているランタイム(Dockerfile のサポートなし)。
  • ソース アーカイブ(.tar.gz)、250 MiB 以下。
  • バイナリ(Go バイナリなど)またはスクリプト(Python スクリプトなど)は、x86 アーキテクチャと互換性がある必要があります。
  • ソースは自己完結型で、すべての依存関係がパッケージ化されている必要があります。ランタイム ベースイメージには、最小限のオペレーティング システムといくつかの言語ライブラリのみが含まれています。

ビルドなしでデプロイする前に

「ビルドなしでデプロイ」機能を使用するには:

  • 始める前にの手順に沿って作業を進めてください。
  • Cloud Run と Cloud Storage API を有効にします。

    gcloud services enable run.googleapis.com \
      storage.googleapis.com
    
  • アプリケーションの依存関係はインストールされていません(ビルドなし)。デプロイ前にローカルにインストールする必要があります。

ビルドなしでデプロイする

このセクションでは、ビルドを使用せずにアーティファクトを Cloud Run に直接デプロイする方法について説明します。

gcloud

ローカル ソース ディレクトリをデプロイするには、--no-build フラグを使用して、deploy コマンドに Cloud Build のステップをバイパスするように指示します。

gcloud beta run deploy SERVICE_NAME \
  --source APPLICATION_PATH \
  --no-build \
  --base-image=BASE_IMAGE \
  --command=COMMAND \
  --args=ARG

次のように置き換えます。

  • SERVICE_NAME: Cloud Run サービスの名前。
  • APPLICATION_PATH: ローカル ファイル システム上のアプリケーションの場所。
  • BASE_IMAGE: アプリケーションで使用するランタイム ベースイメージ。例: us-central1-docker.pkg.dev/serverless-runtimes/google-24-full/runtimes/nodejs24
  • COMMAND: コンテナを起動するコマンド。
  • ARG: コンテナ コマンドに送信する引数。複数の引数を使用する場合は、それぞれを 1 行に 1 つずつ指定します。

YAML

サービス仕様を YAML ファイルに保存してから、gcloud CLI または Google Cloud コンソールの service.yaml エディタを使用してデプロイできます。

  1. アプリケーションを保持するストレージ バケットを作成します。

    gcloud storage buckets create gs://BUCKET_NAME --location=BUCKET_LOCATION
    

    次のように置き換えます。

    • BUCKET_NAME: バケットに付ける名前。命名の要件に従う必要があります。例: my-bucket
    • BUCKET_LOCATION: バケットのロケーション。例: US
  2. zip または tar を使用して、アプリケーションのソースを含むアーカイブを作成します。例:

    tar -cvzf ARCHIVE_NAME APPLICATION_PATH
    

    次のように置き換えます。

    • ARCHIVE_NAME: 作成するアーカイブの名前。例: app.tar.gz
    • APPLICATION_PATH: ローカル ファイル システム上のアプリケーションの場所。例: ~/my-application現在の作業ディレクトリをアーカイブするには、この値を * に設定します。
  3. アプリケーション アーカイブを Cloud Storage にアップロードします。

    gcloud storage cp ARCHIVE_NAME gs://BUCKET_NAME
    

    次のように置き換えます。

    • ARCHIVE_NAME: 以前に作成したアーカイブのローカルパス。例: app.tar.gz
    • BUCKET_NAME: 以前に作成したバケットの名前。例: my-bucket
  4. 次の内容の新しいファイルを service.yaml という名前で作成します。

    apiVersion: serving.knative.dev/v2
    kind: Service
    metadata:
     name: SERVICE_NAME
    spec:
     template:
       metadata:
         annotations:
           run.googleapis.com/sources: '{"": "gs://BUCKET_NAME/ARCHIVE_NAME"}'
           run.googleapis.com/base-images: '{"": "BASE_IMAGE"}'
       spec:
         containers:
         - image: scratch
           command:
           - COMMAND
           args:
           - ARG1
           - ARG-N
         runtimeClassName: run.googleapis.com/linux-base-image-update
    

    次のように置き換えます。

    • SERVICE_NAME: Cloud Run サービスの名前。サービス名は 49 文字以下で、リージョンとプロジェクトごとに一意である必要があります。
    • BUCKET_NAME: 以前に作成したバケットの名前。例: my-bucket
    • ARCHIVE_NAME: 以前に作成したアーカイブのローカルパス。例: app.tar.gz
    • BASE_IMAGE: アプリケーションで使用するランタイム ベースイメージ。例: us-central1-docker.pkg.dev/serverless-runtimes/google-24-full/runtimes/nodejs24
    • COMMAND: コンテナを起動するコマンド。
    • ARG1: コンテナ コマンドに送信する引数。複数の引数を使用する場合は、それぞれを 1 行に 1 つずつ指定します。たとえば、上述の ARG-N のようにします。
  5. 新しいサービスをデプロイします。

    gcloud run services replace service.yaml
    

REST API

REST API:

curl -H "Content-Type: application/json" \
-H "Authorization: Bearer ACCESS_TOKEN" \
-X POST \
-d '{"template": {"containers": [{"command": ["npm"], "args": ["start"], "image": "scratch", "baseImageUri": "google-22/nodejs22", "sourceCode": {"cloudStorageSource": {"bucket": "'GCS_BUCKET_NAME", "object":"ARCHIVE"}}}]}}' \
https://run.googleapis.com/v2/projects/PROJECT_ID/locations/REGION/services?serviceId=SERVICE_NAME

ビルドなしでソースからデプロイする例

このセクションでは、ビルドを使用せずにソースからデプロイする方法の例を示します。

Node.js

Node.js サービスを作成します。

  1. helloworld という名前の新しいディレクトリを作成し、そのディレクトリに移動します。

    mkdir helloworld
    cd helloworld
    
  2. package.json ファイルを作成し、次の内容を追加します。

    {
      "name": "helloworld",
      "description": "Simple hello world sample in Node",
      "version": "1.0.0",
      "private": true,
      "main": "index.js",
      "type": "module",
      "scripts": {
        "start": "node index.js"
      },
      "engines": {
        "node": ">=16.0.0"
      },
      "author": "Google LLC",
      "license": "Apache-2.0",
      "dependencies": {
        "express": "^4.17.1"
      }
    }
    
  3. 同じディレクトリに index.js ファイルを作成し、次の行をコピーします。

    import express from 'express';
    const app = express();
    
    app.get('/', (req, res) => {
      const name = process.env.NAME || 'World';
      res.send(`Hello ${name}!`);
    });
    
    const port = parseInt(process.env.PORT) || 8080;
    app.listen(port, () => {
      console.log(`helloworld: listening on port ${port}`);
    });

    このコードは、PORT 環境変数で定義されたポートをリッスンする基本的なウェブサーバーを作成します。

  4. helloworld ディレクトリで、次のコマンドを実行して、サービスの依存関係をローカルにインストールします。

    npm install
  5. helloworld ディレクトリで、--no-build フラグを使用してサービスをデプロイします。このフラグは、deploy コマンドに Cloud Build のステップをスキップするように指示します。

    gcloud beta run deploy helloworld \
     --source . \
     --region=REGION \
     --no-build \
     --base-image=nodejs24 \
     --command=node \
     --args=index.js
     

    次のように置き換えます。

    • REGION: サービスがデプロイされているリージョン。

Python

Python サービスを作成します。

  1. helloworld という名前の新しいディレクトリを作成し、そのディレクトリに移動します。

    mkdir helloworld
    cd helloworld
    
  2. main.py という名前のファイルを作成し、次のコードを貼り付けます。

    import os
    
    from flask import Flask
    
    app = Flask(__name__)
    
    
    @app.route("/")
    def hello_world():
        """Example Hello World route."""
        name = os.environ.get("NAME", "World")
        return f"Hello {name}!"
    
    
    if __name__ == "__main__":
        app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))

    このコードは、「Hello World」という応答メッセージでリクエストに応答します。HTTP 処理は、コンテナ内の Gunicorn ウェブサーバーによって行われます。ローカルで使用するために直接呼び出された場合、このコードは PORT 環境変数で定義されたポートをリッスンする基本的なウェブサーバーを作成します。

  3. requirements.txt という名前のファイルを作成し、次のコードを貼り付けます。

    Flask==3.0.3
    gunicorn==23.0.0
    Werkzeug==3.0.3
    

    このコードにより、サンプルで必要なパッケージが追加されます。

  4. 依存関係をベンダリングします。

    pip3 install -r requirements.txt --target=./vendor
    
  5. gcloud CLI を使用してサービスをデプロイします。--no-build フラグは、Cloud Build のステップをバイパスするように deploy コマンドに指示します。

    gcloud beta run deploy helloworld \
      --source . \
      --region=REGION \
      --no-build \
      --base-image=python313 \
      --command=python \
      --args=main.py \
      --set-env-vars PYTHONPATH=./vendor
    

REGION は、サービスがデプロイされているリージョンに置き換えます。

トラブルシューティング

このセクションでは、ビルドを使用せずにソースからデプロイする際のトラブルシューティングのヒントを紹介します。

ローカルでの開発

ビルドを使用せずにソースからデプロイすることは、コードまたは実行可能ファイルをベースイメージにマウントすることと似ています。

例:

  1. すべてのコンテンツのコピーを作成します。

    cp -R python/hello-world/ workspace
  2. ソースをマウントした状態で、ベースイメージを root ユーザーとして実行します。ホストマシンから curl を実行する必要がある場合は、必要に応じて -p 8080:8080 を含めることができます。

    docker run -it -v "LOCAL_PATH" -u 0 us-central1-docker.pkg.dev/serverless-runtimes/google-22-full/runtimes/python313 /bin/bash`

    LOCAL_PATH は、ローカル ソース ファイルの場所に置き換えます。

  3. サーバーを実行します。

    python main.py

実行ログ

実行ログは、デプロイの失敗をデバッグする際に役立ちます。Google Cloud コンソールで、[オブザーバビリティ] > [ログ] に移動します。

Cloud Storage へのアクセスが拒否された

Cloud Run サービスが Cloud Storage オブジェクトにアクセスしようとしたときに「権限がありません」というエラーが発生する場合は、Cloud Run サービス アカウントに roles/storage.objectViewer ロールを付与する必要があります。

gcloud projects add-iam-policy-binding PROJECT \
  --member="SERVICE_ACCOUNT" \
  --role="roles/storage.objectViewer"

次のように置き換えます。

  • PROJECT: 実際の Google Cloud プロジェクト ID。
  • SERVICE_ACCOUNT: Cloud Run サービス アカウント。例: service-123@serverless-robot-staging.iam.gserviceaccount.com

ソースからのビルドの自動化

ローカルソースで、バージョニングされていない変更が行われないようにするため、変更を Git リポジトリに push する際に自動的にデプロイすることをおすすめします。これを簡単に行うために、Cloud Run サービスに接続して、継続的なデプロイを構成できます。GitHub リポジトリを Cloud Run に接続することで、Dockerfile の記述やファイルのビルドなしで、ビルドを構成してリポジトリをデプロイできます。

自動ビルドを構成するには、継続的なビルドのページの説明に従って自動化を設定し、Buildpack を使用してソースをビルドするオプションを選択します。

次のステップ

Cloud Run サービスをデプロイした後、次のことを行うことができます。

ソースのデプロイ構成について学びます。

Cloud Build トリガーを使用して Cloud Run サービスのビルドとデプロイを自動化できます。