Compute Engine での Node.js の実行

このチュートリアルの他のセクションでは、Google Cloud Platform で Google App Engine フレキシブル環境を使用してアプリケーションを実行する方法について説明しました。フレキシブル環境は、App Engine から提供される水平方向の自動スケーリングや自動管理などの Platform as a Service(PaaS)機能を利用する場合に適しています。その一方で、アプリケーションを実行するインフラストラクチャをより直接的に制御する方がよい場合もあります。

Google Compute Engine は、このような制御が必要な Node.js アプリケーションを実行するために最適な機能です。Compute Engine では、さまざまなインスタンス タイプ、永続ディスク、さらに高パフォーマンス向けのローカル SSD も提供されます。フレキシブル環境と同様に、Compute Engine では管理対象インスタンス グループが提供され、これを設定して特定の指標を使用することでアプリケーションを自動的にスケーリングすることができます。フレキシブル環境、Compute Engine、およびその他のオプションの詳細については、Google Cloud Platform サービスの概要をご覧ください。

このサンプルはオプションであり、Cloud Platform で利用可能なデプロイ オプションを検討しているユーザーを対象としています。このサンプルでは、次の内容を説明します。

  1. 単一の Compute Engine インスタンスへのアプリケーションのデプロイ。

  2. Compute Engine Managed Instance Groups を使用したアプリケーションの水平スケーリング。

  3. Compute Engine HTTP Load Balancer を使用したトラフィックの処理。

  4. Compute Engine Autoscaler を使用したトラフィックの変更への応答。

このチュートリアルでは、読者が Node.js プログラミングに精通しており、Node.js をインストール済みであることを前提にしています。このチュートリアルは、一連の Google Cloud Platform 上の Node.js スタートガイド シリーズの一部です。前提条件を満たしたら、このチュートリアルの完了には約 30 分かかります。

始める前に

各ステップを完了したら、都度チェックボックスをクリックして完了マークを入れてください。

  1. check_box_outline_blank check_box Google Cloud Platform Console でプロジェクトを作成します。
    プロジェクトをまだ作成していない場合は、今すぐ作成します。プロジェクトを作成すると、デプロイ、アクセス制御、課金、サービスなど、アプリケーションに関するすべての Google Cloud Platform リソースを管理できます。
    1. Cloud Platform Console を開きます。
    2. 上部のプルダウン メニューで、[プロジェクトを作成] を選択します。
    3. [詳細設定を表示] をクリックします。[App Engine の場所] で、米国のロケーションを選択します。
    4. プロジェクトの名前を指定します。
    5. プロジェクト ID をメモしておきます。これはプロジェクト名とは異なる場合があります。プロジェクト ID は、コマンドや設定で使用します。
  2. check_box_outline_blank check_box プロジェクトの課金を有効にして、無料試用に登録します。

    プロジェクトの課金を有効にしていない場合は、今すぐ課金を有効にして、無料試用に登録します。課金を有効にすると、アプリケーションはインスタンスの実行やデータの保存など、課金対象のリソースを利用できます。 無料試用期間中は、どのサービスにも課金されることはありません。

  3. check_box_outline_blank check_box Google Cloud SDK をインストールします。

    Google Cloud SDK をまだインストールしていない場合は、今すぐ Google Cloud SDK をインストールして初期化してください。この SDK には、Google Cloud Platform でのリソースの作成や管理を可能にするツールとライブラリが含まれています。

  4. check_box_outline_blank check_box このリンクをクリックすると Cloud Platform Console にアクセスし、このチュートリアルで使用される API が自動的に有効になります。使用される API は、Google Cloud Datastore API、Google Cloud Pub/Sub API、Google Cloud Storage JSON API、Google Cloud Logging API、Google+ API です。

  5. check_box_outline_blank check_box プロジェクトの Cloud Storage バケットを作成します。
    Cloud Storage ではバイナリデータを保存して提供できます。バケットは、バイナリ オブジェクトの高レベルコンテナです。バケットは任意の名前を選択できますが、覚えやすくするためにプロジェクト ID と同じ名前を使用します。
    コマンド プロンプトで、次のように入力します。
    gsutil mb gs://<your-project-id>
    gsutil defacl set public-read gs://<your-project-id>

