F5 BIG-IPのiRule LXでnode.jsが使えるらしいので、まずはHello Worldから(ぱーと3)

BIG-IPの Virtual ServerとやらにiRuleをひもづけてまずは確認
(Virtual Serverの作成はここでは省きます。[ここ](http://www.f5networks.co.jp/shared/pdf/BIG-IP800LTM_Easy_Setup.pdf)を見てつくりました)

それまで作った「**irulelx_Helloworld**」を作成した紐づけました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131001/898d1c94-53b9-408e-4705-b54bd126aa7c.png)

Virtual Serverにアクセスしてみると、、、
ログに出とるでとる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131001/962ede85-ca31-ff51-6504-89e9b59440b9.png)

下記によると、
[Getting Started with iRules LX, Part 1: Introduction & Conceptual Overview](https://devcentral.f5.com/articles/getting-started-with-irules-lx-introduction-conceptual-overview-20409)

> Unlike iRules which has a TCL interpreter running inside the Traffic Management Micro-kernel (TMM), Node.js is running as a stand alone processes outside of TMM. Having Node.js outside of TMM is an advantage in this case because it allow F5 to keep the Node.js version more current than if it was integrated into TMM.

> In order to get data from TMM to the Node.js processes, a Remote Procedural Call (RPC) is used so that TMM can send data to Node.js and tell it what "procedure" to run. The conceptual model of iRules LX looks something like this -
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131001/f16b642f-8f55-fbc0-6656-b58be879c545.png)

Node.jsはTMM(TMMとはBIG-IPの独自プロセスみたい)以外の独立したプロセスとして実行されている、、、、
TMMとNode.js間にはリモートプロシージャコール（RPC）がいて、データの送受信をしてくれているのかな。
TMMはNode.jsにデータを送信して、実行する「プロシージャ」を教えてあげる。ほいで、Node.jsで受け取ったデータをもとに何かを実行して、得た情報をRPC経由でTMMに渡す。みたいな認識でしょうか。。( ˘•ω• )

iRule → rpc → node.js → rpc → iRule
のようなイメージでしょうか。

下記を例にすると、

```iRule:irulelx_Helloworld.irule
 when HTTP_REQUEST {
   set ClientAddress [IP::client_addr]
   log local0.info "(^^)v OK----!"
   set rpc_handle [ILX::init Lxpi_Helloworld Lxex_Helloworld]
   set result [ILX::call $rpc_handle Hello_method $ClientAddress]
    
   if { $result eq "Hello" } {
      log local0.info "(^^)v Hello!"
   } else {
      log local0.info "(--)v No..."
   } 
}
```

**set ClientAddress [IP::client_addr]**
※変数「ClientAddress」にクライアントIPアドレスをセットして、
**log local0.info "(^^)v OK----!"**
※「log local0.info」でログを出力
**set rpc_handle [ILX::init Lxpi_Helloworld Lxex_Helloworld]**
※「ILX::init」でiRule LXプラグインとiRule LX ExtentionのRPCハンドルを作成して、変数rpc_handleに格納して、
**set result [ILX::call \$rpc_hdl my_method \$arg1]**
※「ILX::call」を使用して、RPCハンドルに「Hello_method」と「ClientAddress」を渡して、その結果を変数「result」に格納してる
※「my_method」がNode.jsで実行されるプロシージャで、
※ 変数「arg1」を一緒に渡している。
**if { $result eq "Hello" } {**
※ Node.jsで実行された処理の結果が変数「result」にあるので、その結果が「Hello」だったら、
**log local0.info "(^^)v Hello!"**
※ログ「(^^)v Hello!」を出力

```Node.js:index.js
ilx.addMethod('Hello_method', function(req, res){
  var data = req.params()[0];
  
  console.log("Node.js $date")
  
  res.reply('Hello');
});
```
**ilx.addMethod('Hello_method', function(req, res){**
※最初の引数の「Hello_method」は、iRuleから呼び出されたメソッドの名前で、2番目の引数は、my_methodを呼び出すときに実行されるコールバック関数。
**var data = req.params()[0];**
※dataにiRuleから受け取った変数の1つ目を入れて
**console.log("Node.js $date")**
※ログに出力
**res.reply('Hello');**
※iRuleに「Hello」を返す。


という流れでしょうか。


ということでやってみよーーー！(੭ु´･ω･`)੭ु⁾⁾
iRuleに貼り付けて、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131001/db904655-5ff2-c497-f19b-9d45c73bd973.png)

index.jsに貼り付け
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131001/9ae0338b-5a78-10b0-49ae-f1f8788e0a07.png)

Virtual Serverにアクセスしてみたら、、、
こんなエラーが出力
` 01220001:3: TCL error: /Common/Lxpi_Helloworld/irulelx_Helloworld <HTTP_REQUEST> - Could not find ILX extension Lxex_Helloworld in path Lxpi_Helloworld (line 3)     invoked from within "ILX::init Lxpi_Helloworld Lxex_Helloworld"`


index.jsの一番初めの行にf5-nodejsモジュールの追加と、RPCサーバのリッスンを追加しました。

```Node.js:index.js
/* Import the f5-nodejs module.*/
var f5 = require('f5-nodejs');

/* Create a new rpc server for listening to TCL iRule calls. */
var ilx = new f5.ILXServer();
ilx.listen();


ilx.addMethod('Hello_method', function(req, res){
  var data = req.params()[0];
  
  console.log("Node.js $date")
  
  res.reply('Hello');
```

再度、VirtualServerにアクセスすると、、、、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131001/e50938a4-cd86-29ed-b85a-e9ac573c9f23.png)

あっ！OKそうです！


じゃあ、、、index.js →から→ iRuleに渡す値を「Hello」じゃなくて「good morning」にしてよう！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131001/7d7b5d95-abb3-7b17-47b3-1f124759fba7.png)

また、VirtualServerにアクセス！！
OKそうです。(--)v No...になってるん🎶
![image.png](https://qiita-image-store.s3.amazonaws.com/0/131001/8ced027c-9131-933b-b8b9-1cd97f1648d9.png)