API-Gateway+LambdaでサーバーレスWeb APIを作って実際どうだったか
susumuis
2017/11/21 BPLL
おまえだれよ?
Webエンジニア(2004年頃〜)
ただのメイドカフェ好き(2015年〜)
メイドカフェでノマド会主催者(2016/11〜)
株式会社ビープラウドの人(2016/12〜)
Pythonでデータ分析、機械学習系のことがちょっとだけ分かる人(2017年〜)
メイドカフェでノマド会とは
メイドカフェは最高のノマド環境であることを伝える
平日日中にメイドカフェに集まって「仕事をする」会
たまに夜や土日にもする
メイドカフェを貸し切ることも
独自メイドカフェイベントやった!
メイドカフェで勉強会や読書会も開催予定!←New
メイドカフェでノマド会とは
あるサイトの想定トラフィック量
■想定最大風速: 460 [access/second]
■月間平均: 18.5 [access/second]
もし普通に構成したら
- Load Balancer, APサーバー, memcached, DBサーバー2台... 5〜10万/月くらい?
よくあるサーバーレスWeb APIの構成で提案
Aurora
API Gateway
Lambda
※性能はクエリキャッシュに期待する
サーバーレスの見積もり方 (API 呼び出し回数が大きく響く!)
APIGateway: 4.25 USD / 100万回 + データの送出 0.14 USD/GB (最初の10TB)
- 18.5 PV / sec * 2 API Call / PV�� → 4.25USD * 40 * 3600 * 24 * 30 / 100万 = 408.0 USD / mon� - + データ送出分の料金 3KB / req として 0.14 * 288GB = 40 USD
- 合計 USD: 448 = 5万くらい(呼び出し回数が大きく響く!)
Lambda: 割当メモリ1GB-秒あたり 0.00001667 USD、(無料枠 400,000 GB-秒)
- 割当メモリが512MBで、1APIが平均0.2秒でレスポンスしたとする� - 480万 GB-秒 / mon
→ 440万 * 0.00001667 = 73 USD / mon
合計:6万円くらい ←あまり安くない! ただしこれは、最大時想定なので、平均すると半分として提出
(先にネタバラシ)実際は。。。繁忙期・閑散期がある
- 15USD で収まってしまった!! ※API Gateway Lambda部分
- なぜ?想定の1/30しかPVがなかった
- プログラミング努力の結果:見積もりの10倍高速!!� => Lambda分無料枠内に収まってしまった
どんなプログラミング技術を採用したか?
- Python 3.6
- Zappa + Flask
- SQLAlchemy (クエリービルダーとして + 接続プールとして。 ORMとして)�
- とはいえ、その時々で最適な技術は変わっている可能性があるので注意!
待って!Lambda + RDS はアンチパターン?
大丈夫!
Lambda
Aurora
token / SSL
IAM Role
pool
... 2桁msec達成できた!
20PV/sec さばけた!\(^o^)/
開発で辛かったこと
- Zappaに任せればAWSをいい感じに設定してくれる? → No!!
- 権限周り:IAM設定が鬼!
- コマンドが延々エラー(;´Д`) どこで上手く行かなかったか分からない
- AWSの設定(Consoleポチポチ)を完全にコードに残すことは難しい Aさんはできたのにな...
- かといってCloud Formation、Ansibleでの完全構築自動化は1回限りの構築ではPayしない
→想定工数の、30%増しくらいになった。。。「プログラミング工数」以外での工数が多かった
リリース後どうなった?
- オープン後50日� エラーステータス: 0回� 一度もAlarm鳴らず!!� 平均レスポンス速度:� 55msec - 65msec� 瞬間最大: 7500 req / min
- アクセスが多いほど安定!?
リリース前はこのあたりでわりとブーブー鳴った!! (‘o’;
瞬間最大風速の瞬間、APIは高速になっている!!
サーバーレスを使う時の注意 (開発工数↑ / 保守工数↓)
開発工数: IAMの知識が豊富に必要になる
が、普通のエンジニアはそこそんなに詳しくないはず� → プログラミング以外のところで工数増大!
サーバー代金: 一見安くなさそう!
呼び出し回数でほぼ正確に見積り可能!� スケールアウトを考慮すると、結果安めになると思う� (←「言ってもそんなに行かないでしょう?」。。。。保証出来ないから言えない)
大規模の場合、ネットワーク構築コストを考えるとマシかも!
保守コスト: とても楽! ミドルウェアやOSレベルのメンテ・監視不要はでかい!!
サーバーレスを案件で採用するなら
- これをやったら赤字:� - 開発を従来サーバー想定で見積もり(←要件定義と並行だったりするとふわっとしてる)� - 保守をサーバーレス想定で見積もり(←開発の中盤以降に見積もるとわりと正確に見積もれる)
- でも、お客さんにとって良いもの!サーバーレスが適用できるなら積極的に利用したい
- 保守コスト低下分、設計・開発にオーバーヘッドがかかることを理解してもらう
- 日頃から AWS, GCP, Azure を使って、使い方に慣れておく� - 特にIAM(権限)周りを重点的に理解する
質疑応答
Q. LambdaなのになぜConnection Poolができるのか�A. Lambdaとはいえ内部的にはEC2があるんだろう、なので生きてくる
Q: 開発のオーバーヘッドは繰り返したら減るの?�A: 同じ技術を使うなら。� ただし次々に新しい技術が出ているので、それを利用しようとしたら同じ