Node.jsアプリケーションをデプロイするには?

how_to_deploy_nodejs_app

この記事では、Node JSアプリケーションのデプロイ方法を説明します。Nodeの長所と短所、IaaS、PaaS、BaaSなどのデプロイオプションについて説明します。最後に、NodeアプリケーションをBack4appにデプロイします。

Node.jsとは?

Node.jsは、ChromeのV8 JavaScriptエンジン上に構築されたオープンソースでクロスプラットフォームのJavaScriptランタイムである。Nodeは、JavaScript開発者がサーバーサイドのオペレーションをコーディングできるようにすることで、フルスタックを実現することを目指している。使用例としては、サーバーサイドスクリプティング、リアルタイムアプリケーション、ストリーミングウェブアプリケーション、シングルページアプリケーション(SPA)、コラボレーションツール、ウェブゲームなどがある。

Nodeは、非同期I/Oが可能なイベント駆動型アーキテクチャを採用している。JavaScriptをネイティブのマシンコードにコンパイルできるため、非常に高速だ。膨大な量のアクティブな接続を扱うことができ、開発者はスケーラブルで高性能なアプリケーションを簡単に構築できる。

このテクノロジーは2009年、毎年開催されるヨーロッパのJSConfで、開発者のライアン・ダールによって初めて紹介された。すぐにJavaScriptのエコシステムで最も興味深いソフトウェアのひとつとなった。

Nodeの人気は2017年にピークを迎え、現在も高い水準を維持している。IBM、LinkedIn、Microsoft、Netflixなど、多くの数百万企業が使用する最も人気のある開発ツールの1つだ。そのシンプルさと拡張性の高さから、スタートアップを含むあらゆる企業規模に適している。

次の2つのセクションでは、Nodeの長所と短所を掘り下げていきます。

Node.jsの利点

高性能

冒頭で述べたように、NodeはGoogleの高性能JavaScriptエンジンを搭載している。V8は、主にJavaScriptをネイティブのマシンコードにコンパイルするため、電光石火の速さでJavaScriptをコンパイルして実行することができます。

Nodeはまた、JavaScriptがシングルスレッド・プログラミング言語であるにもかかわらず、ノンブロッキングI/Oオペレーションを可能にするイベントループを使用している。このため、市場で最も高速なオプションのひとつとなっている。

スケーラビリティ

Node.jsの主な利点の1つは、その拡張性です。Nodeアプリケーションは、水平方向にも垂直方向にも拡張できます。水平方向のスケーリングは既存のシステムにノードを追加することで達成され、垂直方向のスケーリングは特定のノードにリソースを追加することを意味します。LinkedIn、Netflix、PayPalのような数千万人のユーザーを抱える大企業だけでなく、新興企業にも適している。

Nodeはマイクロサービス・アーキテクチャにも適しており、開発者は継続的デリバリー・パイプラインに適合する小さなコンポーネントを作成し、オンデマンドで簡単に拡張できる。

学びやすい

NodeはJavaScriptをベースにしているため、JavaScriptの基礎をすでに知っている開発者にとっては非常に学習しやすい。急な学習曲線はなく、わずか数週間でマスターできます。Nodeはシンプルなので、あらゆるタイプのプロジェクトに最適です。

市場投入までの時間を短縮

市場投入までの時間は、多くの開発チームにとって不可欠な基準の1つです。誰もが製品をできるだけ早く市場に出したいと考えており、Nodeはまさにそれを可能にします。

Nodeのシンプルさと膨大なnpmパッケージは、市場投入までの時間を劇的に短縮する。GitHubやその他のプラットフォームには、オープンソース化されたプロジェクトがたくさんあり、それらをテンプレートとして使用することで、プロジェクトをできるだけ早く立ち上げることができます。

実戦テスト済みツール

Nodeは、2009年から存在する、テスト済みの成熟したツールである。その安定性は、eBay、Netflix、LinkedInのような数百万人のユーザーを抱える大企業によってテストされています。

Nodeはその素晴らしい特長のため、多くの技術スタックに含まれている(通常はExpressとNoSQLデータベースとの組み合わせ)。Nodeを使った技術スタックには次のようなものがあります:

  • メルン
  • MEAN
  • ダーン

