このページでは、単純な Hello World アプリケーションを作成してコンテナ イメージにパッケージ化し、コンテナ イメージを Container Registry にアップロードしてから Cloud Run にデプロイする方法について説明します。ここでは、複数の言語でサンプルを示しますが、それ以外の言語を使用することもできます。
このクイックスタートは、Cloud Shell を使ったインタラクティブなチュートリアル形式で提供されています。
または、Qwiklabs のデモアカウントでもこのクイックスタートの手順を利用できます。
始める前に
- Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
-
Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。
- Google Cloud CLI をインストールして初期化します。
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
-
Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。
- Google Cloud CLI をインストールして初期化します。
サンプル アプリケーションを作成する
Cloud Run で動作する Hello World サンプル アプリケーションを作成する手順については、ご使用の言語のタブをクリックしてください。
Go
helloworld
という名前の新しいディレクトリを作成し、そのディレクトリに移動します。mkdir helloworld cd helloworld
go.mod
ファイルを初期化して go モジュールを宣言します。
上述した形式で go.mod
ファイルを直接作成するか、次のようにプロジェクト ディレクトリから初期化できます。
go mod init
main.go
という名前で新しいファイルを作成し、次のコードを貼り付けます。このコードは、
PORT
環境変数で定義されたポートをリッスンする基本的なウェブサーバーを作成します。
これでアプリは完成しました。このアプリをコンテナ化し、Container Registry にアップロードします。
Node.js
helloworld
という名前の新しいディレクトリを作成し、そのディレクトリに移動します。mkdir helloworld cd helloworld
package.json
ファイルを作成し、次の内容を追加します。同じディレクトリに
index.js
ファイルを作成し、次の行をコピーします。このコードは、
PORT
環境変数で定義されたポートをリッスンする基本的なウェブサーバーを作成します。
これでアプリは完成しました。このアプリをコンテナ化し、Container Registry にアップロードします。
Python
helloworld
という名前の新しいディレクトリを作成し、そのディレクトリに移動します。mkdir helloworld cd helloworld
main.py
という名前のファイルを作成し、次のコードを貼り付けます。このコードは、「Hello World」という応答メッセージでリクエストに応答します。HTTP 処理は、コンテナ内の Gunicorn ウェブサーバーによって行われます。ローカルで使用するために直接呼び出された場合、このコードは
PORT
環境変数で定義されたポートをリッスンする基本的なウェブサーバーを作成します。
これでアプリは完成しました。このアプリをコンテナ化し、Container Registry にアップロードします。
Java
Spring Boot アプリケーションを作成します。
コンソールから cURL コマンドと unzip コマンドを使用して、新しい空のウェブ プロジェクトを作成します。
curl https://start.spring.io/starter.zip \ -d dependencies=web \ -d javaVersion=1.8 \ -d bootVersion=2.3.3.RELEASE \ -d name=helloworld \ -d artifactId=helloworld \ -d baseDir=helloworld \ -o helloworld.zip unzip helloworld.zip cd helloworld
これで Spring Boot プロジェクトが作成されます。
Microsoft Windows で上記の cURL コマンドを使用するには、次のいずれかのコマンドラインを使用するか、Spring Initializr(構成のプリロード)を使用してプロジェクトを生成します。
/
マッピングを処理する@RestController
と、NAME 環境変数を指定する@Value
フィールドを追加して、src/main/java/com/example/helloworld/HelloworldApplication.java
のHelloworldApplication
クラスを更新します。application.properties
の PORT 環境変数によって定義されるサーバーポートを設定します。
このコードは、PORT
環境変数で定義されたポートをリッスンする基本的なウェブサーバーを作成します。
これでアプリは完成しました。このアプリをコンテナ化し、Container Registry にアップロードします。
他のフレームワークと一緒に Java を Cloud Run にデプロイする場合は、Spark と Vert.x の Knative サンプルを確認します。
C#
.NET Core SDK 3.1 をインストールします。これは、次のステップで新しいウェブ プロジェクトを作成するためだけに行います。後述する Dockerfile により、すべての依存関係がコンテナに読み込まれます。
コンソールから dotnet コマンドを使用して、新しい空のウェブ プロジェクトを作成します。
dotnet new web -o helloworld-csharp
helloworld-csharp
ディレクトリに移動します。Program.cs
のCreateHostBuilder
定義を更新して、PORT
環境変数で定義されたポートをリッスンするようにします。このコードは、
PORT
環境変数で定義されたポートをリッスンする基本的なウェブサーバーを作成します。Startup.cs
という名前のファイルを作成し、次のコードを貼り付けます。このコードは、「Hello World」という応答メッセージでリクエストに応答します。
これでアプリは完成しました。このアプリをコンテナ化し、Container Registry にアップロードします。
C++
helloworld-cpp
という名前の新しいディレクトリを作成し、そのディレクトリに移動します。mkdir helloworld-cpp cd helloworld-cpp
CMakeLists.txt
という名前で新しいファイルを作成し、次のコードを貼り付けます。cloud_run_hello.cpp
という名前で新しいファイルを作成し、次のコードを貼り付けます。このコードは、
PORT
環境変数で定義されたポートをリッスンする基本的なウェブサーバーを作成します。
これでアプリは完成しました。このアプリをコンテナ化し、Container Registry にアップロードします。
PHP
helloworld-php
という名前の新しいディレクトリを作成し、そのディレクトリに移動します。mkdir helloworld-php cd helloworld-php
index.php
という名前のファイルを作成し、次のコードを貼り付けます。このコードは、「Hello World」という応答メッセージでリクエストに応答します。HTTP 処理は、コンテナ内の Apache ウェブサーバーによって行われます。
これでアプリは完成しました。このアプリをコンテナ化し、Container Registry にアップロードします。
Ruby
helloworld
という名前の新しいディレクトリを作成し、そのディレクトリに移動します。mkdir helloworld cd helloworld
app.rb
という名前のファイルを作成し、次のコードを貼り付けます。このコードは、
PORT
環境変数で定義されたポートをリッスンする基本的なウェブサーバーを作成します。Gemfile
という名前のファイルを作成し、次の内容をコピーします。Bundler 2.0 以降がインストールされていない場合は、Bundler をインストールします。
次のコマンドを実行して
Gemfile.lock
ファイルを生成します。bundle install
これでアプリは完成しました。このアプリをコンテナ化し、Container Registry にアップロードします。
Shell
helloworld-shell
という名前の新しいディレクトリを作成し、そのディレクトリに移動します。mkdir helloworld-shell cd helloworld-shell
script.sh
ファイルを作成し、次の内容を追加します。このシェル スクリプトをすべての受信リクエストに実行するために、このサンプルでは小規模な Go プログラムを使用して基本ウェブサーバーを起動し、
PORT
環境変数で定義されたポートをリッスンします。invoke.go
ファイルを作成し、次の内容を追加します。
これでアプリは完成しました。このアプリをコンテナ化し、Container Registry にアップロードします。
その他
Cloud Run はほとんどの言語をサポートしています。この表にない言語のサンプルについては、以下をご覧ください。
ただし、Cloud Run ではこれらのサンプルを使用しないため、service.yaml
と Docker Hub に関する資料はすべて無視してください。
アプリをコンテナ化して Container Registry にアップロードする
サンプルアプリをコンテナ化するには、ソースファイルと同じディレクトリに Dockerfile
という名前の新しいファイルを作成し、次の内容をコピーします。
Go
.dockerignore
ファイルを追加してコンテナ イメージからファイルを除外します。
Node.js
.dockerignore
ファイルを追加してコンテナ イメージからファイルを除外します。
Python
Python Dockerfile は、PORT
環境変数で定義されたポートをリッスンする Gunicorn ウェブサーバーを起動します。
.dockerignore
ファイルを追加してコンテナ イメージからファイルを除外します。
Java
.dockerignore
ファイルを追加してコンテナ イメージからファイルを除外します。
C#
ローカルの dotnet
ビルド オペレーションで生成されたファイルを Cloud Build へのアップロードから除外するには、サンプルアプリのソースファイルと同じディレクトリに .gcloudignore
ファイルを追加します。
これらの行が .gitignore
ファイルにある場合は、.gitignore
が .gcloudignore
構成のデフォルトのソースであるため、この手順をスキップできます。
docker
CLI を使用して、これらの行をローカル コンテナ ビルド用の .dockerignore
ファイルにコピーします。
C++
C++ Dockerfile は、PORT
環境変数で定義されたポートでリッスンするアプリケーションを開始します。
PHP
PHP Dockerfile は、PORT
環境変数で定義されたポートをリッスンする Apache ウェブサーバーを起動します。
.dockerignore
ファイルを追加してコンテナ イメージからファイルを除外します。
Ruby
.dockerignore
ファイルを追加してコンテナ イメージからファイルを除外します。
Shell
その他
Cloud Run はほとんどの言語をサポートしています。この表にない言語の Dockerfiles については、以下をご覧ください。
ただし、Cloud Run では service.yaml
と Docker Hub のサンプルを使用しないため、これらに関する資料は無視してください。
Dockerfile を含むディレクトリから次のコマンドを実行し、Cloud Build を使用してコンテナ イメージをビルドします。
gcloud builds submit --tag gcr.io/PROJECT-ID/helloworld
PROJECT-ID は、GCP のプロジェクト ID です。gcloud config get-value project
を実行すると取得できます。
成功すると、イメージ名(gcr.io/PROJECT-ID/helloworld
)を含む SUCCESS メッセージが表示されます。イメージは Container Registry に保存され、必要に応じて再利用できます。
Cloud Run へのデプロイ
コンテナ イメージをデプロイするには:
次のコマンドを使用してデプロイします。
gcloud run deploy --image gcr.io/PROJECT-ID/helloworld --platform managed
API を有効にするよう求められたら、「y」と返信して有効にします。
PROJECT-ID は実際の GCP プロジェクト ID に置き換えます。プロジェクト ID を表示するには、
gcloud config get-value project
コマンドを実行します。- サービス名の入力を求められます。Enter キーを押してデフォルト名の
helloworld
を受け入れます。 - リージョンを指定するよう求められます。選択したリージョン(
us-central1
など)を選択します。 - 未認証の呼び出しを許可するように求められます。[
y
] と返信します。
デプロイが完了するまで少しお待ちください。成功すると、コマンドラインにサービス URL が表示されます。
- サービス名の入力を求められます。Enter キーを押してデフォルト名の
ウェブブラウザでこのサービス URL を開き、デプロイしたコンテナにアクセスします。
Cloud Run のロケーション
Cloud Run はリージョナルです。つまり、Cloud Run サービスを実行するインフラストラクチャは特定のリージョンに配置され、そのリージョン内のすべてのゾーンで冗長的に利用できるように Google によって管理されます。
レイテンシ、可用性、耐久性の要件を満たしていることが、Cloud Run サービスを実行するリージョンを選択する際の主な判断材料になります。一般的には、ユーザーに最も近いリージョンを選択できますが、Cloud Run サービスで使用されている他の Google Cloud サービスのロケーションも考慮する必要があります。使用する Google Cloud サービスが複数のロケーションにまたがっていると、サービスの料金だけでなくレイテンシにも影響します。
Cloud Run は、次のリージョンで利用できます。
Tier 1 料金を適用
asia-east1
(台湾)asia-northeast1
(東京)asia-northeast2
(大阪)europe-north1
(フィンランド)europe-west1
(ベルギー)europe-west4
(オランダ)us-central1
(アイオワ)us-east1
(サウスカロライナ)us-east4
(北バージニア)us-west1
(オレゴン)
Tier 2 料金を適用
asia-east2
(香港)asia-northeast3
(ソウル、韓国)asia-southeast1
(シンガポール)asia-southeast2
(ジャカルタ)asia-south1
(ムンバイ、インド)australia-southeast1
(シドニー)europe-west2
(ロンドン、イギリス)europe-west3
(フランクフルト、ドイツ)europe-west6
(チューリッヒ、スイス)northamerica-northeast1
(モントリオール)southamerica-east1
(サンパウロ、ブラジル)us-west2
(ロサンゼルス)us-west3
(ラスベガス)us-west4
(ソルトレイクシティ)
Cloud Run サービスをすでに作成している場合は、Cloud Console の Cloud Run ダッシュボードにリージョンを表示できます。
お疲れさまでした。コンテナ イメージにパッケージ化されたアプリケーションが Cloud Run にデプロイされました。Cloud Run は、受信したリクエストを処理するためにコンテナ イメージを自動的に水平方向にスケールアウトします。リクエスト数が減少すると、インスタンス数がスケールインします。料金は、リクエストの処理中に使用した CPU、メモリ、ネットワークに対してのみ発生します。
クリーンアップ
テスト プロジェクトの削除
サービスが使用されていない場合、Cloud Run の料金は発生しませんが、コンテナ イメージを Container Registry に保存することで課金される場合があります。イメージを削除するか、Cloud プロジェクトを削除してこのような料金が発生しないようにできます。Cloud プロジェクトを削除すると、そのプロジェクト内で使用されているすべてのリソースに対する課金が停止します。
- Cloud Console で [リソースの管理] ページに移動します。
- プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
- ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。
次のステップ
コードソースからコンテナをビルドし、Container Registry に push する方法については、以下をご覧ください。