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

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

このコマンドはバックグラウンドで Google Cloud の Buildpack と Cloud Build を使用して、Docker マシンへのインストール、Buildpack や Cloud Build の設定を行わずに、ソースコードからコンテナ イメージを自動的にビルドします。つまり、上記のコマンドで必要とするのは gcloud builds submit コマンドと gcloud run deploy コマンドだけです。

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

Dockerfile がソースコード ディレクトリにある場合、アップロードしたソースコードはその Dockerfile を使用してビルドされます。ソースコード ディレクトリに Dockerfile が存在しない場合、Google Cloud の buildpack は、使用されている言語を自動的に検出してコードの依存関係を取得し、Google が管理する安全なベースイメージを使用して本番環境に対応したコンテナ イメージを作成します(デプロイするたびに、必要なセキュリティの修正がベースイメージから自動的に取得されます)。

サポートされている言語

Dockerfile を含むソースに加えて、ソースからのデプロイでは以下の言語がサポートされています。

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

この機能の制限事項

  • ソースからのデプロイは Artifact Registry を使用するため、この機能は Artifact Registry でサポートされているリージョンでのみ使用できます。
  • gcloud run deploy --source を使用してソースからデプロイする機能は便利ですが、ビルドを完全にカスタマイズすることはできません。より細かく制御するには、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 を使用してビルドできます。
    • ビルドファイルには、クラスを生成するために必要なすべてのプラグインが含まれています。

始める前に

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

必要なロール

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

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

Compute Engine のデフォルト サービス アカウントに Cloud Build サービス アカウントのロールを付与する

  1. Cloud Run Admin API を有効にします。

    gcloud services enable run.googleapis.com
    

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

  2. Cloud Build がソースを構築できるようにするには、次のコマンドを実行して、Compute Engine のデフォルト サービス アカウントに Cloud Build サービス アカウントのロールを付与します。

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

    PROJECT_NUMBER は Google Cloud プロジェクト番号に、PROJECT_ID は Google Cloud プロジェクト ID に置き換えます。

    プロジェクト番号とプロジェクト ID は、Google Cloud コンソールの [ようこそ] ページで確認できます。

デプロイ

ソースコードからデプロイするには:

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

  2. アプリケーションをビルドしてデプロイします。

    gcloud run deploy SERVICE --source .

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

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

  3. ビルドとデプロイが完了するまで待ちます。完了すると、次のようなメッセージが表示されます。

    Service [my-app] revision [my-app-00000-xxx] has been deployed and is serving 100 percent of traffic. Service URL: https://my-app-texampleq-uc.a.run.app

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

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

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

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

次のステップ

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

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