Node.js で Cloud Run を使用してコンテナをデプロイして実行する

Cloud Run は、マネージド型のコンピューティング プラットフォームで、HTTP リクエスト経由で呼び出し可能なステートレス コンテナを実行できます。Cloud Run はサーバーレスです。インフラストラクチャ管理が一切不要なため、最も重要な作業であるアプリケーションの構築に集中できます。Knative をベースに構築されているため、Cloud Run(フルマネージド)または Cloud Run for Anthos のいずれかを使用してコンテナを実行できます。この Codelab の目標は、コンテナ イメージをビルドして Cloud Run にデプロイすることです。

前提条件

なし

セルフペース型の環境設定

Google アカウント(Gmail または Google Apps)をお持ちでない場合は、1 つ作成する必要があります。Google Cloud Platform のコンソール(console.cloud.google.com)にログインし、新しいプロジェクトを作成します。

Screenshot from 2016-02-10 12:45:26.png

プロジェクト ID を忘れないようにしてください。プロジェクト ID はすべての Google Cloud プロジェクトを通じて一意の名前にする必要があります(上記の名前はすでに使用されているので使用できません)。以降、このコードラボでは PROJECT_ID と呼びます。

次に、Google Cloud リソースを使用するために、Cloud Console で課金を有効にする必要があります。

この Codelab の操作をすべて行っても、費用は数ドル程度です。ただし、その他のリソースを使いたい場合や、実行したままにしておきたいステップがある場合は、追加コストがかかる可能性があります(このドキュメントの最後にある「クリーンアップ」セクションをご覧ください)。

Google Cloud Platform の新規ユーザーは、300 ドル分の無料トライアルをご利用いただけます。

Cloud Shell

Google Cloud はノートパソコンからリモートで操作できますが、ここでは Cloud Shell(Google Cloud 上で動作するコマンドライン環境)を使用します。

この Debian ベースの仮想マシンには、必要な開発ツールがすべて用意されています。永続的なホーム ディレクトリが 5 GB 用意されており、Google Cloud で稼働します。そのため、ネットワークのパフォーマンスと認証機能が大幅に向上しています。つまり、この Codelab に必要なのはブラウザだけです(Chromebook でも動作します)。

Google Cloud Shell を有効にするには、デベロッパー コンソールの右上にあるボタンをクリックします(環境のプロビジョニングと接続に若干時間を要します)。

activateCloudShell.png

[Cloud Shell を起動] ボタンをクリックします。

Screen Shot 2017-06-14 at 10.13.43 PM.png

Cloud Shell に接続すると、すでに認証は完了しており、プロジェクトに各自の PROJECT_ID が設定されていることがわかります。

gcloud auth list

コマンド出力

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
gcloud config list project

コマンド出力

[core]
project = <PROJECT_ID>

Cloud Shell では、デフォルトで環境変数もいくつか設定されます。これらの変数は、以降のコマンドを実行する際に有用なものです。

echo $GOOGLE_CLOUD_PROJECT

コマンド出力

<PROJECT_ID>

なんらかの理由でプロジェクトが設定されていない場合は、次のコマンドを実行します。

gcloud config set project <PROJECT_ID>

PROJECT_ID が見つからない場合は、設定手順で使用した ID を確認するか、コンソールのダッシュボードで検索します。

Project_ID.png

重要: 最後に、デフォルトのゾーンとプロジェクト構成を設定します。

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.

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 へのアップロードの準備が整いました。

サンプルアプリをコンテナ化するには、ソースファイルと同じディレクトリに 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 を使用することもできます。

コンテナ化されたアプリを 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、メモリ、ネットワークに対してのみ発生します。

サービスが使用されていない場合、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

これで、コンテナ イメージにパッケージ化されたアプリを Cloud Run にデプロイしました。

詳細

次のステップとして、クイックスタート: Cloud Run for Anthos on Google Cloud へのデプロイをご覧ください。

Cloud Run に適したステートレス HTTP コンテナをコードソースからビルドして Container Registry に push する方法の詳細については、次のリソースをご覧ください。

基盤となるオープンソース プロジェクトである Knative の詳細については、Knative をご覧ください。