素晴らしいコミュニティ

Node.jsには、Nodeをより良くするためにNodeに貢献し続ける開発者や熱狂的なファンの強力で活発なコミュニティがあります。万が一、問題に行き詰まったり、質問がある場合、助けを求めることができる様々な場所があります。Nodeの人気のため、GitHubですでに作られたソリューションやコードを見つけることは難しくありません。

Node.jsのもうひとつの優れた点は、npm(Node Package Manager)というパッケージ・マネージャーだ。Npmを使えば、開発者は車輪の再発明をする代わりに、既製のJavaScriptパッケージをプッシュして使うことができる。パッケージは、アプリケーションの開発コストと複雑さを大幅に削減することができる。この記事を書いている時点で、130万以上のパッケージがnpm上でホストされている。

Node.jsの限界

複雑な作業におけるパフォーマンスの低下

Node.jsの最大の欠点は、重い計算を必要とするタスクを実行できないことだ。最近の多くのプログラムやアルゴリズムは、最適な結果を得るために並列化を必要とする。すでにご存知のように、Node.jsはシングルスレッドのフロントエンド言語として設計されたJavaScriptをベースにしており、マルチスレッドをサポートしていません。

10.5のアップデートで、Node.jsチームはワーカースレッドという形でマルチスレッドのサポートを展開した。このモジュールにより、開発者はスレッド・プールから追加のスレッドを利用できる。ワーカースレッドがあっても、Nodeはまだ重い計算には適していません。プロジェクトの要件に複雑な計算、重い計算、並列化などが含まれる場合は、他のプログラミング言語を使用した方がよいでしょう。

非同期プログラミング・モデル

Node.jsは非同期プログラミング・モデルを採用している。そのため、コールバックの使用に大きく依存しています。コールバックはバックグラウンドで実行され、(ある時点で)結果を返す関数です。コールバックを使用することで、コードが複雑になり、デバッグが難しくなります。さらに、コールバックを何階層もネストさせると、いわゆる「コールバック地獄」になってしまうかもしれない。

コールバック地獄やその他の非同期プログラミングの問題は、クリーンコードの原則に従うことで簡単に回避できる。

不安定なAPI

Node.jsのもう1つの大きな問題は、アプリケーション・プログラミング・インターフェース(API)の不安定さです。NodeのAPIは、コードの一部を壊してしまうような後方互換性のない変更が頻繁に行われます。その結果、Nodeの開発者は変更に注意し、コードベースが最新のNode.js APIバージョンと互換性があることを確認する必要があります。

図書館の強力なサポート体制がない

JavaScriptには、他のプログラミング言語と比べて優れたライブラリシステムが付属していない。そのため多くの開発者は、画像処理、XMLパース、オブジェクトリレーショナルマッピング(ORM)、データベースの処理など、さまざまな一般的なタスクのサポートを引き受けなければならない。

成長しすぎて未熟なモジュール登録

Nodeには巨大な開発者コミュニティがあり、npmで公開されている何千ものオープンソースモジュールを作っている。この問題は、npmがモジュールのコードが動作し、よく書かれていることを確認するチェックを実装していないことだ。

多くのモジュールがランダムにサポートされなくなったり、新しいNodeバージョンで壊れたりするため、開発者は代替品を探さざるを得なくなる。過去には、npmモジュールの一部がハッキングされ、ウイルスや暗号マイナーが注入されたこともあった。このため、エンタープライズ環境で使用できるモジュールを見つけるのは難しい。

誤解を恐れずに言えば、npmは素晴らしいものだと思うが、それでもランダムなモジュールをインストールするときには注意すべきだ。

Node.jsのデプロイメント・オプション

Node.jsアプリケーションをデプロイする方法は複数ある。一般的には、以下の4つのグループに分けることができます:

  1. 従来のホスティング
  2. インフラストラクチャー・アズ・ア・サービス(IaaS)
  3. サービスとしてのプラットフォーム(PaaS)
  4. サービスとしてのバックエンド(BaaS)

その抽象度に応じて、ピラミッドチャートで表示することができる:

クラウド展開モデル

デプロイオプションは、以下の抽象化レイヤーを処理する:

