読み書きプログラミング

日常のプログラミングで気づいたことを綴っています

AWS LambdaでGnuGo

[追記 2018-11-27] デフォルトの設定では中盤でのGnuGoのestimateがAmazon API Gatewayタイムアウトである29秒以内に完了しなかったです。AWS Lambdaはメモリを増やすとCPUパワーも増える仕様なので、256MBに増やしたところ、estimateできました。メモリ最大の3GB設定で使うといいと思います。

初めてAWS Lambdaを使ってみました。

AWS Lambdaはサーバーレスアーキテクチャのサービスで、課金が処理の時間だけにかかるサービスです。
自動でスケールするらしいので、頻度はそれほどでもなく、ただ処理に比較的時間がかかるようなサービスを提供したい時に最適です。

モバイルの囲碁アプリに整地機能を入れるとき、GnuGoをアプリに載せるのは大変なので、ウェブAPIとして実装している方多いのではないでしょうか?
GnuGoは正確に整地しようとすると結構計算に時間がかかります。またしょっちゅう使われる機能ではない反面たまたま同時にリクエストを受ける可能性も十分あり、必要な際には複数インスタンスが起動してなおかつ処理時間だけ課金されるサーバーレスサービスがうってつけになります。

しかも無料枠があるので、趣味でアプリを作っている方も気楽に使えます。
1局面30秒使うとして、メモリ3GBなら4,444リクエストが無料です。

前置きはこのぐらいにして、以下が作ったパッケージです。

github.com

インストール

gnu.zipにAWS Lambda用の、ハンドラと呼ばれる関数の定義ファイルとAWS Lambda上で動くGnuGoが同梱されています。
特にソースを見る必要はなく、

  1. AWS Lambdaで関数を「一から作成」
  2. gnugo.zipをアップロード
  3. メモリを3GBに増設
  4. トリガーにAPI Gatewayを追加 (API GatewayREST APIを提供するサービスです。デフォルト29秒でタイムアウトします)
  5. APIを設定

以上です

使い方

作ったREST APIに、以下のようなJSONをpostしてください。

{
    "move": "est",
    "method": "aftermath",
    "sgf": "(;FF[4]...)"
}

成功するとレスポンスのbodyに、

{
    "stdout": "...",
    "stderr": "..."
}

というJSONが返されます。

Happy Go programming!