アプリケーションをダウンロードして実行する

前提条件をすべて満たしたら、Compute Engine にデプロイするサンプル アプリケーションをダウンロードできます。

次の各セクションでは、サンプル アプリケーションを設定してデプロイできるようにする手順を説明します。アプリケーションをローカルで実行すると、正しく設定されているかどうかをデプロイ前に検証できます。

サンプル アプリケーションのクローンの作成

ターミナル ウィンドウに次のコマンドを入力して、サンプル アプリケーションをローカルマシンにコピーします。

git clone https://github.com/GoogleCloudPlatform/nodejs-getting-started.git
cd nodejs-getting-started/7-gce

または、サンプルを ZIP としてダウンロードして、それを展開することもできます。この場合も、コードを Compute Engine にプッシュする必要があるので注意してください。

構成の設定

  1. GCLOUD_PROJECT 環境変数を、Cloud Platform Console に表示されているプロジェクト ID に設定します。

  2. CLOUD_BUCKET を Cloud Storage バケット ID に設定します。始める前にの手順に従っている場合、これはプロジェクト ID と同じです。

  3. DATA_BACKEND 環境変数を、構造化データの使用チュートリアルで行った方法と同様に設定します。このチュートリアルをスキップした場合、DATA_BACKEND はデフォルトで datastore となります。

  4. MySQL または MongoDB 環境変数を、構造化データの使用チュートリアルで行った方法と同様に設定します。このチュートリアルをスキップした場合、MySQL または MongoDB 環境変数を設定しないでください。

環境変数を設定する代わりに、この変数を設定する config.json ファイルを作成できます。たとえば、次のようなファイルを作成します。

{
  "GCLOUD_PROJECT": "<your-project-id>",
  "CLOUD_BUCKET": "<your-cloud-bucket>",
  "DATA_BACKEND": "datastore"
}

ローカルのパソコンでのアプリケーションの実行

ローカルのパソコンでアプリケーションを実行します。

  1. 依存関係をインストールします。

    npm install
    
  2. アプリケーションを実行します。

    npm start
    
  3. ウェブブラウザに、次のアドレスを入力します。

    http://localhost:8080

アプリケーションおよび本とカバーのイメージを表示できます。このページはローカルのパソコンで実行しているウェブサーバーにより提供されていますが、データベースとストレージ サービスは Cloud Platform 上でホストされています。

単一インスタンスのデプロイ

単一インスタンスのデプロイ

このセクションでは、Compute Engine 上で実行するアプリケーションの単一インスタンスを作成する手順を説明します。

コードのプッシュ

Compute Engine インスタンスを作成する前に、アプリケーション コードをインスタンスに配置する方法を確保する必要があります。インスタンスが実行したら、複数の方法を使用してコードをインスタンスに配置できます。その 1 つの方法が、Cloud Repository の使用です。すべてのプロジェクトには git レポジトリが含まれており、簡単に Compute Engine インスタンスに使用することができます。インスタンスは、その起動時にコードの最新バージョンをプルできるようになります。これは、アプリケーションの更新に新しいイメージやインスタンスの設定が不要であり便利です。必要な操作は、既存のインスタンスの再起動または新しいインスタンス作成だけです。

コードを Cloud Repository にプッシュするには、次のコマンドを実行します。


git commit -am "Updating configuration"
git config credential.helper gcloud.sh
git remote add cloud https://source.developers.google.com/p/your-project-id/
git push cloud

起動スクリプトの作成

これで、コードが Compute Engine インスタンスからアクセスできる場所に配置されました。次に、インスタンスにコードのダウンロードと実行を指示する必要があります。インスタンスは起動スクリプトを持つことができます。これは、インスタンスが起動または再起動するときに必ず実行されます。次の起動スクリプトを見てみましょう。

set -v

# Talk to the metadata server to get the project id
PROJECTID=$(curl -s "http://metadata.google.internal/computeMetadata/v1/project/project-id" -H "Metadata-Flavor: Google")

# Install logging monitor. The monitor will automatically pick up logs sent to
# syslog.
curl -s "https://storage.googleapis.com/signals-agents/logging/google-fluentd-install.sh" | bash
service google-fluentd restart &

# Install dependencies from apt
apt-get update
apt-get install -yq ca-certificates git nodejs build-essential supervisor