IaaS vs PaaS vs BaaS

それぞれのグループを見てみよう。従来のホスティングの仕組みはご存じだと思うので省略する。

AWSのようなIaaSサービス

IaaS(Infrastructure as a Service)は、サーバー、ネットワーク、オペレーティング・システム、ストレージなどのコンピューティング・リソースを仮想化環境で提供するクラウド・コンピューティング・サービス・モデルである。これらのクラウドサーバーは通常、高レベルのAPIや高度なダッシュボードを通じて組織に提供され、クライアントはインフラ全体を完全に制御できる。

IaaSは拡張性に優れている。需要に応じて、垂直方向にも水平方向にも容易に拡張できる。IaaSベンダーは通常、使った分だけ支払う従量課金モデルを採用しています。

IaaSは2010年代初頭に登場し、以来、多くの種類のワークロードの標準的な抽象化モデルとなった。マイクロサービスやサーバーレスのような新しいテクノロジーが台頭しても、IaaSは依然として最も人気のあるオプションです。

PaaSやBaaSとは対照的に、IaaSはクラウド上のリソースを最も低いレベルで制御できる。そのため、最も柔軟性の高いクラウド・コンピューティング・モデルとなっている。IaaSの欠点は、アプリケーション、OS、ミドルウェア、データなどの管理はすべて顧客の責任となり、通常多くの時間がかかることだ。

典型的なIaaSの例をいくつか挙げよう:

  • アマゾン ウェブ サービス(AWS)
  • グーグルコンピュートエンジン(GCE)
  • マイクロソフト・アジュール
  • デジタルオーシャン
  • リノード
  • ラックスペース

HerokuのようなPaaSサービス

PaaS(Platform as a Service)とは、クラウド・コンピューティングのサービス・モデルのひとつで、ユーザーがアプリケーションを開発、管理、提供できるクラウド環境を提供するものだ。PaaSには、コンピュータ・リソースの提供に加え、アプリケーションの開発、カスタマイズ、テストのための多くの組み込みツールが付属しています。ほとんどのPaaSベンダーは、数クリックでアプリケーションを立ち上げ、実行できるようにしている!

PaaSを利用することで、ユーザーは基盤となるインフラを管理する代わりに、アプリケーションに集中することができる。PaaSプロバイダーは、サーバー、オペレーティング・システム、サーバー・ソフトウェア、バックアップなどの管理など、多くの重労働を代行してくれる。

PaaSの利点には次のようなものがある:

  • 市場投入までのスピードアップ
  • セキュリティの強化
  • 費用対効果
  • スケーラビリティ
  • 高い可用性
  • 必要なコードが少ない

PaaSの欠点は、ベンダーの能力に依存することになる可能性が高いこと、ロックインのリスクがあること、柔軟性とコントロールが欠如していることだ。しかし、PaaSを利用することで、ユーザーはより速くアプリを構築することができ、管理の負担も軽減される。

PaaSサービスには以下が含まれる:

  • ヘロク
  • AWS Elastic Beanstalk
  • DigitalOceanアプリプラットフォーム
  • Microsoft Azure App Service
  • フライ・プラットフォーム(Fly.io)
  • レンダー

Back4appのようなBaaSサービス

Backend as a Service(BaaS)は、開発のバックエンド側を自動化し、クラウドインフラの面倒を見るプラットフォームだ。その上、ユーザー管理、メール通知、プッシュ通知、クラウドコード機能、ソーシャルメディア統合、ファイルストレージ、決済などの機能を提供する。

これにより開発者は、基盤となるバックエンドやインフラを気にすることなく、コアビジネスとフロントエンドの構築に集中することができる。フロントエンドは通常、BaaSベンダーが提供する専用のAPIやSDKを使って開発する。これにより、アプリの複雑さが軽減され、メンテナンスが容易になる。

BaaSは、IaaSとPaaSのすべての利点を提供すると同時に、バックエンドの抽象化も実現します。BaaSを活用するチームは、市場投入までの時間を大幅に短縮し、エンジニアリング・コストを削減し、必要なエンジニアの数を減らすことができます。

