どんなコマンド/スクリプトもサーバレス化するためのhwrapを書いた

ちょっとした処理を実行する時にはサーバレス(FaaS/CaaS)環境は便利ですよね。 呼び出しベースでコストが最適化されるのでバッチサーバ的なものを常駐させておく必要もありません!

ただ、AWS Lambdaとかで書くと特定の言語/FWで実装する必要があるので過去に書いたちょっとしたスクリプトとか、 シェルで良いのにレベルのことをサーバレス化するのには不便でした。

そんな時に便利なのがCaaS(Container as a Service)です。HerokuやAWS Fargate、最近だとk8sベースのKNativeとそれをGCPでマネージドしてるCloud Runあたりが有名です。

こいつらはDockerにさえ対応してれば良いので言語やFWに縛られる必要はなくOSのパッケージコマンドも使い放題です。実際、Cloud Runのデモでは、LibreOfficeを使ってPDFを生成していました。

ただ、基本的にはHTTPをトリガーにしてるので一々HTTPサーバ作るの面倒だな。。 と思ってラッパーになるコマンドとしてhwrapを作りました。

github.com

使い方は簡単です。ポートを指定して任意のコマンドを引数に取るだけ。

$ hwrap -p 8080 "date"   
port:8080, commad:date, args:[]

ポートは-pまたは--portで指定します。特に指定しない場合はデフォルトの8080を使用します。 この状態で別のターミナル等からアクセスしてみます。

$ curl http://localhost:8080 
success

successが表示されましたね。この状態で元のターミナルにはdateコマンドの実行結果が表示されます。

$ hwrap -p 8080 "date"   
port:8080, commad:date, args:[]
Sun Jun 30 11:17:50 PDT 2019

引数付きの処理も対応できます。その場合は""で括る必要があるので

$ hwrap -p 8080 "ls -l /" 
port:8080, commad:ls, args:[-l /]

$ hwrap -p 8080 "python script.py" 
port:8080, commad:python, args:[script.py]

となります。実行結果は標準出力なので、例えばStackDriverのようなログ管理機能と相性が良いと思います。 今回は日付関数の結果を出してますが、通常はバッチスクリプトの進捗とか実行結果を出すと思いますし。

まとめ

CGIみたいに実行結果を戻り値として欲しいというよりは、小さなバッチをサーバレスな環境で実行したいと思って作ったコードでした。 何気にほぼ初Go言語になるので開発方法も学んで行かないと。

本当は適切なマイクロサービスに切り出してストリーム処理ないしはイベントドリブン処理にするべきなんでしょうが、シンプルなバッチもやっぱ作るのが楽というメリットはあるんですよねぇ。バグ対応も簡単だし。 なので、この辺を自分用にもうちょっと整理していきたいかな。エラー処理とかもちゃんと500返すようにしたり。

それではHappy Hacking!