# Install nodejs
mkdir /opt/nodejs
curl https://nodejs.org/dist/v4.2.2/node-v4.2.2-linux-x64.tar.gz | tar xvzf - -C /opt/nodejs --strip-components=1
ln -s /opt/nodejs/bin/node /usr/bin/node
ln -s /opt/nodejs/bin/npm /usr/bin/npm

# Get the application source code from the Google Cloud Repository.
# git requires $HOME and it's not set during the startup script.
export HOME=/root
git config --global credential.helper gcloud.sh
git clone https://source.developers.google.com/p/$PROJECTID /opt/app

# Install app dependencies
cd /opt/app/7-gce
npm install

# Create a nodeapp user. The application will run as this user.
useradd -m -d /home/nodeapp nodeapp
chown -R nodeapp:nodeapp /opt/app

# Configure supervisor to run the node app.
cat >/etc/supervisor/conf.d/node-app.conf << EOF
[program:nodeapp]
directory=/opt/app/7-gce
command=npm start
autostart=true
autorestart=true
user=nodeapp
environment=HOME="/home/nodeapp",USER="nodeapp",NODE_ENV="production"
stdout_logfile=syslog
stderr_logfile=syslog
EOF

supervisorctl reread
supervisorctl update

# Application should now be running under supervisor

この起動スクリプトは、次の操作を行います。

  1. Google Cloud Logging エージェントをインストールします。このエージェントは、syslog からログを自動的に収集します。

  2. Node.js および Supervisor をインストールします。 Supervisor は、アプリケーションをデーモンとして実行するために使用されます。

  3. Cloud Repository からアプリケーション ソースコードのクローンを作成して、必要な依存関係をすべてインストールします。

  4. Supervisor を設定してアプリケーションを実行します。Supervisor により、アプリケーションが予期せずに終了した場合や管理者やその他のプロセスにより強制終了された場合に、アプリケーションが確実に再起動するようになります。また、Supervisor はアプリケーションの stdoutstderr を syslog に送信して、Cloud Logging により収集されるようにします。

インスタンスの作成

これで、アプリケーションを Cloud Repository に配置してインスタンスと起動スクリプトからアクセスできるようになりました。次に、インスタンスを作成します。ターミナル ウィンドウで、次のコマンドを入力します。

gcloud compute instances create my-app-instance \
    --machine-type=g1-small \
    --image=debian-8 \
    --scopes userinfo-email,cloud-platform \
    --metadata-from-file startup-script=gce/startup-script.sh \
    --zone us-central1-f \
    --tags http-server

このコマンドは新しいインスタンスを作成し、Cloud Platform サービスにアクセスできるようにして、指定した起動スクリプトを使用できるようにします。

インスタンスが起動スクリプトを実行するには、数分かかります。次のコマンドを使用して、インスタンスの進捗を確認できます。

gcloud compute instances get-serial-port-output my-app-instance --zone us-central1-f

起動スクリプトが完了すると、ターミナル ウィンドウのステータス情報の最後にメッセージ Finished running startup script が表示されます。

インスタンスが起動スクリプトの実行を完了したら、次のコマンドを使用してファイアウォール ルールを作成して、インスタンスへのトラフィックを許可します。

gcloud compute firewall-rules create default-allow-http-8080 \
    --allow tcp:8080 \
    --source-ranges 0.0.0.0/0 \
    --target-tags http-server \
    --description "Allow port 8080 access to http-server"

ターミナル ウィンドウに次のコマンドを入力して、インスタンスの外部 IP アドレスを取得できます。

gcloud compute instances list

これで、http://<your-instance-ip>:8080 にアクセスするとアプリケーションが実行していることがわかります。

インスタンス名は my-app-instance です。

インスタンスの管理および監視

インスタンスを作成したので、Google Cloud Platform Console を使用してインスタンスを管理および監視できます。

[コンピュート] -> [Compute Engine] セクションに、実行しているすべてのインスタンスが表示されます。ここで、実行している任意のインスタンスを修正、削除したり、インスタンスにアクセスできます。また、SSH を使用してインスタンスに接続できます。このコンソールから新規インスタンスを直接作成することもできます。

