バックエンド・インフラとは何か?
バックエンドを設計する際、適切なバックエンドインフラを選択することは非常に重要です。バックエンドのパフォーマンス、柔軟性、保守性などに影響を与えます。
この記事では、バックエンド・インフラストラクチャとは何かを説明し、さまざまなタイプのバックエンド・インフラストラクチャを検討し、決定する際に覚えておくべき重要な要素について説明します。
さらに、Back4appを使ってバックエンドのインフラを作る方法についても見ていく。
目的
この記事を読み終わる頃には、あなたはこうなっているはずだ:
- バックエンドのインフラとは何か
- さまざまなタイプのバックエンド・インフラストラクチャ(IaaS、PaaS、BaaSを含む)について説明する。
- プロジェクトに適したバックエンドインフラを選ぶ
- Back4appを使って独自のバックエンドを構築する
バックエンドのインフラとは何か?
バックエンド・インフラストラクチャは、バックエンドシステムをサポートするソフトウェアとハードウェアのコンポーネントの組み合わせだ。これには、サーバー、コンテナ、ネットワーキング・コンポーネント、ファイアウォール、その他のリソースが含まれる。
バックエンドのインフラは、高可用性、スケーリング、ロードバランシング、セキュリティ、ルーティングなどを担当する。バックエンドのインフラは、シームレスなユーザー体験を提供するように設計する必要がある。
バックエンドのインフラを選ぶ際に考慮すべきことは?
バックエンドのインフラを選ぶ際に考慮すべき重要な要素について説明しよう。
スピード
スピードはバックエンドインフラの重要な特徴の1つです。ユーザーはアプリができるだけスムーズに動作することを望んでいる。そのため、クライアントサイドとバックエンドの通信を最適化する必要があります。
通信遅延の知覚を緩和するために、いくつかの巧妙なトリックを使用することができます。例えば、スケルトン・スクリーン、ローディング・バー、ヒント&トリックの表示などをユーザー・インターフェースに実装することができます。
スピードもまた、SEOにおいて最も重要な要素のひとつである。
柔軟性
柔軟性とは、バックエンド・インフラストラクチャがサポートするプログラミング言語、フレームワーク、その他のテクノロジー(データベースなど)のことです。バックエンドインフラを選ぶ際には、様々なテクノロジーをサポートしているものを選ぶようにしましょう。
スケーラビリティ
アプリを作り始めた時点から、スケーラビリティを考慮すべきです。アプリがどのように使われるかを考えましょう。ユーザー数は一定なのか、それとも時々急増するのか?
バックエンドのインフラは、極端なワークロードに対応できるように構築する必要がある。サーバー費用を最小限に抑えるため、アプリケーション・インスタンスはその場で作成・破棄できるようにする必要があります。
メンテナンス性
アプリの開発と公開は仕事の80%に過ぎません。その後は、アプリケーションのメンテナンスに多くの時間を割かなければなりません。サーバーソフトウェアのアップデートやセキュリティパッチのデプロイは、可能な限り簡単であるべきだ。
CI/CDシステムを組み込んだバックエンドインフラを選ぶか、独自に実装する。
DevOpsの要件
バックエンド・インフラの種類によっては、利用が難しいものもある。管理する時間とリソースがあるバックエンドインフラストラクチャを選びましょう。IaaSのような低レベルのバックエンドインフラを使用することに決めた場合、それを管理する専門のDevOpsチームが必要になる。
セキュリティ
ユーザーのデータを安全に保つことは、貴社の全責任です。サイバー攻撃の増加に伴い、バックエンドのインフラが最新のセキュリティ標準に準拠していることを確認する必要があります。
強力な自動生成パスワードを使用する、ファイアウォールを設定する、信頼できないソフトウェアをサーバー上で実行しない、定期的なセキュリティチェックを行う、などなど。
バックエンド・インフラの種類
バックエンドのデプロイには、手持ちのサーバー(いわゆる従来のインフラ)を使うことも、クラウドインフラを活用することもできる。
過去10年間、多くの企業がクラウドモデルにシフトしてきた。
最も人気のあるものをいくつか分析してみよう。
インフラストラクチャー・アズ・ア・サービス(IaaS
IaaS(Infrastructure as a Service)は、最も抽象度の低いクラウド・コンピューティング・モデルである。このモデルでは、クラウドベンダーは、サーバー、ストレージ、OS、ネットワークコンポーネントなどのコンピューティングリソースを仮想化環境で提供する。
IaaSは2010年から存在し、今でも最も人気のあるクラウド・コンピューティング・モデルだ。IaaSの長所は、優れたスケーラビリティ、高度な制御、価格効率性などである。逆に短所は、複雑な管理と他のクラウドモデルよりも高い保守性コストである。
サービスとしてのプラットフォーム(PaaS
PaaS(Platform as a Service)は、ユーザーフレンドリーなアプリケーション開発・管理・配信環境を提供するクラウド・コンピューティング・モデルです。PaaSには様々なアプリ開発ツールが組み込まれており、アプリを簡単に立ち上げることができます。
PaaSはインフラ管理を合理化し、市場への迅速な参入、セキュリティの強化、コスト削減、拡張性、高可用性、コーディングの削減を実現する。その一方で、ベンダーの能力に縛られ、ベンダーロックインのリスクをもたらし、柔軟性とコントロールを制限する可能性もある。
サービスとしてのバックエンド(BaaS
Backend as a Service(BaaS)は、サーバーサイドの開発とクラウドインフラ管理を自動化する。リアルタイムのデータベース、ユーザー管理、認証、通知、ソーシャルメディア統合などを提供する。
BaaSは、開発者をバックエンドの懸念から解放し、フロントエンドとコアビジネスに集中させます。BaaSは、IaaSとPaaSの利点とバックエンドの抽象化を組み合わせたもので、市場投入までの時間の短縮とコスト削減をもたらす。デメリットは、コントロールの欠如、ベンダーロックインのリスク、比較的コストがかかることである。
サービスとしてのコンテナ(CaaS
サービスとしてのコンテナ(CaaS)は、コンテナのアップロード、構築、スケーリング、管理のためのクラウドコンピューティングモデルです。CaaSには通常、コンテナランタイム、コンテナレジストリ、自動スケーリング機能、ビルトインCI/CDシステム、ロードバランシングなどが含まれる!
CaaSはコンテナの取り扱いを簡素化し、基盤となるインフラに対する懸念を取り除く。アジャイル開発を促進し、マイクロサービス・アーキテクチャを容易にし、拡張性の高いアプリケーションの作成を加速する。
バックエンドのインフラを構築するには?
このパートでは、Back4appを使ってバックエンドのインフラを作る。
Back4appとは?
Back4appは、優れたBaaS(Backend as a Service)プラットフォームです。Webアプリケーションやモバイルアプリケーションのバックエンドを素早く構築することができます。
このプラットフォームはオープンソースのテクノロジーを使って構築されており、多くの機能を備えている。その機能には、スプレッドシートのようなデータベース、ファイルストレージ、ユーザー管理、認証、自動生成API、通知などがある!
Back4appを活用することで、市場投入までの時間を大幅に短縮することができます。Back4appを活用することで、バックエンドや基盤となるインフラを心配することなく、ビジネスの中核に集中することができます。
専門のDevOpsエンジニアが不要になり、保守コストも下がる。
Back4appの最も優れた点は、無料ティアがあることです。無料ティアは、プラットフォームのテストやペットプロジェクトのホスティングに最適です。アプリが成功すれば、プレミアム層にアップグレードできます。
Back4appについて詳しくは、Back4appとは?
プロジェクト概要
バックエンドの作り方を紹介するために、シンプルなeコマースバックエンドサービスを構築します。バックエンドでは、商品、カテゴリー、注文を管理することができます。
プロジェクトのER図はこのようになる:
最小限のコードでバックエンドを作り、それがクライアント側でどのように使えるかを(SDK、REST API、GraphQL APIを使って)デモする。
アプリ作成
フォローするにはBack4appアカウントが必要です。必要ですか?今すぐご登録ください!
Back4appアカウントにログインすると、アプリのリストが表示されます。アプリをビルド “ボタンをクリックすると、アプリのビルドプロセスが開始されます。
次に、バックエンドをセットアップするので「BaaS」を選択する。
アプリ名を決め、「NoSQL」を選択し、アプリを作成する。
Back4appは全てのセットアップに時間がかかる。アプリケーションレイヤー、データベース、バックアップ、スケーリングなどを処理する。
アプリがビルドされると、アプリのリアルタイムデータベースに移動します。
データベースのセットアップ
さて、アプリケーションを作成したので、データベースを扱いましょう。
まず、データベースにデータを格納するクラスを作成しなければならない。クラスはテーブル(SQL用語)またはモデル(ORM用語)として見ることができます。各クラスには、デフォルトで以下の4つのフィールドがあります:
+-------------+-------------+------------------------------------------+
| Type | Name | Description |
+-------------+-------------+------------------------------------------+
| String | objectId | Object's unique identifier |
+-------------+-------------+------------------------------------------+
| Date | updatedAt | Date time of the last update |
+-------------+-------------+------------------------------------------+
| Date | createdAt | Date time of creation |
+-------------+-------------+------------------------------------------+
| ACL | ACL | Access Control List |
+-------------+-------------+------------------------------------------+
プロジェクトの概要で述べたように、このプロジェクトには3つのクラスがあります。サイドバーの “Create class “ボタンをクリックして、最初のクラスを作成します。名前をProductCategory
とします:
以下のフィールドを追加する:
+-----------------------------+-------------+---------------+----------+
| Type | Name | Default value | Required |
+-----------------------------+-------------+---------------+----------+
| String | name | <leave blank> | yes |
+-----------------------------+-------------+---------------+----------+
| String | description | <leave blank> | no |
+-----------------------------+-------------+---------------+----------+
Product
クラスについても同じ手順を実行します:
+-----------------------------+-------------+---------------+----------+
| Type | Name | Default value | Required |
+-----------------------------+-------------+---------------+----------+
| String | name | <leave blank> | yes |
+-----------------------------+-------------+---------------+----------+
| String | description | <leave blank> | no |
+-----------------------------+-------------+---------------+----------+
| Relation -> ProductCategory | categories | <leave blank> | no |
+-----------------------------+-------------+---------------+----------+
| Number | price | 0 | yes |
+-----------------------------+-------------+---------------+----------+
多対多のリレーションを扱うために、
Relation
データ型を使用した。
最後に、Order
クラスを作成します:
+-----------------------------+------------+---------------+----------+
| Data type | Name | Default value | Required |
+-----------------------------+------------+---------------+----------+
| Pointer -> Product | product | <leave blank> | yes |
+-----------------------------+------------+---------------+----------+
| String | cFirstName | <leave blank> | yes |
+-----------------------------+------------+---------------+----------+
| String | cLastName | <leave blank> | yes |
+-----------------------------+------------+---------------+----------+
| String | cAddress | <leave blank> | yes |
+-----------------------------+------------+---------------+----------+
| Number | delivered | false | yes |
+-----------------------------+------------+---------------+----------+
一対多のリレーションシップを処理するために、
Pointer
データ型を使用した。
完了すると、サイドバーにクラスが表示されます。
データベースへの入力
続いて、データベースにデータを入力してみよう。
いくつかの商品カテゴリー、商品、注文を作ることから始めましょう(この順番で)。もしアイディアが尽きたら、遠慮なくこのフィクスチャーをインポートしてください。
JSONファイルをインポートするには、「その他のオプション > インポート > クラス・データ > ファイルを選択」を使用します。JSONファイルは以下の順番でインポートしてください:
- 商品カテゴリー.json
- 製品.json
- _参加꞉カテゴリー꞉商品.json
- オーダー.json
これが終わったら、データベースにいくつかの商品、カテゴリー、注文があるはずです。後のフェーズでバックエンドをテストするためにいくつかのデータが必要になるので、このステップは必須です。
データベースの保護
デフォルトでは、データベース・クラスは「保護モード」で作成されます。プロテクト・モードでは、オブジェクトを操作したり管理したりする唯一の方法はマスター・キーを使用することです。クライアント・サイドからオブジェクトを取得したり管理したりできないので、これは最適ではありません。
そのためには、いくつかの制限を緩和する必要があります。Back4app/Parseには2つの制限メカニズムがあります:
- クラス・レベル権限(CLP)
- アクセスレベルのパーミッション(ACL)
CLP ではクラス・レベルでの制限を、ACL ではオブジェクト・レベルでの制限を行うことができます。どちらのメカニズムも、クラスやオブジェクトを特定のロールや
ユーザに
制限することができます。
サイドバーでProduct
classを選択し、画面上部の “Protected “テキストをクリックします。次にCLPを修正します:
ProductCategory
モデルについても同じ手順を実行します。
そして、Order
クラスの CLP を更新する:
画像に注目してください。ここでは、
Create
パーミッションも有効にしています。
新しい CLP では、認証されていないユーザがProducts
とProductCategoryies を
フェッチ、クエリ、カウントすることはできますが、変更することはできません。同じことがOrder
クラスにも当てはまりますが、ここではユーザは新しい注文を作成することもできます。
詳しくは、Parse Server Securityの記事をご覧ください。
管理者アプリ
現時点では、データベース内のオブジェクトを管理する唯一の方法は、データベースビューを使用することです。開発者にとっては有効ですが、技術者でないユーザーにとっては直感的ではありません。その上、ユーザーにコントロールを与えすぎ、ヒューマンエラーを起こしやすい。
幸いなことに、Back4appでは “Admin App “機能を簡単に有効にすることができます。管理アプリは、あなたのデータベースクラスに合わせた使いやすい管理パネルです。
まずサイドバーの “More > Admin App “から有効にしてください。次に「有効化」をクリックします:
Back4appは、ユーザー名、パスワード、サブドメインを選択するプロンプトを表示します。私は以下のように決めました:
user: root
pass: complexpassword123
subdomain: https://binfra.admin.back4app.com/
いいね、それでいいんだ。
Admin App URL “をクリックすると、管理パネルにアクセスできます。クリックすると新しいブラウザウィンドウが開き、管理者認証情報の入力を求められます。ログインすると、オブジェクトの作成、更新、削除ができます。
慣れるまではダッシュボードをいじってみてください。
クラウド・コード
Back4appでは、いわゆるCloud Codeを使ってカスタムJavaScriptコードを実行することができます。Cloud Codeでは、ParseやHTTPリクエストによってトリガーされたり、定期的に実行されたりする関数を定義できます。さらに、Cloud CodeはExpressを使用してウェブアプリケーションを構築するために使用できます。
クラウドコード機能
現在の売上を計算するクラウド・コード関数が欲しいとします。
まず、サイドバーの「Cloud Code > Function & Web Hosting」に移動します。クラウド・コードのビューが2つの部分に分かれていることに気づくだろう。左側にはディレクトリ構造、右側にはコードが表示されます。
次に、cloud/main.jsを開き、以下のコードを貼り付ける:
// cloud/main.js
Parse.Cloud.define("calculateSales", async (request) => {
const orderClass = Parse.Object.extend("Order");
const orderQuery = new Parse.Query(orderClass);
let sales = 0;
try {
const orders = await orderQuery.find();
for (var i = 0; i < orders.length; i++) {
let order = orders[i];
let productId = order.get("product")["id"];
const productClass = Parse.Object.extend("Product");
const productQuery = new Parse.Query(productClass);
const product = await productQuery.get(productId);
sales += product.get("price");
}
return {
sales: sales,
};
} catch (error) {
console.error("Error calculating the sales: " + error.message);
return {
sales: 0,
}
}
});
Parse.Cloud.job("printSales", async (request, status) => {
try {
const result = await Parse.Cloud.run("calculateSales");
console.log("Sales: " + result.sales + "$");
} catch (error) {
console.error("Error calculating the sales: " + error.message);
}
});
calculateSales()
というCloud Code関数を定義しました。この関数はすべての注文をループし、対応する製品をフェッチし、価格を合計します。- Parseダッシュボードから関数を実行し、定期的にスケジュールできるように、
printSales()
というクラウドコードジョブを定義しました。
最後に、”Deploy “をクリックしてCloud Codeをデプロイします。
サイドバーの “Cloud Code > Jobs “に移動し、printSales()
ジョブを実行してジョブが動作することを確認する。ログを確認すると、Sales: 1440$
などのメッセージが表示されているはずです。
クラウド・コード・スケジューリング
ジョブをスケジュールするには、サイドバーの「アプリ設定 > サーバー設定」に移動する必要があります。Background jobs “までスクロールダウンし、”Schedule a job “をクリックし、フォームに記入してください。
念のため、もう一度ログを確認する。
クライアント側
Back4appベースのバックエンドとやり取りする方法は複数あります:
- パースSDK
- RESTful API (自動生成)
- GraphQL API(自動生成)
経験則として、お使いのプラットフォームでParse SDKが利用可能であれば、常にそれを使用すべきです。そうでない場合は、RESTful APIかGraphQL APIを使用する。どちらのAPIを選択するかはデータによって異なります。
Parse SDKを様々なフレームワークで使用する方法については、ドキュメントをご覧ください。
とはいえ、組み込みのRESTコンソールを使ってバックエンドをテストしてみましょう。
サイドバーの “API > REST “に移動し、フォームに記入して全商品を照会してみてください:
同じような反応が返ってくるはずだ:
{
"results": [
{
"objectId": "4ZyHH3X0RQ",
"name": "Fitness Tracker Watch",
"description": "...",
"price": 80,
"createdAt": "2023-10-17T20:03:55.424Z",
"updatedAt": "2023-10-17T20:24:12.322Z",
"categories": {
"__type": "Relation",
"className": "ProductCategory"
}
},
{
"objectId": "cDqlGJzT5U",
"name": "Organic Fruit Basket",
"description": "...",
"price": 40,
"createdAt": "2023-10-17T20:04:10.063Z",
"updatedAt": "2023-10-17T20:24:00.382Z",
"categories": {
"__type": "Relation",
"className": "ProductCategory"
}
},
// ...
}
以下のクエリーを実行してみてください:
- 50ドルより高い商品をすべて取り寄せる
- まだ配達されていない注文をすべて取得する。
- 新しい商品を作り、カテゴリーを追加する。
- 注文の削除
結論
結論として、バックエンド・インフラストラクチャとは何か、様々なタイプのバックエンド・インフラストラクチャについて理解し、プロジェクトに適切なインフラストラクチャを選択する方法を知ることができました。
その上、あなたはBack4appでバックエンドインフラを作成する方法を学びました。データベース、データベースのセキュリティ、カスタムコード、ジョブスケジューリング、APIのテストなどです。
Back4appベースのバックエンドのクライアントサイドを作成するためのガイダンスについては、他の記事を参照してください:
その他の記事リソースはGitHubのレポでオープンソース化されている。