ラベル AWS の投稿を表示しています。 すべての投稿を表示
ラベル AWS の投稿を表示しています。 すべての投稿を表示

2018年6月14日木曜日

【AWS Lambda】Lambda コスト節約論

株式会社ジェニシス 技術開発事業部の遠藤 太志郎(Tacy)です。

最近、AWSをフル活用して社内システムを作ったので、そのノウハウのご紹介を行っています。

今回は気になるニュースを見たので雑談です。

ダイソーで予算超過危機が発生したらしい

ダイソーでLambdaを使ったら年間数千万円のコスト超過に陥るピンチになったらしいですね。


原因は Amazon DynamoDB だそうな。

Lambda と DynamoDB のコスト面での違い

記事を読むと、リスクの原因はLambdaとDynamoDBではコスト面の思想が違うことがキモであるようですね。

Lambdaは従量課金制

私がLambdaに着目する最大の理由ですが、Lambdaは使った分だけ支払う従量課金制です。

Lambdaではない通常のレンタルサーバの場合、サーバを丸ごと一台を借りて占有してしまうわけですから、使っていてもいなくても占有リソースは一定、従って料金は一定です。
つまり、夜中とか誰も使っていない時間帯でも金はそのまま取られているってことですよ。

想定される処理の最大負荷が8と仮定して、それに備えてサーバには10のリソースを割いているとします。
すると、サーバリソースは以下のように消費されます。

レンタルサーバの場合のリソース無駄使い
レンタルサーバの場合のリソース無駄使い

水色の部分が実際に必要なリソース。
グレーの部分はお金をドブに捨てている部分です。

負荷の最大/最小の差が大きいほど、このグレーゾーンは大きくなります。
「日中しか使わない社内システム」とか「人気ゲームの発売日直後だけ忙しくなる攻略Wiki」とか、かなり勿体ない使い方をしていると思います。

対して、Lambdaの場合はこんな感じ。

Lambdaの場合は無駄遣いが殆ど無い

グレーゾーンが殆どありません。

全く無いとは言いませんが、かなり細かい粒度で節約してくれるわけです。
素晴らしい。

DynamoDBは性能ベース

DynamoDBは「プロビジョニングベース」と言いまして、プロビジョニングとは何なのかはさておき、話の趣旨としては要するにこういうことです。

レンタルサーバの場合のリソース無駄使い
DynamoDBの場合のリソース無駄使い
DynamoDBは従量課金制ではない。

つまり、

  • APサーバであるLambdaは従量課金制かもしれないが、DBサーバであるDynamoDBは従量課金制ではない。
  • ダイソーのレジは「忙しい時間帯」と「暇な時間帯」があって、DynamoDBは暇な時間帯でも忙しい時間帯と同じ料金を取られる。
  • だからDynamoDBがコスト超過に陥る。

なんてこった。

どうすれば良いのか?

ダイソーの場合

クラウドの面白い所であるが欠点でもあるという所だと思いますが、クラウド環境ってこういう従来方式であれば考えなくて良い制約ってものがあるんですよ。

それを克服出来るかどうかがエンジニアの腕の見せ所。

記事を見ると、ダイソーの場合はLambdaを遅延させることでDynamoDBの最大負荷を下げて解決したようです。

リアルタイム性が必要無いのであれば、そのようなキュー方式を採用するのも一つのアイデアですね。

勉強になります。

S3を使ってはどうか?

ダイソーのキュー方式作戦は一つの正解だったと思いますが、要点はこういうことですよね。

  • 出来る限りDynamoDBの負荷を下げなければならない。

核心部分としては、DBサーバの負荷を下げる為のプログラムチューニングなわけですよ。

この記事を見た時は、私は直観で「DBを節約したいなら、ファイルでやればどうか?」と思いましたね。

昔、クラウドではないオンプレミス環境のシステムを作った頃の経験なんですけど、私は大量データ収集配布処理を作ったことがあるんですよ。
あの時は「DBで持つ情報」と「ファイルで持つ情報」を分類して管理していました。

  • データはDBではなくファイルで持つ。

この作戦です。

ファイルサーバに相当するAmazon S3は従量課金制だから、DynamoDBみたいボトルネックにはなりません。

ファイルで持つ情報

ファイルで情報を持つ大前提は「ファイルパスが一意キーである」ことです。

DBの用語で表現をするならば、主キー検索だけでしかアクセスしない情報はファイルで持てば良いのです。

DBで持つ情報

DBで持つ必要のある情報は、SQLですね。
「検索フォームから条件を入れて検索したい」とか「group by したい」みたいなSQLの機能があってこそ実現可能な要件のあるデータはDBで持つしかありません。

