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

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

前提条件

該当なし

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

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

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 はノートパソコンからリモートで操作できますが、Google Cloud で動作しているコマンドライン環境である Cloud Shell を使用します。

この 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 を確認するか、コンソール ダッシュボードで確認します。

プロジェクト 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 リクエストに応答するシンプルなエクスプレス ベースの 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 をご覧ください。