BaaSは、MVP(Minimum Viable Product)の作成、スタンドアロンアプリや少数の統合を必要とするアプリ、ミッションクリティカルではないエンタープライズアプリなど、さまざまなタイプのプロジェクトに利用できる。

BaaSの欠点は、IaaSやPaaSに比べて柔軟性が低いこと、コントロールやカスタマイズのレベルが低いこと、オープンソースでないプラットフォームではロックインの可能性があることだ。

BaaSの例をいくつか挙げる:

  • バック4アプリ
  • AWSアンプリファイ
  • ファイヤーベース
  • パース
  • クラウドキット
  • バックエンドレス

Node.jsのデプロイメント・プロセス

このパートでは、Back4appに注目し、Node JSアプリケーションのビルドとデプロイの方法を学ぶ。

Back4appとは?

Back4appは、市場で 最も優れたオープンソースのBaaS(Backend as a Service)ソリューションの1つです。Back4appは、開発者がウェブアプリケーションやモバイルアプリケーションを迅速に構築できるよう、幅広い機能と利点をユーザーに提供しています。Back4appを使用することで、バックエンドや基盤となるインフラを気にすることなく、コアビジネスに集中することができます。

このソリューションには、機能豊富で使いやすいダッシュボードとコマンドラインインターフェイス(CLI)が付属しています。また、Flutter、React Native、Node.js、Angular、Android、iOSなど、お気に入りのツール用のSDKも提供している!

Back4appの主な特徴は以下の通り:

  • スプレッドシートのようなデータベース
  • RESTおよびGraphQL API
  • ライブクエリ
  • 認証(ソーシャル認証を含む)
  • スケーラブルなホスティング
  • プッシュ通知とEメール通知

機能についての詳細はBack4app Featuresをご覧ください。

Back4appは、どんな規模のアプリにも対応できるシンプルでわかりやすい価格モデルに従っている。Back4appは、プロトタイピングやプラットフォームのテストに最適な無料プラン(クレジットカード不要)を提供している。これには以下が含まれる:

  • 25kのリクエスト
  • 250MBのデータストレージ
  • 1 GBの転送
  • 1 GBのファイルストレージ

Back4appの価格についての詳細は、価格ページをご覧ください。

プロジェクト紹介

シンプルなTODOウェブ・アプリケーションをコーディングし、デプロイする。このウェブアプリケーションは、基本的なCRUD操作(作成、取得、更新、削除)をサポートする予定だ。WebフレームワークのExpressを使用してNode.jsでコーディングし、データストレージはParseで処理し、テンプレートエンジンとしてTwigを使用します。

配備されたアプリを見るにはここをクリック

前提条件

  • Node.jsの基本的な理解
  • Expressの基本的な理解
  • テンプレートエンジンの使用経験
  • データベースとParseJSの基本的な理解

Back4app CLI

以下のステップでは、Back4appのアカウントが必要です。既にお持ちの場合はログインしてください。そうでない場合は無料アカウントにサインアップしてください。

Back4app CLIは、Back4appプラットフォームを操作するためのコマンドラインインターフェイスです。

Mac/Linuxにインストールするには

$ curl https://raw.githubusercontent.com/back4app/parse-cli/back4app/installer.sh | sudo /bin/bash

コマンドは最新のCLIバイナリをダウンロードし、/usr/local/bin/b4aに格納する。

その他のOSについては、公式ドキュメントを参照してください。

CLIを使用するには、アカウントを認証する必要があります。そのためには、まずアカウントキーを生成する必要があります。Back4appのダッシュボードに移動し、ユーザー名(画面右上)をクリックし、”Account Keys “をクリックします:

Back4appアカウントキー

新しいアカウント・キーを追加するには、カスタム・キー名を入力し、「+」を押します。次のステップで必要になるので、キーを控えておいてください:

Back4appアカウントキー

キーの作成に成功したら、ターミナルに戻って実行する:

$ b4a configure accountkey

Input your account key or press ENTER to generate a new one.       
NOTE: on pressing ENTER we'll try to open the url:                 
        "http://dashboard.back4app.com/classic#/wizard/account-key"
in default browser.
Account Key: <YOUR_GENERATED_ACCOUNT_KEY>
Successfully stored account key for: "<YOUR_EMAIL>".