まあDynamoDBはNoSQLなのでちょっと違いますが、いずれにせよDynamoDBの中になければ使えない機能が必要なのであれば、DynamoDBに持つしかないです。

ダイソーはきっとこっちだったのでしょうね。

冗長に持つ

これは褒められた手段ではありませんが、状況によっては「殆ど主キー検索で使用するデータだけど、ちょっとだけgroup by したい時もある」みたいなケースもあります。

そういう時は、もう腹をくくって同じデータをファイルとDBの二重で持つのも一つの判断です。
データの不整合の余地を残すという弱点が生まれてしまいますが、チューニングには何かを犠牲にするという判断が必要になる時もあります。

ディスク使用量は問題ではない

私の経験則を一つ。
負荷という面において「ディスク使用量」というのは問題にはならんですよ。

あくまで一般論ですが、システムにおいて「ディスクスペース」ってのは安くて余裕があるものなのです。
だからディスクスペースを無駄遣いする代わりに別の部分を高速化するという手法は常套手段としてよく使います。

Amazonの場合もそうで、ファイルスペースであるS3に巨大データが居座っていることは問題にならんです。

  • 0.023USD/GB

1TB使って月23ドル
プロジェクト全体の予算から考えればゴミみたいなものでしょう?
低アクセス領域におけばもっと安い。

チューニングにおいては「どこがクリティカルなのか?」ということを分かっていなければなりません。

注意点ですが、ネットワーク転送量は別の話です。

大量データをS3に置いておくだけなら易いですが、それを無数のユーザにダウンロードさせるようなことをすると、ネットワーク料金がかさんで破産します。
だからダウンロード用データはAmazonではなく別の定額制の場所に置くとか、CDN(コンテンツデリバリネットワーク)を使うとかいった工夫が必要になります。

まあ、そこまで話が伸びるとキリが無いのでここで終わり。

まとめ

ここまで書いて思うこととしては、

  • クラウドはロジック効率がコストに跳ね返ってくる。

ということですね。

丸ごとドーンとサーバを貰っちゃってるオンプレミスとは条件が違いますから、処理効率を考案するアーキテクトの力量が非常に重要です。

ありとあらゆる創意工夫を総動員して総合的に効率的なシステムを構築しなければなりません。

となると、「実装が出来るだけ」みたいなドカタが背負えるようなものでは到底なくて、実装・DB・ネットワーク・AWS特性など色々な側面を平行して考慮出来るフルスタックエンジニアが求められてくるという……。

全く、IT業界は楽じゃないですね。

2018年3月19日月曜日

Pythonで社内システムを作ってみた~序章~

株式会社ジェニシス 技術開発事業部の遠藤 太志郎(Tacy)です。

先週まで勉強を兼ねて、PythonとGoogleの機械学習API「CLOUD NATURAL LANGUAGE API」の連載を行っていましたが、
おかげ様で何とか感触を掴めてきました。

しかし「勉強の為の勉強」だと、どうもピントがぼやけた調査になってしまうのが現実のところ。
そこで「社内システムの開発」を想定して、ちょっくらPythonで社内で使えそうなシステムを作ってみようと考えるに至り、ようやくある程度の形になってきたところです。

そこで、今回より新シリーズ「Pythonで社内システムを作ってみた」を始めていきたいと思います。

着想

テーマとして選んだのはSEならみんなお馴染みの、「業務経歴書」です。

弊社の業務経歴書はIT界で悪名高い神エクセルの類です。

エクエルに各自書き込むという方式なので記述粒度が人によって合ってなかったり、印刷してみると微妙に見切れちゃってたり、
とか細々とした問題が多いという感覚が現場の実感としてありました。

私の業務経歴書はこんな感じ。(ちょっとだけお見せします)



一見すると綺麗ですが、これがエクセルで、実は問題もあるんですよ。

デザインの改善点の指摘もあるのですが、何せ全員が各自個別にエクセルファイルを持っている形ですから、
デザイン変更したくても全員が同じようにレイアウト変更作業をやるのは大変だから二の足を踏んだりとか、
やっぱり「個別管理」「エクセル形式」というのは、手っ取り早いのは良いですけど長期的管理体制には不向き。

そこで私は「これをWebシステム化して一元管理したら業務改善になるんじゃないかな?」と考えるに至ったわけです。

課題

「Webシステム化する」と言うだけなら簡単ですが、それをソリューションとしてビルドアップするのは中々ハードルが高いです。
開発進行過程で課題になった点をご紹介しましょう。

言語はPython

これは課題と言うより「前提」ですが、言語は最初からPythonにしようと思っていました。
そもそもはPythonの勉強から始まっている、というのも大きいですが、もう一つの理由としては「優遇」があります。

