1年半ほど前に書いたこちらの記事、タイミングが良かったのか naoya 砲なのか分かりませんが、色んな方に読んで頂けたようです。
しかし、「放置可能なサービス」というタイトルに反し、この記事で作成した楷書体サービス、とうとうメンテを行うことになりました。
理由は、node v0.10 のサポートを Lambda が打ち切るためです。
コードそのまま node v6 で動かせるとは思いますが、それでも放置できなかったことには変わりありません。謹んでお詫び申し上げます。
いやまぁ1年半もメンテナンスせずに動いてたんだからすごいじゃんと思う。今クリックしたら普通に動いてびっくりした
また、近年 serverless や microservices の流れがあったり、 GCP も Azure も対抗サービス出したりして、Lambda と API Gateway を取り巻く環境は大きく変わりました。自分の会社でも既に実戦投入してますし、そもそもその記事の構成は、今となってはもっといいやり方があります。今から読む方は、昔はこんなだったんだなーと思いながら読んで下さい。
先日発表された API Gateway に、話題の Lambda、S3 と、どれもリクエスト数が少なければタダ同然のサービスなので、組み合わせれば放置可能なサービスが作れるかな? と思って試してみました。
作ったもの
入力された文字列を楷書体の画像にして返すサービスです。
子供の命名書に筆入れするための見本のために作りました。
構成
- S3 に置かれた HTML を取りに行って
- HTML に書かれた JS が API Gateway を叩きにいって
- API Gateway が Lambda を発火して
- Lambda が楷書体の画像を作って S3 に配置して
- API Gateway からのレスポンスで画像のURLが帰ってくるから、その画像を JS で img タグ作って取りに行く
と、こんな感じです。
ソースコード
- Lambda ディレクトリに Lambda 用のコードが入ってます
- site ディレクトリに S3 に上げてるコードが入ってます
知っておくと嬉しいかもな Lambda 知識
- node_module ごとまとめる必要がある
- つまり、ビルドが必要なライブラリは動かない可能性がある
- index.js に export.handler と書いてそこに実装したら、AWS Console の方では index.hander と設定する。 app.js だったら app.handler
- ImageMagick が入ってる ここ参照
- ImageMagick に依存したライブラリは普通に利用できる。公式ドキュメントでも gm というライブラリを使ってる
- Node は v0.10.36 が入ってる ここ参照
知っておくと嬉しいかもな API Gateway 知識
- API Gateway はユーザーからのリクエストをLambdaが読むのに都合いい感じに変換して、Lambdaからのレスポンスをアプリで処理しやすいように変換する という部分を担当してる
-
CORS 対応がめんどい。公式ドキュメントにちゃんとやり方載ってるけど、classmethod さんの記事 の方が画像付きでわかりやすいと思う
できなかったこと
- API Gateway が画像を返せればなーと思ったけどできなかった
- これは現状いけなさそう
- API Gateway が画像へのリダイレクトを返せればなーと思ったけどできなかった
- これは頑張ればいけそう
- API Gateway にクエリパラメータで日本語を渡したらうまく動かなかった。最初 Path パラメータでも動かなかったけど、1日たったら直ってた。多分中の人が修正したんだと思う。
- ともかく現状(2015/07/28時点)は日本語の扱いが若干あやしいので注意。
まとめ
- ImageMagick でいけるレベルの画像ジェネレータは割と簡単に作れます。
- Lambda はガッツリ使うならデプロイが面倒そうです。素直に package.json 書いて npm start で起動してほしいなーと。それ以外はそんなに文句ないけど、java のほうがもしかして現時点では使いやすいかもしれないです(使わずにいってる)。
- API Gateway のほうがさすがにまだプレビュー版な雰囲気。特に CORS 対応はそのうちもっと楽になると思います。
- 趣味サービスにはとてもいいと思います。
2015/08/27 追記 : 料金について
8/27までにAPI Gatewayに1,358リクエストがありました。
※S3ロギングぐらいONにしとくべきでした; こんなにストックして頂けるとは……。
私はAWS登録後1年以上経過しているので、API Gateway に1円、S3リクエストで1円、S3容量で1円、データ転送に1円かかりました。lambdaは毎月の無料枠があるので0です。1年経ってないアカウントだと年間無料枠のおかげでデータ転送の1円のみで済むのかな?
ということで、このサービスを維持するには年間4x12=48円ほど必要になることがわかりました。タダじゃないじゃないか!訴訟!
……アカウントが事故らない限りは運用する気がします笑