[監視] -> [ログ] セクションには、Compute Engine リソースにより生成されたすべてのログが表示されます。Google Cloud Logging が自動的に設定され、syslog などのさまざまな共通サービスからログが収集されます。

複数のインスタンスによる水平スケーリング

管理対象インスタンスによる複数インスタンスのデプロイ

Compute Engine では、水平スケーリングを容易に行うことができます。管理対象インスタンス グループと Compute Engine Autoscaler を使用すると、Compute Engine は必要に応じてアプリケーションのインスタンスを自動的に作成できます。また、需要が低いときには自動的にインスタンスをシャットダウンできます。HTTP ロードバランサを設定して、管理対象インスタンス グループ内のインスタンスにトラフィックを分散できます。

管理対象インスタンス グループの作成

管理対象インスタンス グループは、同じインスタンス テンプレートに基づいた同種インスタンスの単純なグループです。インスタンス テンプレートは、ソースイメージ、ディスクサイズ、スコープ、任意のメタデータ(例: 起動スクリプト)など、各種の設定を定義します。

インスタンス グループを作成する前に、テンプレートを作成します。インスタンス グループは、このテンプレートを使用して新規インスタンスを作成します。これは、単一インスタンスを作成する場合ととてもよく似ています。以下のコマンドを実行します。

gcloud compute instance-templates create $TEMPLATE \
  --image $IMAGE \
  --machine-type $MACHINE_TYPE \
  --scopes $SCOPES \
  --metadata-from-file startup-script=$STARTUP_SCRIPT \
  --tags $TAGS

テンプレートを作成したので、グループを作成します。

gcloud compute instance-groups managed \
  create $GROUP \
  --base-instance-name $GROUP \
  --size $MIN_INSTANCES \
  --template $TEMPLATE \
  --zone $ZONE

インスタンス グループの作成後に、--size パラメータで指定された数のインスタンスが作成されます。個々のインスタンスの作成には、一定の時間がかかります。いずれかのインスタンスが削除されると、新しいインスタンスが自動的に作成されて置き換えられます。

起動スクリプトの実行が終了すると、それぞれのインスタンスの外部 IP アドレスを使用して、ポート 8080 を介してインスタンスに個別にアクセスできます。各インスタンスの外部 IP アドレスは、次のコマンドを入力することで確認できます。

gcloud compute instances list

管理対象インスタンスには、同じ接頭辞 my-app を使用して名前が付けられます。この接頭辞は、前述のコマンドの --base-instance-name パラメータを使用して指定します。

ロードバランサの作成

個々のインスタンスへのアクセスは、テストやデバッグに適しています。しかし、ウェブ トラフィックを処理するためには、ロードバランサを使用してトラフィックを使用可能なインスタンスに送信することが推奨されます。ロードバランサを作成するには、いくつかの手順を実行します。

ヘルスチェックの作成

ロードバランサは、ヘルスチェックを使用してどのインスタンスがトラフィックを処理できるかを決定します。ヘルスチェックを作成して、そのリクエストパスとポートを指定して実行するには、次のコマンドを実行します。

gcloud compute http-health-checks create ah-health-check \
  --request-path /_ah/health \
  --port 8080

バックエンド サービスを作成

バックエンド サービスは、負荷分散されたトラフィックのターゲットとして機能します。これにより、トラフィックの送信先インスタンス グループと使用するヘルスチェックが定義されます。サービスを作成するには、次の手順に従います。

  1. HTTP ロードバランサは、http サービスを捜してトラフィックの送信先ポートを認識します。既存のインスタンス グループで、ポート 8080 に名前 http を指定します。

    gcloud compute instance-groups managed set-named-ports \
        $GROUP \
        --named-port http:8080 \
        --zone $ZONE

  2. サービスとヘルスチェックを作成します。

    gcloud compute backend-services add-backend $SERVICE \
      --instance-group $GROUP \
      --zone $ZONE

URL マップとプロキシの作成

URL マップは、どの URL がどのバックエンド サービスの送信先であるかを定義します。このサンプルでは、すべてのトラフィックが 1 つのバックエンド サービスで処理されます。複数の地域またはグループ間でリクエストを負荷分散する場合、複数のバックエンド サービスを作成できます。

  1. 次のコマンドを実行してマップを作成します。

    gcloud compute url-maps create $SERVICE-map \
      --default-service $SERVICE

  2. プロキシはトラフィックを受信して、URL マップを使用してバックエンド サービスに転送します。次のコマンドを使用してプロキシを作成します。

    gcloud compute target-http-proxies create $SERVICE-proxy \
      --url-map $SERVICE-map