プログラミング視点では「小規模Webシステムなんてどんな言語使っても対して変わらん」というのが実際のところですが、環境面だと意外にそうでもないです。

過去の連載で私はGoogleAppEngineを使用し、ネタバレになりますが今回はAWSを使用しましたが、その所感としてPythonはクラウド界で優遇されています。

クラウドサービスは言語を指定されている製品がありまして、「この製品はPythonは使えるけでRubyは未対応」など、クラウド製品の都合で言語が縛られるケースがあります。
そんな中、Pythonは常に対応していました。

  • とりあえずPythonならばクラウドはOK

私は寄らば大樹の陰という主義のエンジニアですが、Pythonは寄って安心の大樹だと思います。

基盤

基盤は「クラウド+サーバレス(従量課金制)」しか無いと最初から思っていました。

この業務経歴書管理システムは、その性質上、業務経歴が書き換わるタイミングしか出番が来ないものです。
個人単位だと数ヶ月~数年に一度しか使いません。

そんなシステムの為にサーバを常駐させておくなんてのはコスト的にあり得なくて、システムを使うときだけ費用が発生する従量課金制のクラウド・サーバレスサービスしか無いというのは自明の理でした。

サーバレスサービスは、やはり以前に連載していたGoogleAppEngineが業界代表格でしょう。
この連載の中で別のシステムを作っていましたから、「サーバレスとはどういうものか?」「どういう時に出番が来るのか?」という知見はありました。

今回は同じサーバレスでも別製品、AWSのサーバレスを使うことにしました。
GoogleではなくAWSにした理由は、弊社の方針ですね。
今後、弊社ではAWSに力を入れていこうという方針があるので、そこに乗っかることにしました。

特にAWSの方がGoogleより向いている何かがあったわけではありません。
しかし、あっちこっちの技術に手を伸ばしていると片手落ちになってしまうので、合わせられる部分は合わせよう、とAWSにすることにしました。

Webシステム・フレームワーク

「PythonでWebシステムを作るとしたら、フレームワークはどうしよう?」と思いました。
調べてみると「django(ジャンゴ)」というフレームワークが見つかったのでコレにしました。

と言うか、PythonのWebシステム界ではdjangoが支配的地位です。
django以外の選択肢なんかありません。


帳票出力

最大の問題点。
業務経歴書は印刷して面談に持って行くという紙媒体が運用上絶対に外せない要件です。

  • Webだけなら誰でも出来る。
  • 印刷はどうすりゃいいんだ!?

帳票出力は技術的最大のハードルです。

  • Yahooの時刻表印刷みたいにWeb画面を印刷する。
  • 現在と同じくExcelを出力する。
  • PDFで出力する。

色々考えて検証しましたが、これらにはそれぞれ問題点があって解消出来ませんでした。

  • Web画面印刷⇒ブラウザ依存でどうしても微妙に見栄えが変わってしまう。
  • Excel印刷⇒印刷時の見切れに対応出来ない。
  • PDF⇒柔軟性が無さ過ぎる。例えば営業が「ちょっと急ぎ手直ししたい」という状況が発生した時に書き換えられない。

これらを踏まえて、最終的に「Wordで出力する」という仕様に結論付けました。

Word出力もこれはこれで難しくて。。。
最初はPythonでやろうとしましたが、どうしても実現不可能なケースがあったので、Pythonは諦めてココだけJavaでやることにしました。

Word出力の奮闘記は後の連載でご紹介します。


システム構成

そんなこんなで試行錯誤した結果、以下のようなシステム構成図でまとまりました。



大きく「Webシステム」と「帳票出力API」に二分割されています。

終わりに

今後はシステム構築に至るまでの過程やノウハウの連載を始めていきたいと思います。


  • Webシステム実装:Python&Django編
  • Webシステムインフラ:AWS Elastic Beanstalk編
  • 帳票出力API実装:Apache POI編
  • 帳票出力APIインフラ:AWS Lambda編


システム全体としては色々と詰め込まれていますが、それぞれ非常に疎結合となっています。

「ベンダーロックオン」と言いまして、クラウドの話をすると以後ずっとそのクラウドから抜け出せなくなることを気にされるケースがありますが、作ってみたところ、別にそんなことは無さそうでした。

ログ出力の設定とか多少のことはありますが、「作ったアプリのインフラを別のところに引っ越したいんだけど?」となった場合でも、特に問題にはならない規模です。

従って、連載を進めていく上で「インフラ編を読んだ後じゃないと実装編の意味が分からない」とかにもならないと思います。

連載は、システム規模が


  • Webシステム>>>帳票出力API


なので、まずは手短な帳票出力API編から始めていきたいと思います。