次世代SIEMによるSOCの変革
次世代SIEMによるSOCの変革
REpresentational State Transfer (REST) は、HTTPプロトコル経由で通信するAPIを作成するためのアーキテクチャスタイルです。
バックグラウンドでは、多くの場合、APIが処理の一部としてデータを操作する必要があります。通常、これらのデータ操作(略してCRUDと呼ばれる)はバックエンドデータベースに対して実行されます。CRUDは、Create(作成)、Read(読み取り)、Update(更新)、Delete(削除)の頭文字をとったもので、この4つの基本操作で構成されます。
REST APIコールでCRUD操作を呼び出すため、APIの開発者とデータエンジニアはこれらの関係を理解しておくことが重要です。CRUDとRESTの目的は違いますが、一方が他方のパフォーマンスを阻害することがあってはなりません。
この記事では、CRUDとRESTを紹介して類似点と相違点を説明し、そのパフォーマンスを最適にモニタリングする方法を検討します。
CRUDとは
CRUD操作は、従来のリレーショナルデータベース管理システム(PostgreSQLやSQL Serverなど)と、それより新しいNoSQLデータベース(MongoDBやDynamoDBなど)に適用されます。ファイル指向の操作では情報操作も管理されますが、CRUDは一般に、コンピューターデータベースでのレコード指向の操作を指します。
リレーショナルデータベース管理システム (RDBMS) では、データベーステーブル行はレコードと呼ばれ、列は属性またはフィールドと呼ばれます。4つのCRUD操作を1つずつ見ていきましょう。
作成
作成操作は、新しいデータベースレコードを追加します。SQLでこの操作に相当するのは、INSERTです。
読む
読み取り操作は、検索条件に基づいてデータベーステーブル(またはコレクション)からレコード(またはデータベースタイプによってはドキュメントまたはアイテム)を取得します。SQLで読み取り操作に相当するのは、SELECTです。読み取り操作では、クエリに応じてレコードとフィールドのサブセットを返すことができます。
更新
更新操作(SQLでもUPDATE)は、データベース内の既存のレコードを変更します。読み取りなどの更新操作は、レコードやフィールドの全部または一部に適用することができます。
削除
削除操作(SQLでもDELETE)は、データベースから1つ以上のレコードを削除します。
NoSQLデータベースでは、CRUD操作に対応する式は、プラットフォーム、データ構造、および言語によって異なります。例えば、MongoDBでは次のようになります。
- 作成操作は、
db.collection.insertOne()またはdb.collection.insertMany()を使用します。 - 読み取り操作は、
db.collection.find()またはdb.collection.findOne()を使用します。 - 更新操作は、
db.collection.updateOne()、db.collection.updateMany()、またはdb.collection.replaceOne()を使用します。 - 削除操作は、
db.collection.deleteOne()またはdb.collection.deleteMany()を使用します。
通常、APIアプリケーションコードは、RDBMS内のストアドプロシージャ、ファンクション、またはトリガーを起動してCRUD操作を実行します。APIコードが、動的に生成されたSQLコマンドをデータベースエンジンに渡す場合もあります。
NoSQLデータベースでは、APIアプリケーションコードがデータベースドライバーを介してコマンドを送信します。例えば、JavaアプリケーションはHBaseドライバーライブラリを呼び出して、CRUDコマンドをデータベースに送信できます。バックグラウンドでは、ドライバーがJavaからコマンドを変換してデータベース上で実行します。
CRUDの実例
CRUDの実例について考えてみましょう。ユーザーがオンライン旅行サービスアプリを通じて旅行を予約すると、アプリケーションは予約レコードを作成し、空きのあるホテルと部屋の情報を読み取ります。予約が確定したときには空き部屋のリストを更新し、ユーザーがリクエストをキャンセルした場合は予約レコード全体を削除します。どのトランザクション処理アプリケーションでも同様の操作が行われます。
RESTとは
RESTは、分散アプリケーションでよく使用されるAPIのアーキテクチャスタイルです。REST(またはRESTful)APIは、RESTアーキテクチャの原則に準拠し、クライアントアプリケーションやその他のAPIがAPIエンドポイントを介して互いに対話できるようにするアプリケーションです。RESTful APIにアクセスするアプリケーションは、通常、HTTPプロトコルメソッドを使用してリクエストを送信します。RESTの6つの主要な制約は次のとおりです。
- 統一インターフェース:統一インターフェースにより、どのAPIクライアントも、クライアントやサーバーのプログラミング言語や実装に関係なく、一貫性のある標準化された方法でサーバーと通信できます。
- クライアント-サーバー:クライアント-サーバーの設計パターンでは、クライアントとAPIサーバーに別々の役割が規定されています。サーバーは、データの保存、検証、認証などのバックエンド機能を担当します。一方、クライアントはユーザーインターフェース、クエリのビルドなどを扱います。
- ステートレス:ステートレスであるためには、クライアントからAPIへの各リクエストに、サーバーがタスクを実行するために必要なすべての情報が含まれている必要があります。サーバーは、クライアントまたはサーバーに関するセッション状態情報を保存しません。APIに関する限り、クライアントリクエストはそれぞれ新しいリクエストであり、前のリクエストとは別のものです。
- キャッシュ可能:キャッシュ可能制約は、APIからのレスポンスによって、クライアントがAPIのレスポンスをキャッシュできるかどうかが決まることを規定したものです。APIが、レスポンスをキャッシュ可能またはキャッシュ不可としてマークします。
- 階層化システム:階層化とは、機能を備えたオプションコンポーネントを含めることです。例えば、負荷分散や検証などの機能です。このようなレイヤーは、クライアントに対して透過的である必要があります。各レイヤーのコンポーネントからは、操作対象のレイヤー以外のレイヤーは見えないようにする必要があります。
- コードオンデマンド(任意):コードオンデマンドにより、クライアントはAPIサーバーからコードをダウンロードして実行できます。
REST APIは、最新のアプリケーションに普及しています。例えば、天気予報API、ビデオストリーミングサービス、ソーシャルメディア、ライドシェアアプリケーションなどで、REST APIが広く使用されています。
HTTPメソッド
クライアントは、HTTPメソッドを使用してRESTful APIリクエストをラップします。
- GET:GETリクエストは、データベースレコードやファイルの内容などのリソースを取得してクライアントに送信するようにAPIに要求します。
- POST:POSTメソッドを使用して、クライアントはAPIサーバーにデータを送信します。APIサーバーは提供されたデータを使用してリソースを作成します。
- PUT:クライアントがPUTリクエストをAPIに送信すると、特定のリソースのURIが指定され、リクエスト本文にデータが提供されます。APIサーバーはPUTリクエストを受け取ると、リソースがすでに存在するかどうかを確認します。リソースが存在する場合、APIはPUTリクエストに含まれるデータを使用してリソースを更新します。リソースが存在しない場合、APIは提供されたデータを使用してそのリソースを作成します。
- PATCH:クライアントは、既存のリソースを部分的に更新するためにAPIにPATCHリクエストを送信します。
- DELETE:クライアントは、既存のリソースを削除するためにAPIにDELETEリクエストを送信します。
REST APIリクエストの例
複数のクライアントツールが、APIエンドポイントにリクエストを送信できます。よく使用されるコマンドラインツールに、cURLがあります。cURLを使用して架空のREST APIエンドポイントにHTTPリクエストを送信するいくつかの例を以下に示します。
ここで使用している架空のREST APIのエンドポイントは、http://www.foobar.comです。このAPIに、お客様のレコードを作成、読み取り、更新、または削除するための各種HTTPリクエストを送信します。
次のコードスニペットでは、cURLクライアントはお客様IDが19のお客様の詳細を要求しています。これはGETリクエストです。
curl -v http://www.foobar.com/find_customert_record?id=19
次に、POSTリクエストを使用してお客様レコードを追加します。次のコマンド例では、HTTPリクエストの本文にデータを含めます。
curl -X POST -d 'id=10&customer_name=joe_bloggs' http://www.foobar.com/add_customer_record
この例では、レコード作成のデータを含むファイルを指定します。
curl -X POST -d @customer_record.json -H "Content-Type: application/json" http://www.foobar.com/add_customer_record
お客様レコードを更新するために、以下のPUTリクエストを送信します。
curl -d 'id=10&client_name=jane_bloggs' -X PUT http://www.foobar.com/update_customer_record
そして最後に、お客様IDが22のお客様を削除します。
curl -X DELETE http://www.foobar.com/delete_customer_record?id=22
CRUDとREST:類似点と相違点
見てわかるように、RESTful API操作とデータベースのCRUD操作は、違いはあるものの、よく似ています。
前述のオンライン旅行サービスアプリの例では、Webアプリケーションが作成、読み取り、更新、削除のCRUD操作を開始します。フロントエンドのWebサイトがREST APIコールを行うと、APIコードがこれらのリクエストをデータベースのCRUDコマンドに変換してデータベースドライバーに渡します。データベースドライバーが(成功または失敗の)レスポンスを返すと、APIコードがそれをHTTPレスポンスに変換してクライアントに送信します。
RESTとCRUDのどちらでも、リクエストした側にレスポンスが送信されます。REST APIクライアントの場合、これは標準のHTTPレスポンス(200 OK、404 Resource Not Found、500 Internal Server Errorなど)の形式で返されます。CRUDの場合、各データベースエンジンに、成功、失敗、または警告に対応する独自のレスポンスコードがあります。
今度は、相違点を見てみましょう。
CRUDとRESTがアプリケーションスタックのさまざまな部分でどのように機能するかについて説明しました。REST APIはHTTPプロトコル経由でペイロードを受け入れますが、CRUDはデータベースで有効になっているプロトコルを使用します。ネットワークパケットの構造も異なります。通常、REST APIはポート80または443経由でクライアントリクエストを受け入れますが、これは設定可能です。CRUD操作の場合、データベースサーバー設定でポートが規定されています。例えば、SQL Serverのデフォルトポートは1433です。
CRUD関数はREST APIコード内に存在できます。ただし、REST APIが呼び出すのはCRUD操作だけではありません。REST APIは、他の関数、サブルーチン、さらには他のAPIを呼び出すこともできます。
無数のREST API(パブリックおよびプライベート)がありますが、現在利用できるデータベースエンジンの数は限られています(RDBMS、NoSQL、インメモリデータベースなど)。
次世代SIEMおよびログ管理のための世界をリードするAIネイティブプラットフォームをお試しください
SIEMとログ管理のための最高水準のAIネイティブプラットフォーム、CrowdStrike Falcon®プラットフォームでサイバーセキュリティを強化しましょう。ペタバイト規模でのセキュリティログを体験してみてください。クラウドネイティブ型または自己ホスト型での展開が可能です。ボトルネックの生じない、強力でインデックスフリーのアーキテクチャを利用してデータをロギングすれば、1日あたり1PB以上のデータを取り込んで脅威ハンティングに役立てることができます。リアルタイムの検索機能により攻撃者をしのぐスピードで対策を実施できます。複雑なクエリを実行しても、そのレイテンシーは1秒未満です。360度の可視性によりデータを統合してサイロ化を解消し、セキュリティ、IT、DevOpsチームがシームレスに脅威のハンティング、パフォーマンスのモニタリング、コンプライアンスの確保を行うことができます。30億件ものイベントにわたる作業でも1秒未満で実施できます。