グローバル転送ルールの作成

グローバル転送ルールは、パブリック IP アドレスとポートをプロキシに関連付けます。次のコマンドを実行してルールを作成します。

gcloud compute forwarding-rules create $SERVICE-http-rule \
  --global \
  --target-http-proxy $SERVICE-proxy \
  --port-range 80

これで負荷分散の設定は完了です。

オートスケーラーの設定

この時点で、ロードバランサによりトラフィックは正常に稼働しているすべてのインスタンスにわたって確実に分散されます。しかし、これらのインスタンスが処理できない過剰なトラフィックが生じた場合にはどうなるでしょうか。手動でインスタンスをさらに追加する必要があるかもしれません。それよりも、Compute Engine Autoscaler を設定すると、トラフィックの需要に応じてインスタンスが自動的に作成および削除されます。

以下のコマンドを実行します。

gcloud compute instance-groups managed set-autoscaling \
  $GROUP \
  --max-num-replicas $MAX_INSTANCES \
  --target-load-balancing-utilization $TARGET_UTILIZATION \
  --zone $ZONE

上記のコマンドは管理対象インスタンス上にオートスケーラーを作成します。これにより、最大 10 個のインスタンスまで自動的にスケーリングが行われます。ロードバランサの使用率が 50% を超えるとインスタンスが追加され、使用率が 50% を下回るとインスタンスが削除されます。

ファイアウォール ルールを作成する

単一インスタンスの場合と同様に、ファイアウォールを開いてインスタンスへのポート 8080 HTTP トラフィックを許可する必要があります。

gcloud compute firewall-rules create default-allow-http-8080 \
    --allow tcp:8080 \
    --source-ranges 0.0.0.0/0 \
    --target-tags http-server \
    --description "Allow port 8080 access to http-server"

アプリケーションの表示

転送ルールの作成後、設定が反映されてトラフィックがインスタンスにルーティングされるまで数分かかることがあります。進捗を確認するには、次のコマンドを実行します。

gcloud compute backend-services get-health my-app-service

少なくとも 1 つのインスタンスで HEALTHY が報告されたら、ロードバランサの転送 IP アドレスを取得します。次のコマンドを入力します。

gcloud compute forwarding-rules list --global

転送ルールの IP アドレスは IP_ADDRESS 列に表示されます。ブラウザで、リストの IP アドレスにアクセスします。

アプリケーションは、負荷分散され、オートスケーリングされた Google Cloud Platform 上で実行しています。

デプロイの管理と監視

複数インスタンスの管理は、単一インスタンスの管理と同様に簡単です。以前と同様に、Cloud Platform Console を使用して 1 つのインスタンス、管理対象インスタンス グループ、ロードバランサ、オートスケーリングを監視および管理できます。

インスタンス グループとオートスケーリング設定の管理は、[コンピュート] -> [Compute Engine] -> [インスタンス グループ] セクションを使用して行うことができます。

URL マップやバックエンド サービスなどの負荷分散設定の管理は、[コンピュート] -> [Compute Engine] -> [HTTP 負荷分散] セクションを使用して行うことができます。

デプロイと解除のスクリプト

サンプル アプリケーションには、Compute Engine へのデプロイの説明に役立つ 2 つのスクリプトが含まれています。

  1. gce/deploy.sh という名前のスクリプトは、複数のインスタンスによる水平スケーリング セクションで説明されている、オートスケーリングおよび負荷分散されたアプリケーションの完全なデプロイを実行します。

  2. gce/teardown.sh という名前のスクリプトは、deploy.sh スクリプトにより作成されたすべてのリソースを削除できます。これにより、プロジェクトは元の状態に戻り、以降の課金が回避されます。この手順を手動で行う場合、すべてのリソースが正しく削除されるようにスクリプトを調節する必要がある場合があるので注意してください。

クリーンアップ

チュートリアルが終了し、割り当てたリソースをクリーンアップするには、クリーンアップをご覧ください。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...