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

1. 始める前に

6a5cf23c8e20491f.png

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

前提条件

なし

2. 設定と要件

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

  1. Cloud Console にログインし、新しいプロジェクトを作成するか、既存のプロジェクトを再利用します(Gmail アカウントまたは G Suite アカウントをお持ちでない場合は、アカウントを作成する必要があります)。

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

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

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

このコードラボを実行しても、費用はほとんどかからないはずです。このチュートリアル以外で請求が発生しないように、リソースのシャットダウン方法を説明する「クリーンアップ」セクションの手順に従うようにしてください。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。

Cloud Shell

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

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

  1. Cloud Console から Cloud Shell を有効にするには、[Cloud Shell をアクティブにする] fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q をクリックします(環境のプロビジョニングと接続に若干時間を要します)。

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

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>

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

gcloud config set project <PROJECT_ID>

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

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

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

echo $GOOGLE_CLOUD_PROJECT

コマンド出力

<PROJECT_ID>
  1. 最後に、デフォルトのゾーンとプロジェクト構成を設定します。
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 で、[ウェブでプレビュー] 170b7a95be8c6296.png をクリックし、[ポート 8080 でプレビュー] を選択します。

3618ca3a4a135570.png

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

a0307f34cacf9e6a.png

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 を開くと、デプロイしたコンテナにアクセスできます。

63260b4d3aee42b8.png

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 をご覧ください。