サーバーレスっぽいインフラをどう管理していくか

February 7, 2017

きっかけ

  • VPSで設置していたプロフィールサイト(静的HTML)をサーバーレスで動かした方がコストダウンになるのではないかと考えた。
  • とはいえ完全に静的なサイトだとS3だけで事が済んでしまい面白くない()ので、自分のブログの最新エントリーを動的に書き加えるような処理を与え、動的に生成されるページをLambdaで作ることにした。
  • サーバーレスの時代にいくつかデプロイフレームワークが出てきていたので、それを使えればと思った。

……という感じでサーバーレスっぽい何かを作った。いや作ろうとしたってレベルか……。

実は個人で使っているクラウド上のサーバーが、今年1月の時点で3台ありまして。1台はプライベート用途のContainer Linux @さくらクラウド。1台は先に書いたパブリック用途のウェブサーバー @さくらVPS。んで踏み台として、必要なときだけ起動するEC2を1台。ああ、もう1台Herokuもhubot用に使ってたか。これはDockerにしちゃって消しましたが。

まぁさすがにちょっと無駄に多いから整理したいなという思いがきっかけとなった。VPS、数年前だとエンジニアは1人1台持ってnginxとMySQL運用しろみたいな気風もあったけど、なんだかそんな時代も去った感もあり。どちらかと言えばどこかのPaaSでなんか作る方が今風なのかも。

詳細な設計はQiitaに上げましたので、そちらをご参照ください。

使用したツール

サーバーレスなデプロイツール

これらのフレームワーク群をまとめてどう呼べばよいものか。。。「サーバーレスフレームワーク」がしっくり来るんだけど、これはすでに使ってしまっているプロダクトがあるから使えない……あの名前、汎用的過ぎてちょっとどうかと思うんだけど。

今回せっかくなので、フレームワークを使ってみることにしました。試したのは以下3種類。

名称 カバー範囲 感想
Serverless Framework 中でCloud Formationを使っているのでわりとなんでも。 多機能で何でもできる印象。CFn直接使うのと学習コストを比べたい感じがする。
chalice API Gateway, Lambda レスポンスがjsonに限定されるなどまだ機能は少ないが、その分簡単なAPIならサクッと作れて楽。何よりIAMポリシーを自動生成してくれるのが最高。
Apex Lambda Lambdaを手作業でzipしてデプロイするのが面倒なときに使いたいツール。GolangでLambdaを書けたりする機能もある。

試用の結果、今回の目的はHTMLの返却だったのでchaliceは一旦諦めて、Serverless Frameworkでもよかったんだけど、ちょっと今回払う学習コストとしては見合わなさそうな印象があったので、Apexを使うことにした。

触った印象としてはApexも非常に学習コストが少なくて良いのだが、今後に期待したいのはChalice。awslabsが作っているので、というのもあるけれど、おそらくサーバーレスアーキテクチャーとして多い用途の1つであろう、API GatewayとLambdaを使ってREST APIを返す、という使い方においては必要十分な機能が満たされているように思います。

HTML5 UP!

以前は自分でせこせこHTMLやCSS書いてたんですが、カッコよいデザインがいいので今回はHTML5 UP!を使いました。やりたいことに注力して、専門外の部分は外から力借りるってとても大切だし、今はあらゆる側面でそれができる時代になりました。以下の記事のおかげです。ありがとう。

サーバーレスの管理問題

冒頭に挙げたQiitaの記事に書きましたが、だいーぶ四苦八苦しました。かれこれ2週間ぐらい?かかった?

例えばRDSやEC2ならオンプレで使っていたLinuxなりMySQLなりを単に置き換えたものとして扱えるわけですけど、API Gatewayなどは抽象化されたインフラなので、どんな機能を持っているのかは全部AWSの采配次第なわけです。従って当然ながらできることとできないことがあり、それをきちんと把握した上で、低コストでアーキテクチャーを設計するというのはなかなかにサービス仕様への理解が必要になります。AWSを持ち上げすぎることは、ベンダーロックインとどう違うのかという意見もありますが、まさにそれです。

使えるようになると確かにとても楽ではありますが、一方でこれに依存し切るのもどうなんだろうな、という思いがあるのも事実で。要所要所でLambda + API Gatewayを限定的に使うならまだしも、3つ4つのサービスを繋がるピタゴラスイッチになってきたら管理コストの方が高くなる可能性が強そうです。先に挙げたApexやChaliceが非常にシンプルなデプロイツールになっているのは、構成自体もシンプルに仕上げるためだと思います。Serverless Frameworkのように守備範囲の広いツールは一見便利ですが、その分カオスにもなりやすい。

サーバーレスとかマイクロサービスやりたいなら、Lambda中心に組み上げるのもいいけど、Dockerやコンテナ指向になった方が幸せになれるんじゃないかなぁ、とぼんやり考えています。いや、わかんない。今後ひょっとしたらサーバーレスを管理するための画期的ツールが現れるのかもしれないが、現時点では「使いすぎる」ことは避けたいなという思いです。構築コスト、運用コスト、さらには更改コストとはきちんと天秤にかけたいところです。