Web APIをUNIXパイプで繋ぐツール IOpipe を試してみた
ども、大瀧です。 IOpipeというツールが面白そうだったので、試してみた様子をレポートします。
IOpipeとは
IOpipeは、Web APIからのレスポンスを受け取りNode.jsでロジックを記述したフィルタ処理を適用、その結果をAPIへのリクエストとして送信するCLIツールです。標準入力および標準出力にも対応しているのでUNIXパイプによる他のコマンドとの組み合わせが可能です。また、NodeJS SDK版もありNode.jsアプリケーションに組み込めるようにもなっています。
以下のサイトでIOpipeのコンセプトが紹介されており、AWS LambdaやGoogle Cloud Functionsに対応する予定で、サーバーレスアーキテクチャのツールとしても機能する予定のようです(現在は未実装)。
IOpipeのインストール
IOpipeは、GitHubのリリースページからバイナリをダウンロードし、実行します。
Mac OS Xの場合は「iopipe-0.0.1alpha2-osx-x86_64」ですね *1。ダウンロードしたらPATHの通っているディレクトリに配置し、実行権を付与しましょう。以下のようにヘルプが出ればOKです。
$ curl -L -o ~/bin/iopipe https://github.com/iopipe/iopipe/releases/download/0.0.1-alpha2/iopipe-0.0.1alpha2-osx-x86_64 % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 621 0 621 0 0 391 0 --:--:-- 0:00:01 --:--:-- 391 100 11.5M 100 11.5M 0 0 965k 0 0:00:12 0:00:12 --:--:-- 2401k $ chmod +x ~/bin/iopipe $ iopipe --help NAME: iopipe - cross-API interoperability & data manager USAGE: iopipe [global options] command [command options] [arguments...] VERSION: 0.0.0 COMMANDS: remove Remove filter from local index. exec Pipe from <src> to stdout export Export will write a Javascript library for the given pipeline import Import will bring a filter in from a javascript file or STDIN for - list List local and subscribed pipes login Login to an endpoint tag Tag a pipescript or pipeline to a name help, h Shows a list of commands or help for one command GLOBAL OPTIONS: --debug enable debugging output --help, -h show help --version, -v print the version $
これで準備完了です。
実装例
今回はWeb APIの例として、AWSが公開するAWSのIPアドレスの範囲(https://ip-ranges.amazonaws.com/ip-ranges.json)のJSONデータを入力とし、その中からIPアドレスのみを抜き出すフィルタ処理を実装してみます。入力となるJSONデータは以下のような感じです。
{ "syncToken": "1458939735", "createDate": "2016-03-25-21-22-16", "prefixes": [ { "ip_prefix": "23.20.0.0/14", "region": "us-east-1", "service": "AMAZON" }, { "ip_prefix": "27.0.0.0/22", "region": "ap-northeast-1", "service": "AMAZON" }, :(以下略)
IPアドレスは、prefixes[].ip_prefix
ですね。これを抜き出すIOpipeのロジック(IOpipeではカーネルと呼びます)は以下のようになります。
module.exports = function(input,context) { var ipRanges = JSON.parse(input) var ip_prefixes = '' ipRanges['prefixes'].forEach(function(value, index){ ip_prefixes += value.ip_prefix + '\n' }) return ip_prefixes }
このままだとデバッグが辛いので、以下のスタブを用意してデバックしてました。
var ipranges = require('./ip-ranges.js') var result = ipranges('{"prefixes":[{"ip_prefix":"10.0.0.0/24"}]}') console.log(result)
$ node index.js 10.0.0.0/24 $
node.jsのコードとしては問題なさそうなので、IOpipeでやってみます。まずは、作成したコードをカーネルとしてIOpipeに登録するiopipe import
を実行します。
$ iopipe import --name ip-ranges ip-ranges.js cd50bceb526a19a0a3e4eccd58dabe5733918b000a2bc89f9c1484af60e2c81c $
--name
オプションで指定したip-ranges
がカーネルとしての登録名になります。では、実際のAPIリクエストを入力にしてカーネルを実行してみましょう。iopipe exec
の引数にAPIのURLとカーネル名を指定します。
$ iopipe exec https://ip-ranges.amazonaws.com/ip-ranges.json ip-ranges INFO[0000] pipe[arg]: https://ip-ranges.amazonaws.com/ip-ranges.json INFO[0001] pipe[arg]: ip-ranges 23.20.0.0/14 27.0.0.0/22 43.250.192.0/24 43.250.193.0/24 46.51.128.0/18 46.51.192.0/20 46.51.216.0/21 46.51.224.0/19 46.137.0.0/17 :(以下略) $
期待通りの出力が出てきました。では今度は、出力結果を別のAPIへのリクエストにしてみましょう。iopipe exec
の第三引数にAPIのURLを追加するだけです。簡単!今回はRequestBinを指定してみました。
$ iopipe exec https://ip-ranges.amazonaws.com/ip-ranges.json \ > ip-ranges \ > http://requestb.in/XXXXXXXX INFO[0000] pipe[arg]: https://ip-ranges.amazonaws.com/ip-ranges.json INFO[0000] pipe[arg]: ip-ranges INFO[0001] pipe[arg]: http://requestb.in/XXXXXXXX ok $
RequestBinを確認してみると。。。
出力がPOSTのリクエストボディにセットされているのがわかりますね。
ちなみに、APIの代わりに標準入力を使う場合は、URLの部分を-
にします。
$ cat ip-ranges.json | iopipe exec - ip-ranges INFO[0000] pipe[arg]: - INFO[0000] pipe[arg]: ip-ranges 23.20.0.0/14 27.0.0.0/22 43.250.192.0/24 43.250.193.0/24 46.51.128.0/18 46.51.192.0/20 46.51.216.0/21 46.51.224.0/19 46.137.0.0/17 :
良い感じですね。
まとめ
Web APIを手軽に入出力として扱える、IOpipeをご紹介しました。node.jsなのでJSONが簡単に扱えるため、Web APIは関係なしにjq
の代替として使えるのでは?なんて淡い期待を持っていたりします *2。まだアルファ版なので実務で使うにはパフォーマンス面など不安はありますが、今後が楽しみなツールです。
一方でLambda対応もどのような展開になるのか期待大ですね。作者のEricが5月にニューヨークで開催されるServerlessConfにスピーカーとして参加するようなので、その辺の話が聞けるんじゃないでしょうか。ServerlessConf行きたい!
脚注
- Windowsの方も、Goで書かれているツールなのでDockerもしくはgo buildの独自ビルドで動かせるかも知れません。参考 : GitHubのREAMDEにある「Build & Install from source」 ↩
- jqの構文に悩まされる日々から解放されるかも! ↩