Cloud Run は関数の直接デプロイをサポートしていますが、Google Cloud の Buildpack を使用して関数をコンテナ イメージにビルドし、このコンテナ イメージを Cloud Run にデプロイすることもできます。
関数をコンテナにビルドする一般的なユースケースには、次のようなものがあります。
- 継続的インテグレーションと継続的デリバリー: デベロッパーが関数コードを作成してソース リポジトリに push すると、CI / CD システムが関数をコンテナに自動的にビルドし、テストを実行して、ステージング環境に自動的にデプロイします。
- Infrastructure as Code: YAML または Terraform を使用して管理される Cloud Run リソースは、コンテナ イメージの URL を参照します。デベロッパーが記述した関数コードは、コンテナ イメージにビルドする必要があります。
このページでは、次の 2 つの方法で Cloud Run functions のビルドプロセスを正確に複製する方法について説明します。
- packCLI を使用する
- リモート ビルドシステムとして Cloud Build を使用する
関数のエントリ ポイント
Buildpack を使用して関数を作成する手順は以下のとおりです。
- Functions Framework ライブラリを組み込みます。 
- GOOGLE_FUNCTION_TARGET環境変数に、エントリポイントとして使用する関数の名前を設定します。これを行うには、ソースコードと同じフォルダに- project.tomlを含めます。- project.tomlファイルは、次の構成でなければなりません。
[[build.env]]
    name = "GOOGLE_FUNCTION_TARGET"
    value =  "ENTRY_POINT"
