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 ベースの仮想マシンには、必要な開発ツールがすべて揃っています。永続的なホーム ディレクトリが 5 GB 用意されており、Google Cloud で稼働するため、ネットワークのパフォーマンスと認証が大幅に向上しています。つまり、この 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 コンソール ダッシュボードで調べます。
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"
}
}
最も重要な点は、上記のファイルにはスクリプトを開始するコマンドと、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 をご覧ください。