認証がうまくいったことを確認するために、アプリをリストアップしてみてください:

$ b4a list

These are the apps you currently have access to:

私のようにアカウントが新しい場合、アプリは表示されません。

アプリ作成

続いて、Back4appアプリを作ってみよう。

走れ:

$ b4a new

Would you like to create a new app, or add Cloud Code to an existing app?
Type "(n)ew" or "(e)xisting": n
Please choose a name for your Parse app.
Note that this name will appear on the Back4App website,
but it does not have to be the same as your mobile app's public name.
Name: nodejs-back4app
Awesome! Now it's time to set up some Cloud Code for the app: "nodejs-back4app",
Next we will create a directory to hold your Cloud Code.
Please enter the name to use for this directory,
or hit ENTER to use "nodejs-back4app" as the directory name.

Directory Name:
You can either set up a blank project or create a sample Cloud Code project
Please type "(b)lank" if you wish to setup a blank project, otherwise press ENTER: 
Successfully configured email for current project to: "<YOUR_EMAIL>"
Your Cloud Code has been created at /dev/nodejs-back4app.
  1. 新規または既存のアプリを作成:新規
  2. アプリ名を選ぶ:カスタム名を選ぶ
  3. ディレクトリ名:ENTERを押す
  4. 空白またはサンプルのクラウドコードプロジェクト:ENTERを押す

コマンドは次のような構造のディレクトリを作成する:

nodejs-back4app/
├── cloud/
│   └── main.js
├── public/
│   └── index.html
├── .parse.local
└── .parse.project
  1. cloudは、すべてのクラウド・コードと関数のディレクトリです。
  2. publicは、画像やスタイルシートなどの公開ファイル用のディレクトリです。
  3. .parse.localと .parse.projectは、Parseの設定を保存するために使用されます。

main.jsと index.htmlは不要なので削除する。

ウェブホスティング

Node.jsアプリを作成しているので、Back4appのウェブホスティングを有効にしてアプリをホストし、インターネットから一般にアクセスできるようにする必要があります。

ウェブホスティング機能を有効にするには、Back4appのダッシュボードに移動し、アプリを選択し、画面の左側にある “アプリ設定 “をクリックし、次に “サーバー設定 “をクリックします。ウェブホスティングとカスタムドメイン “を検索し、再度 “設定 “をクリックしてください。

Activate Back4app Hosting “をクリックし、サブドメイン名を選びます。私はnodejsback4appを使います:

Back4appウェブホスティング

最後に「保存」をクリックする。

そうすれば、あなたのアプリにアクセスできるようになる:

https://<your_subdomain>.b4a.app/

カスタムドメインをウェブアプリにリンクするのも自由です!

クラウド・コード・ファンクションでエクスプレス

次に、実際のコードに取りかかろう。

ディレクトリをクラウドに変更し、その中にpackage.jsonファイルを作成する:

Back4appはこのファイルを使ってnpm経由でモジュールをダウンロードする。body-parserを追加したのは、後でリクエストを解析するために必要になるからです。

次に、cloudsフォルダにapp.jsという名前のファイルをもうひとつ作る:

このファイルは Express の初期化と設定に使用される。また、次のステップでサニティ・チェックとして使用するエンドポイントも定義した。Back4appが自動的にやってくれるので、アプリを定義したり、依存関係を要求したりする必要はない。

次に、アプリをデプロイする:

$ b4a deploy

Uploading source files
Uploading recent changes to scripts...
Finished uploading files
New release is named v1 (using Parse JavaScript SDK v2.2.25)

このコマンドは、ソースファイルをBack4appにアップロードし、すべての設定を行い、前のセクションで選択したサブドメインでアプリを利用できるようにします。

それが機能することを確認するには、お気に入りのウェブブラウザを開き、アプリに移動します:

https://<your_subdomain>.b4a.app/

# Example
https://nodejsback4app.b4a.app/

次のような反応が返ってくるはずだ:

よくやった!

次のセクションでは、実際のTODOアプリに取りかかる。

ParseJSによるデータベース

TODOアプリのデータベース・モデルを定義しよう。

Back4app dashboardに移動し、画面左側の “Database “を選択します。その後、”Create a new class “をクリックし、名前を “Task "とし、”Public Read and Write enabled “にチェックを入れてください:

Back4appが新しいクラスを作成

次に、以下の列を追加する:

+-----------+-------------+---------------+----------+
| Data type | Name        | Default value | Required |
+-----------+-------------+---------------+----------+
| String    | name        | <leave blank> | yes      |
+-----------+-------------+---------------+----------+
| String    | description | <leave blank> | no       |
+-----------+-------------+---------------+----------+
| Boolean   | isDone      | false         | yes      |
+-----------+-------------+---------------+----------+

アプリ・ロジック

このアプリは以下のエンドポイントを持つことになる:

  1. / タスクのリストを表示する
  2. /タスクを作成する
  3. <ID>はタスクの詳細を表示する。
  4. <ID>/deleteはタスクを削除します。
  5. <ID>/toggleはタスクのステータスを切り替える — done/undone

それを作ろう。

クラウドのコードをよりメンテナンスしやすくするために、2つのファイルに分割する。

  1. app.js— Expressサーバーの初期化と設定
  2. routes.js— エンドポイントとそのロジックを定義する。

モダンなウェブ・アプリケーションを構築するためのさらに良いアプローチは、Model-View-Controller(MVC)アーキテクチャ・パターンを使うことだ。Expressの良いスタートはexpress-generatorを使うことだ。

app.jsの内容を以下のように置き換える:

  1. Twigをデフォルトのビューエンジンに設定します。
  2. ルートはもはやこのファイルではなく、routes.jsで定義される。

次に、routes.jsを作成し、以下のコードを入れる:

上記のすべてのルートを定義し、Parseを使ってデータの操作と保存を行った。見ての通り、Parseの応答を待つ必要があるので、すべてのルートは非同期だ。さらに、何か問題が発生したときのために、ほとんどのコードはtry-catchブロックでラップされている。

ParseJSの詳細については、JavaScriptガイドをご覧ください。

次に、エンドポイントにビュー・テンプレートを添付してみましょう。

cloudsフォルダ内にviewsフォルダを作成し、GitHubのリポジトリからテンプレートファイルをダウンロードしてviewsディレクトリに配置する。

最終的なディレクトリ構造は次のようになるはずだ:

nodejs-back4app/
├── cloud/
│   ├── views/
│   │   ├── base.twig
│   │   ├── create.twig
│   │   ├── error.twig
│   │   ├── index.twig
│   │   └── task.twig
│   ├── app.js
│   ├── routes.js
│   └── package.json
├── public
├── parse.local
└── parse.project

最後に、package.jsonに twingを追加して、Twigサポートを有効にする:

アプリをデプロイする:

$ b4a deploy

Uploading source files
Uploading recent changes to scripts...
Finished uploading files
New release is named v2 (using Parse JavaScript SDK v2.2.25)

これで完了です。数分待ってからウェブアプリにアクセスし、すべてがうまくいくことを確認してください。

公開ファイル

前のセクションで述べたように、Back4appは自動的にpublicフォルダにあるファイルを提供します。テンプレートでそれらを使用するには、Expressの設定を少し変更する必要があります。

app.jsに以下の行を追加する:

そうすれば、テンプレート内で公開ファイルを相対パスで参照することができます:

<img src="/back4app.png" alt="Back4app Logo">

public/back4app.pngにある画像を表示します。

結論

Nodeは2009年のリリース以来、着実に成長し、改良を続けている。開発者がスケーラブルで高性能なアプリケーションを簡単に構築できる最高のツールの1つです。

Nodeアプリは、IaaS、PaaS、SaaSのような異なるソリューション上にデプロイすることができます。これらにはそれぞれ利点と欠点があり、デプロイオプションを選択する際に考慮する必要があります。

Nodeアプリケーションをデプロイする最も簡単な方法の1つは、Back4appを使うことだ。Back4appは、バックエンドとそのデプロイをアウトソーシングしながら、重要なことに集中することができるので素晴らしい。

back4app-nodejsリポジトリから最終的なソースコードを入手する。

Node.jsホスティングオプションの詳細については、コンテナを使用してNode.JSアプリをホストする方法を参照してください。


Leave a reply

Your email address will not be published.