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

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"
  }
}

最も重要な点は、上記のファイルにはスクリプトを開始するコマンドと、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 をご覧ください。