DBの定義/操作言語とは違う、SQLの新たな一面をご紹介するためにSQL HTTP関数を取り上げ、第1部では最近新たに追加されたSQL HTTP関数の基礎知識をご紹介しました。第2部ではもう1歩進んで、具体的にSQL HTTP関数を利用した簡単なAPIの作成例をご紹介します。このテクニックを応用することで、従来RPG言語単独では難しかった処理が他言語を介して容易に解決できる可能性が高まります。(編集部)
(Db2およびRPGのような)IBM iが生まれ持っている技術とオープンソース・アプリケーションを統合するために新しいSQL HTTP関数をどう使用するかについて解説します。
2021年9月15日 ジェシー・ゴルジンスキー
このシリーズの第1部で、幾つかの新しいHTTP関数を紹介しました。実際、それらの関数がSQLを通じて利用可能な一連のIBM iサービスに追加されたのは、素晴らしいことです。この記事では、それらの関数が(Db2やRPGのような)IBM iが生来持っている技術とオープンソース・アプリケーションを統合するのにどのように使用できるかを探ります。
Node.jsとDb2を接ぎ合わす
最近、一人のコミュニティメンバーが、データベースプログラムからDNS(Domain Name System)を照会する方法を尋ねてきました。残念なことに(執筆時点では)SQLにはそのような機能はありませんでした。ですから、この仕事をどうしたら遂行できるでしょう?当然いくつかの方法があります。ILEではgethostbyname() APIが利用できますので、これを呼び出すストアドプロシージャまたはテーブル関数を書くこともできるでしょう。明示的に特定のDNSサーバーを照会するようなもっと高度なDNS活動が必要な場合、ソケットネットワーク関数を組み合わせてその仕事を行うことができます。
しかし、これはほとんどの高水準言語(HLL)ではとても簡単な仕事です。たとえば、DNSを扱う能力はNode.jsランタイムの中核に含まれています。Node.jsとDb2を接ぎ合わせましょうか?
お分かりの様に、RESTすなわちHTTP APIを使うのは、RPGまたはSQLとオープンソース言語を統合する私の好きなテクニックの1つで、新しいHTTP関数はそれをもっと早くかつもっと信頼性の高いものにします。ですから、DNS問題を解決するのにこの方法を使いましょう。この例では、Node.jsとFastifyウェブフレームワークを使ってサービスを立ち上げます。まず始めに、単純な検索を実行するためにNode.js DNSモジュールを使用する本当に簡単なHTTPルートを作成します。
図1:DNSクエリを実行するための単純なREST API
そして、他の任意のfastifyウェブアプリケーションと同様にそれを始動します(図2):
図2:fasitifyウェブサーバーの始動
このNode.jsプログラムを起動すると、localhostのポート8088でAPIが利用可能になります。そして、SQL内にHTTP関数があるので、それを呼び出すのはとても簡単です(図3)。単にQSYS2.HTTP_GETを使うだけです!
図3:Node.jsで書かれた基本的DNSサービス呼び出しの結果
直ぐ出来ました!では、もっと高度な何かに移りましょう。たとえば、次のようなものが欲しいとしましょう:
- 完全なDNS記録情報
- 特定のDNSサーバーを照会する機能
この追加情報を返す追加のAPIを作ってみましょう。この例では、呼び出し元が指定しなかった場合、DNSサーバーの省略時値を“8.8.8.8”とし、照会を実行するためにNode.js Resolverクラスを使用します。更に高度なDNS APIについては図4を見てください。
図4:さらに高度なDNS API
このNodeアプリケーションを開始すると、QSYS.HTTP_GETを使ってターゲットドメインだけでなく使用する名前サーバーも指定して、それを呼び出すことができます。単にIPアドレスを取得するのではなく、DNS記録の完全版(これについてのIANA文書はここにあります)を取得します。SQLからの先進的DNS APIの呼び出しの図については図5を見てください。
図5:SQLからの高度なDSN API呼び出し
この時点でNode.jsサービスはlocalhostで聞いているので、外部からの干渉を受ける心配はないはずです。しかし、TLSを使ってローカルサービスを暗号化したいのであれば、確かにそうすることができます。まずサーバー証明書を生成します。自己署名を認証するために以下のコマンドを実行することもあり得ます。
- openssl genrsa -out file.key 2048
- openssl req -new -sha256 -key file.key -out file.csr
- openssl x509 -req -in file.csr -signkey file.key -out file.cert
このコマンドは、キーを生成し、新たな証明書署名要求を生成し、それに署名し、署名された証明書を作り出します。そして、図6に示すようにfastifyにTLSオプションを追加します。
図6:fastify用のTLS構成
この例で、開始ポートを8089に変更もしました。今やHTTPの代りにHTTPSを使ってサービスを照会できます。しかし、早々に私は「証明書が信頼できる認証機関によって署名されていない」ことを告げる(下に示す)エラーに出くわしました。これは私が自己署名証明書を使っているのが原因です(図7を参照)。
図7:自己署名証明書のエラー
この問題を解決するために、必要な認証権限をデジタル認証マネージャー(DCM)にインポートします。これはDCM GUIを使って行えます。代替手段として、証明書をインポートするためにオープンソースのDCMツールが“dcmimport”コマンドを提供しており、以下のようにこれを実行します。
- dcmimport –fetch-from=localhost:8089
コマンドが完了すると、証明書はDCMによって与信されHTTPS呼び出しが成功します(図8を参照)。
図8:TLSを使用したSQLから高度なDNS APIの呼び出し
すぐ手の届くところにある世界!
RPGアプリケーションを作成していて、Python、PHPあるいはNode.jsで簡単にこなせる課題に出会うことはよくあることです。今回の例では、どうしたらSQLを使ってNode.js機能にアクセスできるかをお見せしましたが、その関数は任意の言語で実装された任意の関数であった可能性があります。ですから、この例のDNS関数に拘らずにこのテクニックがDb2またはRPGプログラマーに世界を広げることに注意して下さい。