1. 始める前に

Cloud Run は、HTTP リクエストを介して呼び出せるステートレスなコンテナを実行できるマネージド型のコンピューティング プラットフォームです。Cloud Run はサーバーレスです。インフラストラクチャ管理が不要なため、最も重要な作業である優れたアプリの構築に集中できます。Knative をベースに構築されているため、Cloud Run(フルマネージド)または Cloud Run for Anthos のいずれかを使用してコンテナを実行できます。この Codelab の目標は、コンテナ イメージをビルドして Cloud Run にデプロイすることです。
前提条件
なし
2. 設定と要件
セルフペース型の環境設定
- Cloud Console にログインし、新しいプロジェクトを作成するか、既存のプロジェクトを再利用します(Gmail アカウントまたは G Suite アカウントをお持ちでない場合は、アカウントを作成する必要があります)。
プロジェクト ID を忘れないようにしてください。プロジェクト ID はすべての Google Cloud プロジェクトを通じて一意の名前にする必要があります(上記の名前はすでに使用されているので使用できません)。以降、このコードラボでは PROJECT_ID と呼びます。
- 次に、Google Cloud リソースを使用するために、Cloud Console で課金を有効にする必要があります。
このコードラボを実行しても、費用はほとんどかからないはずです。このチュートリアル以外で請求が発生しないように、リソースのシャットダウン方法を説明する「クリーンアップ」セクションの手順に従うようにしてください。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。
Cloud Shell
Google Cloud はノートパソコンからリモートで操作できますが、ここでは Cloud Shell(Google Cloud 上で動作するコマンドライン環境)を使用します。
この Debian ベースの仮想マシンには、必要な開発ツールがすべて用意されています。仮想マシンは Google Cloud で稼働し、永続的なホーム ディレクトリが 5 GB 用意されているため、ネットワークのパフォーマンスと認証が大幅に向上しています。つまり、この Codelab に必要なのはブラウザだけです(Chromebook でも動作します)。
- Cloud Console から Cloud Shell を有効にするには、[Cloud Shell をアクティブにする]
をクリックします(環境のプロビジョニングと接続に若干時間を要します)。
Cloud Shell に接続すると、すでに認証は完了しており、プロジェクトに各自の PROJECT_ID が設定されていることがわかります。
gcloud auth list
コマンド出力
Credentialed accounts: - <myaccount>@<mydomain>.com (active)
gcloud config list project
コマンド出力
[core] project = <PROJECT_ID>
なんらかの理由でプロジェクトが設定されていない場合は、次のコマンドを実行します。
gcloud config set project <PROJECT_ID>
PROJECT_ID が見つからない場合は、設定手順で使用した ID を確認するか、Cloud Console ダッシュボードで検索します。
Cloud Shell では、デフォルトで環境変数もいくつか設定されます。これらの変数は、以降のコマンドを実行する際に有用なものです。
echo $GOOGLE_CLOUD_PROJECT
コマンド出力
<PROJECT_ID>
- 最後に、デフォルトのゾーンとプロジェクト構成を設定します。
gcloud config set compute/zone us-central1-f
さまざまなゾーンを選択できます。詳細については、リージョンとゾーンをご覧ください。
Cloud Run API を有効にします。
Cloud Shell で、Cloud Run API を有効にします。
gcloud services enable run.googleapis.com
成功すると次のようなメッセージが表示されます。
Operation "operations/acf.cc11852d-40af-47ad-9d59-477a12847c9e" finished successfully.
3. サンプルアプリを作成する
HTTP リクエストに応答するシンプルな Express ベースの Node.js アプリを構築します。
アプリをビルドするには、Cloud Shell を使用して helloworld-nodejs という名前の新しいディレクトリを作成し、そのディレクトリに移動します。
mkdir helloworld-nodejs cd helloworld-nodejs
次の内容の package.json ファイルを作成します。
{
"name": "cloudrun-helloworld",
"version": "1.0.0",
"description": "Simple hello world sample in Node",
"main": "index.js",
"scripts": {
"start": "node index.js"
},
"author": "",
"license": "Apache-2.0",
"dependencies": {
"express": "^4.17.1"
}
}
上記のファイルで特に重要なのは、start スクリプトのコマンドと、Express ウェブ アプリ フレームワークへの依存関係が含まれている点です。
次に、同じディレクトリに index.js ファイルを作成し、次の内容をコピーします。
const express = require('express');
const app = express();
app.get('/', (req, res) => {
console.log('Hello world received a request.');
const target = process.env.TARGET || 'World';
res.send(`Hello ${target}!`);
});
const port = process.env.PORT || 8080;
app.listen(port, () => {
console.log('Hello world listening on port', port);
});
このコードは、PORT 環境変数で定義されたポートをリッスンする基本的なウェブサーバーを作成します。これでアプリはコンテナ化、テスト、Container Registry へのアップロードの準備が整いました。
4. アプリをコンテナ化して Container Registry にアップロードする
サンプルアプリをコンテナ化するには、ソースファイルと同じディレクトリに Dockerfile という名前の新しいファイルを作成し、次の内容をコピーします。
# Use the official lightweight Node.js 12 image.
# https://hub.docker.com/_/node
FROM node:12-slim
# Create and change to the app directory.
WORKDIR /usr/src/app
# Copy application dependency manifests to the container image.
# A wildcard is used to ensure both package.json AND package-lock.json are copied.
# Copying this separately prevents re-running npm install on every code change.
COPY package*.json ./
# Install production dependencies.
RUN npm install --only=production
# Copy local code to the container image.
COPY . ./
# Run the web service on container startup.
CMD [ "npm", "start" ]
次に、Dockerfile を含むディレクトリから次のコマンドを実行し、Cloud Build を使用してコンテナ イメージをビルドします。
gcloud builds submit --tag gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld
$GOOGLE_CLOUD_PROJECT は、Cloud Shell で実行するときに Google Cloud プロジェクト ID を含む環境変数です。gcloud config get-value project を実行して取得することもできます。
レジストリに push されると、イメージ名(gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld)を含む SUCCESS メッセージが表示されます。イメージは Container Registry に保存され、必要に応じて再利用できます。
現在のプロジェクトに関連付けられているすべてのコンテナ イメージを一覧表示するには、次のコマンドを使用します。
gcloud container images list
Cloud Shell からローカルでアプリを実行してテストする場合は、次の標準の docker コマンドを使用してアプリを起動できます。
docker run -d -p 8080:8080 gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld
Cloud Shell で、[ウェブでプレビュー]
をクリックし、[ポート 8080 でプレビュー] を選択します。

