「みんなの音楽コンシェルジュ」APOLOのアーキテクチャについて
みなさんAPOLOというサービスをご存知でしょうか。
APOLOとはLINE,Messenger上で気軽に音楽が聴けるサービスでして、聴きたい音楽や、今の気分をチャットで送るとその音楽がリコメンドされて返ってきて、最高にハイになれるサービスです。
例えば、ポアルンのおすすめから選ぶを押すと、気分が聞かれるのでこのようにいい気分!と答えると楽しい時に聴く曲をリコメンドします。
ぜひとも友だちになってみてください。(友達を欲しています)
HP: http://apolochat.com/
Twitter: https://twitter.com/APOLO_JP
LINE: https://line.me/R/ti/p/%40yeg5108w
今回はこのサービス「APOLO」の裏を支えているアーキテクチャについてお話します。
1,全体図
APOLO全体図はこのようになっています。
今回DBにはユーザーの送信するチャットログ、視聴楽曲データ、お気に入りに追加した楽曲データ全てをデータベースに格納したかったため、スケールアウトさせやすいNOSQLを使用。
その中でも特にアクセス急増にも設計変更不要で、高速にDBにアクセスできるDynamoDBを使いました。
そして今回僕がDBを設計する上で重視したのが「サーバーレス」です。
2,サーバーレスについて
「サーバーレス」とは、サーバーを自前で用意する必要がなくマネージドサービスを使うことによってシステムを構築することができるアーキテクチャのことです。
通常ユーザーのリクエストをDBに格納するスクリプトもEC2インスタンスサーバーを立て、EC2インスタンスサーバーを管理する必要があるのですが、今回使っているlambdaを使えばEC2インスタンスをわざわざ立てる必要はなくなります。(webhookのEC2インスタンスはAPOLOアプリケーションを稼働させているEC2インスタンスで、ここではlamdaは不向きなためつかいませんでした)
またEC2では常時稼働している間は課金されてしまうのですが、lambdaであれば使用した回数分だけの課金でとてもお得です。
EC2で解決しようとすると何個もEC2インスタンスを立ててしまいがちになりほとんどAPI呼び出しがされないインスタンスまで稼働分の課金がされ無駄な出費がでてしまいます。
ですが、そこをlamdaでできれば使用した分だけの課金なので、あまりAPI呼び出しがされないAPIについてはほとんど出費がかかりません。
こうすることにより、サーバーの運用、保守がいらず、コストを下げることが出来ました。
また今回DynamoDBにデータを格納するAPIはPythonで書いたのですが、PythonでlamdaAPIを作る際にとても便利なZappaというフレームワークを使いました。(https://github.com/Miserlou/Zappa)
Zappaは数行コマンドラインに打ち込むだけでpythonで書いたスクリプトをAPIGatewayを通して簡単にlambdaと繋げてくれる天才フレームワークです。
EC2インスタンスを立ち上げるより簡単にAPIGatewayでAPI化できます。
APIキーの設定などもAPIgatewayでキーを作りzappa.settingsで設定を変えるだけで比較的簡単に設定することができます。
サーバーレスアーキテクチャをlambdaで作る時には見てみてください。
個人的にはAWSのAPIスクリプトを書くときにはAWS SDKを使うよりboto3などのフレームワークを使うほうがコード量を短くできすっきりと書けるのでおすすめです。
*ただまだ現在通信できる容量に制限があり、3rdpartyが必要なAPIスクリプトはもしかしたら容量オーバーになり、API化できないかもしれないので注意して下さい
それにしても今回サーバーレスアーキテクチャを使用したことでDB運用はとてもコストを抑えられました。
一番APOLOのインフラでお金がかかったのは感情楽曲のDBが入っている「RDS」でした。(RDSはlamdaとの相性が悪いのでEC2を使用しました)
サーバーレスはMicroSoftではAzure Functions、IBMではIBM OpenWhisk、GoogleからはGoogle Cloud Functionsなど今までさまざまなサーバーレスマネージドシステムが登場し2017年はもっと盛り上がってくると思います。
急なアクセス急増にも対応してくれる便利な代物なのでまだ使ったことがない人は一度使ってみて下さい。(一番lambdaが使い始めやすいと思います。)
3,最後に
また最後にですが最近試しにAPOLOに画像を送ると送った写真の顔にポアルンを貼り付けて返すという画像処理のAPIも組み込んでみました。
この機能を使えば岡山の奇跡桜井日奈子もあっという間にポアルンになります。
ぜひとも自分の顔写真でも送ってみて下さい。
余談:EC2を使う上で失敗したこと
APOLOではチャットからユーザーがどんな感情か判定する感情判定API、人間の感情に合わせたおすすめの楽曲DB、また最後にも書きますが画像加工のAPIなど複数のAPIとつなげております。
最初感情判定APIなどバージョンが変わるときなどに新しいバージョンのスクリプトも同じEC2内に立てようとしたのですが、これだとデプロイ時にややこしくなり、かつ旧バージョンを止めるタイミングが難しくなってしまいました。
そのため最初からEC2インスタンスを分けて新しいバージョンをデプロイすればよかったです。
サーバーレスについての記事: