Amazon API Gateway & Lambda & S3 で放置可能なサービスを作ってみた

  • 467
    いいね
  • 7
    コメント

1年半ほど前に書いたこちらの記事、タイミングが良かったのか naoya 砲なのか分かりませんが、色んな方に読んで頂けたようです。

しかし、「放置可能なサービス」というタイトルに反し、この記事で作成した楷書体サービス、とうとうメンテを行うことになりました。
理由は、node v0.10 のサポートを Lambda が打ち切るためです。
コードそのまま node v6 で動かせるとは思いますが、それでも放置できなかったことには変わりありません。謹んでお詫び申し上げます。

いやまぁ1年半もメンテナンスせずに動いてたんだからすごいじゃんと思う。今クリックしたら普通に動いてびっくりした

また、近年 serverless や microservices の流れがあったり、 GCP も Azure も対抗サービス出したりして、Lambda と API Gateway を取り巻く環境は大きく変わりました。自分の会社でも既に実戦投入してますし、そもそもその記事の構成は、今となってはもっといいやり方があります。今から読む方は、昔はこんなだったんだなーと思いながら読んで下さい。


先日発表された API Gateway に、話題の Lambda、S3 と、どれもリクエスト数が少なければタダ同然のサービスなので、組み合わせれば放置可能なサービスが作れるかな? と思って試してみました。

作ったもの

http://kaisho.s3-website-us-east-1.amazonaws.com/

入力された文字列を楷書体の画像にして返すサービスです。
子供の命名書に筆入れするための見本のために作りました。

構成

Kaisho.png

  1. S3 に置かれた HTML を取りに行って
  2. HTML に書かれた JS が API Gateway を叩きにいって
  3. API Gateway が Lambda を発火して
  4. Lambda が楷書体の画像を作って S3 に配置して
  5. API Gateway からのレスポンスで画像のURLが帰ってくるから、その画像を JS で img タグ作って取りに行く

と、こんな感じです。

ソースコード

https://github.com/macoshita/kaisho

  • 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 が画像を返せればなーと思ったけどできなかった
    • これは現状いけなさそう
  • 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円ほど必要になることがわかりました。タダじゃないじゃないか!訴訟!
……アカウントが事故らない限りは運用する気がします笑