ブラウザ ウィンドウが開き、「Hello World!」と表示されます。

curl localhost:8080 を使用することもできます。
5. Cloud Run にデプロイする
コンテナ化されたアプリを Cloud Run にデプロイするには、次のコマンドを使用します(ビルドしたアプリの正しいイメージ名に調整するか、gcr.io/cloudrun/hello ビルド済みイメージを使用してください)。
gcloud run deploy helloworld \ --image gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld \ --platform managed \ --region us-central1 \ --allow-unauthenticated
--allow-unauthenticated デプロイ オプションを使用すると、認証なしでアプリにアクセスできます。--platform managed \ デプロイ オプションは、Anthos を介した Kubernetes インフラストラクチャではなく、フルマネージド環境をリクエストしていることを意味します。
デプロイが完了するまで少しお待ちください。完了すると、コマンドラインにサービス URL が表示されます。
Service [helloworld] revision [helloworld-00001] has been deployed and is serving traffic at https://helloworld-wdl7fdwaaa-uc.a.run.app
ウェブブラウザでこのサービス URL を開くと、デプロイしたコンテナにアクセスできます。

Cloud Run は、受信したリクエストに応じてコンテナ イメージを自動的に水平方向にスケールアップし、リクエスト数が減少すると自動的にスケールダウンします。料金は、リクエストの処理中に使用した CPU、メモリ、ネットワークに対してのみ発生します。
6. クリーンアップ
サービスを使用していない場合、Cloud Run の利用料金は発生しませんが、ビルドしたコンテナ イメージを保存していると課金される場合があります。
課金されないようにするには、Google Cloud プロジェクトを削除して、そのプロジェクトで使用されているすべてのリソースへの課金を停止するか、次のコマンドを使用して helloworld イメージを削除します。
gcloud container images delete gcr.io/$GOOGLE_CLOUD_PROJECT/helloworld
この Cloud Run サービスを削除するには次のコマンドを使用します。
gcloud run services delete helloworld \ --platform managed \ --region us-central1
7. 完了
おめでとうございます!コンテナ イメージにパッケージ化されたアプリを Cloud Run にデプロイしました。
詳細
次のステップとして、クイックスタート: Cloud Run for Anthos on Google Cloud へのデプロイをご覧ください。
Cloud Run に適したステートレス HTTP コンテナをコードソースからビルドして Container Registry に push する方法の詳細については、次のリソースをご覧ください。
基盤となるオープンソース プロジェクトである Knative の詳細については、Knative をご覧ください。