ENTRY_POINT は、関数メソッドに置き換えます。
Cloud Run functions で環境変数を使用する方法については、Cloud Run functions サービスを構成するをご覧ください。
ビルダー
Cloud Run functions は、Google Cloud の Buildpack で管理され、公開されているベースイメージ上に作成されます。
ビルダーは、Buildpack とオペレーティング システム パッケージ(スタック)で構成されるイメージです。ビルダーは、関数のソースコードを実行中のコンテナに変換するために使用されます。
サポートされている Google Cloud Buildpack のビルダーのリストから選択できます。
pack を使用して作成する
Pack は、ビルドパックの使用をサポートするために CNB プロジェクトによって管理されている CLI ツールです。pack CLI を使用して、ローカルで関数をコンテナ イメージにビルドします。
始める前に
- Docker Community Edition(CE)をワークステーションにインストールします。packは Docker を OCI イメージ ビルダーとして使用します。
- Pack CLI をインストールします。
- GitHub からサンプル アプリケーションを取得するために Git ソース管理ツールをインストールします。
ローカルで関数を作成する
pack build コマンドを使用して、デフォルトのビルダー --builder=gcr.io/buildpacks/builder を指定し、コンテナ イメージをローカルでビルドします。
pack build --builder=gcr.io/buildpacks/builder IMAGE_NAME
IMAGE_NAME は、コンテナ イメージの名前に置き換えます。
ビルドイメージと実行イメージを拡張して、コンテナ イメージをカスタマイズすることもできます。
サンプル関数をローカルで作成する
次の例は、ローカルでサンプルを作成する方法を示しています。
- ローカルマシンにサンプル リポジトリのクローンを作成します。git clone https://github.com/GoogleCloudPlatform/buildpack-samples.git 
- アプリケーションのサンプルコードが含まれているディレクトリに移動します。
Gocd buildpack-samples/sample-functions-framework-go Javacd buildpack-samples/sample-functions-framework-java-mvn Node.jscd buildpack-samples/sample-functions-framework-node Pythoncd buildpack-samples/sample-functions-framework-python Rubycd buildpack-samples/sample-functions-framework-ruby 
- packを使用してサンプル関数を作成します。- Go- pack build --builder=gcr.io/buildpacks/builder sample-functions-framework-go - Java- pack build --builder gcr.io/buildpacks/builder:v1 sample-functions-java-mvn - Node.js- pack build --builder=gcr.io/buildpacks/builder sample-functions-framework-node - Python- pack build --builder=gcr.io/buildpacks/builder sample-functions-framework-python - Ruby- pack build --builder=gcr.io/buildpacks/builder sample-functions-framework-ruby 
- dockerを使用してイメージを実行します。- Go- docker run -p8080:8080 sample-functions-framework-go - Java- docker run -it -ePORT=8080 -p8080:8080 sample-functions-java-mvn - Node.js- docker run -it -ePORT=8080 -p8080:8080 sample-functions-framework-node - Python- docker run -it -ePORT=8080 -p8080:8080 sample-functions-framework-python - Ruby- docker run -it -ePORT=8080 -p8080:8080 sample-functions-framework-ruby 
- localhost:8080 を参照して、実行中の関数にアクセスします。
リモート ビルドシステムによるビルド
Cloud Build を使用して関数をコンテナ イメージにビルドし、コンテナ リポジトリとして Artifact Registry を使用してイメージの保存とデプロイを行います。
始める前に
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- 
    
    
      
        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
      (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 Cloud Build and Artifact Registry 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.
- 
      Install the 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
      (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 Cloud Build and Artifact Registry 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.
- 
      Install the Google Cloud CLI. 
- 
          外部 ID プロバイダ(IdP)を使用している場合は、まず連携 ID を使用して gcloud CLI にログインする必要があります。 
- 
        gcloud CLI を初期化するには、次のコマンドを実行します。 gcloud init
- 使用する Google Cloud プロジェクトがコンテナ イメージ リポジトリにアクセスできることを確認します。Artifact Registry の Docker リポジトリへのアクセスを構成する手順は次のとおりです。 - 使用する Google Cloud プロジェクトと同じ場所に Docker リポジトリを新規作成します。gcloud artifacts repositories create REPO_NAME \ --repository-format=docker \ --location=REGION --description="DESCRIPTION" - REPO_NAMEは、Docker リポジトリに選択した名前に置き換えます。
- REGIONは、使用する Google Cloud プロジェクトの場所、またはそれに最も近い場所に置き換えます。
- DESCRIPTIONは選択した説明に置き換えます。
 たとえば、「Docker repository」という説明を使用して us-west2にdockerリポジトリを作成するには、次のコマンドを実行します。gcloud artifacts repositories create buildpacks-docker-repo --repository-format=docker \ --location=us-west2 --description="Docker repository" 
- リポジトリが作成されたことを確認します。gcloud artifacts repositories list Docker リポジトリに選択した名前がリストに表示されます。 
 
- 使用する Google Cloud プロジェクトと同じ場所に Docker リポジトリを新規作成します。
- LOCATIONは、コンテナ リポジトリのリージョン名(- us-west2など)に置き換えます。
- PROJECT_IDは、使用する Google Cloud プロジェクトの ID に置き換えます。
- REPO_NAMEは Docker リポジトリの名前に置き換えます。
- IMAGE_NAMEは、コンテナ イメージの名前に置き換えます。
- コンテナ イメージ リポジトリの URI を含む YAML ファイル(ファイル名: cloudbuild.yaml)を作成します。
- LOCATIONは、コンテナ リポジトリのリージョン名(- us-west2など)に置き換えます。
- PROJECT_IDは、使用する Google Cloud プロジェクトの ID に置き換えます。
- REPO_NAMEは Docker リポジトリの名前に置き換えます。
- IMAGE_NAMEは、コンテナ イメージの名前に置き換えます。
- アプリケーションをビルドします。 - 構成ファイルの名前が - cloudbuild.yamlの場合は、次のコマンドを実行します。- gcloud builds submit .
- ローカルマシンにサンプル リポジトリのクローンを作成します。git clone https://github.com/GoogleCloudPlatform/buildpack-samples.git 
- アプリケーションのサンプルコードが含まれているディレクトリに移動します。
Gocd buildpack-samples/sample-functions-framework-go Javacd buildpack-samples/sample-functions-framework-java-mvn Node.jscd buildpack-samples/sample-functions-framework-node Pythoncd buildpack-samples/sample-functions-framework-python Rubycd buildpack-samples/sample-functions-framework-ruby 
- gcloudを使用して、アプリケーションのソースコードを Cloud Build に送信します。- Go- gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/sample-functions-framework-go - Java- gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/sample-functions-framework-gradle - Node.js- gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/sample-functions-framework-node - Python- gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/sample-functions-framework-python - Ruby- gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/sample-functions-framework-ruby - 次のように置き換えます。 - LOCATIONは、コンテナ リポジトリのリージョン名例:- us-west2-docker.pkg.dev
- PROJECT_IDは、使用する Google Cloud プロジェクトの ID に置き換えます。
- REPO_NAMEは Docker リポジトリの名前に置き換えます。
 
- 
    サンプル関数が REPO_NAMEに正常に公開されていることを確認します。gcloud artifacts docker images list LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME 次のように置き換えます。 - LOCATIONは、コンテナ リポジトリのリージョン名(- us-west2など)に置き換えます。
- PROJECT_IDは、使用する Google Cloud プロジェクトの ID に置き換えます。
- REPO_NAMEは Docker リポジトリの名前に置き換えます。
 
- LOCATIONは、コンテナ リポジトリのリージョン名(- us-west2など)に置き換えます。
- IMAGE_NAMEは、コンテナ イメージの名前に置き換えます。
- LANGUAGEは、関数の言語(- nodejsなど)に置き換えます。
- RUNTIME_IDは、ランタイム ID(- nodejs22など)に置き換えます。
- LOCATIONは、コンテナ リポジトリのリージョン名(- us-west2など)に置き換えます。
- PROJECT_IDは、使用する Google Cloud プロジェクトの ID に置き換えます。
- REPO_NAMEは Docker リポジトリの名前に置き換えます。
- IMAGE_NAMEは、コンテナ イメージの名前に置き換えます。
- LANGUAGEは、関数の言語(- nodejsなど)に置き換えます。
- RUNTIME_IDは、ランタイム ID(- nodejs22など)に置き換えます。
- 関数をコンテナにビルドしたら、Cloud Run にデプロイする前にローカルでテストします。詳細については、Cloud Run サービスをローカルでテストするをご覧ください。
- ビルドしたコンテナを Cloud Run にデプロイする。サービスをデプロイするをご覧ください。
- Cloud Build トリガーを使用して Cloud Run サービスのビルドとデプロイを自動化する。継続的デプロイの設定をご覧ください。
リモートで関数を作成する
gcloud builds submit コマンドを使用して、コンテナ イメージをビルドしてリポジトリにアップロードします。
コマンドにコンテナ イメージを指定することも、構成ファイルを使用することもできます。
コマンドで作成する
構成ファイルなしで作成するには、image フラグを指定します。
gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE_NAME
次のように置き換えます。
例:
gcloud builds submit --pack image=us-west2-docker.pkg.dev/my-project-id/my-buildpacks-docker-repo
構成ファイルを使用してビルドする
構成ファイルを使用すると、ビルドコマンドだけでイメージ リポジトリの構成の詳細を定義できます。構成ファイルは YAML ファイル形式にして、pack CLI を使用するビルドステップを含める必要があります。
options: logging: CLOUD_LOGGING_ONLY pool: {} projectId: PROJECT_ID steps: - name: gcr.io/k8s-skaffold/pack entrypoint: pack args: - build - LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE_NAME - --builder - gcr.io/buildpacks/builder:latest - --network - cloudbuild images: - LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE_NAME
次のように置き換えます。
例: リモートでサンプル関数を作成する
次の例では、サンプルをリモートで作成し、コンテナ イメージが Artifact Registry のリポジトリに push されたことを確認する方法を示します。
ベースイメージの自動更新の関数を作成する
関数コンテナは scratch でビルドすることもできます。これにより、Cloud Run のセキュリティの自動更新と組み合わせて使用できます。
Dockerfile
既存のビルド ツールチェーンを使用して、ベースイメージの自動更新と互換性のある関数コンテナ イメージを作成できます。コンテナをゼロからビルドする方法をご覧ください。
pack CLI
pack build IMAGE_NAME \
  --builder LOCATION-docker.pkg.dev/serverless-runtimes/google-22-full/builder/LANGUAGE:latest
  --run-image LOCATION-docker.pkg.dev/serverless-runtimes/google-22/scratch/RUNTIME_ID:latest
次のように置き換えます。
Cloud Build
options:
  logging: CLOUD_LOGGING_ONLY
  pool: {}
projectId: PROJECT_ID
steps:
- name: gcr.io/k8s-skaffold/pack
  entrypoint: pack
  args:
  - build
  - LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE_NAME
  - --builder
  - LOCATION-docker.pkg.dev/serverless-runtimes/google-22-full/builder/LANGUAGE:latest
  - --run-image
  - LOCATION-docker.pkg.dev/serverless-runtimes/google-22/scratch/RUNTIME_ID:latest
  - --network
  - cloudbuild
images:
- LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE_NAME
次のように置き換えます。