Slide 1

Slide 1 text

Clojure on AWS Lambda 2016-05-31 fumihiko hata

Slide 2

Slide 2 text

自己紹介 @hatappo server side engineer Java, Ruby, stylerecipe, inc. ファッション相談&ファッションレシピのモバイルアプリ「sutarepi」

Slide 3

Slide 3 text

モバイルアプリ「sutarepi」 ● コーディネートやファッションについて、プロのスタイリストに相談。 ● 手持ちの洋服からコーディネートを考えるためのレシピ。これもプロのスタイリ ストが作成してる。 サービス

Slide 4

Slide 4 text

使っている技術 client side iOS App with Titanium → Android app & new iOS app is comming soon. server side PHP5, CodeIgniter AWS, WindowsAsure

Slide 5

Slide 5 text

サーバーサイド ● もともと外注。自分が入社するくらいに内製に切り替わった。 ● データ設計 ○ カーディナリティが 1 のカラムがたくさんある。 ■ created_by や updated_by といったカラムが散見されるが、固定文字列がただただ入ってい たり ○ ステータス系のカラムが多く、複雑で不明瞭な状態遷移。 ● テストコード ■ ない。まれに見かけるが、プロダクトのコードと同じファイルにあったりする。 ● パッケージ管理 ■ ない。最近のPHPだとcomposerとか。

Slide 6

Slide 6 text

商品Crawling ● 提携ECサイトの商品情報を毎日クローリングし、格納している。 ○ コーディネートの作成や、相談の回答に使用できる。 ○ ファッション・レシピの素材に使用できる。

Slide 7

Slide 7 text

商品Crawling::相談

Slide 8

Slide 8 text

商品Crawling::レシピ

Slide 9

Slide 9 text

商品Crawling クローリング処理は、(また別の開発会社の)外部システム上で稼働し、日次でCSVが納 品され、弊社のDBにインポートされる。 しかし、クローリングから漏れている商品が、ある。 ● 商品情報を手動で追加&編集する方法がなかった。 → AWS LambdaとAPI Gatewayで作ることに。

Slide 10

Slide 10 text

AWS Lambda AWS Lambda は、コードを AWS Lambda にアップロードすると、サービスが AWS インフラストラクチャを使用してコードの実行を 代行するコンピューティングサービスです。コードをアップロードして、Lambda 関数と呼ばれる関数を作成することで、AWS Lambda がコードを実行するサーバーのプロビジョニングおよび管理を行います。AWS Lambda は次のように使用できます。 https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/welcome.html

Slide 11

Slide 11 text

AWS API Gateway 簡単に API の作成、配布、保守、監視、保護が行えます。AWS マネジメントコンソールで数回クリックするだけで、 Amazon Elastic Compute Cloud (EC2) で稼働中のワークロードや、AWS Lambda で稼働中のコード、または任意の ウェブアプリケーションといった、バックエンドからのデータ、ビジネスロジック、機能にアクセスする、アプリケーション の玄関として振る舞う API を作成できます。 100 万回の API 呼び出しの受信につき 4.25 USD のレートに、データの送出の費用がギガバイト単位で加算されま す。 https://aws.amazon.com/jp/api-gateway/

Slide 12

Slide 12 text

商品Crawling::マニュアル登録 1. 管理画面に、商品を入力&編集画面(new) 2. 登録したい商品ページを入力すると、 3. スクレイピングAPIサーバ(new)にURLを送信。 4. APIサーバはリクエストされた商品ページをスクレイピングして返す。 5. 画面は、レスポンスをフォームに入力。 既存のサーバのコードにこれ以上機能を追加したくなかったので、スクレイピング機能 自体は分離した。

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

商品Crawling:: クローラ ● 商品情報(〜数十万件/ECサイト)を網羅的にクローリングするバッチもリライトする ことに。 → これも AWS Lambdaで作ることに。

Slide 15

Slide 15 text

商品Crawling:: クローラ 1. Lambadは crontab のようなスケジュール起動が可能。 2. 既に作ったスクレイピング機能のAPIサーバのLambdaの実装を拡張。 3. 2ステップ a. 提携ECサイトから商品ページの URLを収集する。 b. 上記収集したURLを順にアクセスしていって、商品情報を収集し DynamoDBに永続する。 4. Lambdaは実行時間が300秒を超えるとTimeoutする。 → 経過秒数を確認しながら、Timeoutする少し前に次のLambda Functionを起動し て処理がチェーンするように。 (こちらはまだ開発中・・・)

Slide 16

Slide 16 text

● ちょっと、無理があったかも。 ● 仕組みが結構複雑に。 ● Lambda Functionをチェーンするところでなにか起きると無限ループになったり、変 なプロセスが残ったりするかも。。 とりあえず、Clojure on Lambda でサーバアプリケーションもバッチ処理も書けることは 分かった。

Slide 17

Slide 17 text

Tools ● Clojure ○ https://github.com/mhjort/lein-clj-lambda Lambda functionの作成や更新(デプロイ) ○ https://github.com/trieloff/lein-aws-apigateway API Gatewayの設定のImport/Export ○ https://github.com/uswitch/lambada Lambda Functionを簡単に作るためのマクロ ● ClojureScript ○ https://github.com/nervous-systems/cljs-lambda ● Node.js ○ https://github.com/serverless/serverless

Slide 18

Slide 18 text

良かった所 ● デプロイが楽。AWSのAPI叩くだけ。(herokuの方が楽かもしれないが) ● サーバもバッチもLambdaでやれる(ような)。 ● サーバの管理が不要。 ● 安い。アクセスがなければ課金されない。 ○ 課金時間の最小単位 ■ EC2: 3,600,000ms ■ Lambda: 100ms (1/3万6000)

Slide 19

Slide 19 text

良くなかった所(1)::First call penalty ● コンテナの起動が必要な1リクエスト目がとても遅い。特にJVM。

Slide 20

Slide 20 text

良くなかった所(1)::First call penalty http://numergent.com/2016-01/AWS-Lambda-Clojure-and-ClojureScript.html

Slide 21

Slide 21 text

良くなかった所(1)::First call penalty ● メモリ割り当てを増やせばある程度は対処できるが、それだと値段も上がる。

Slide 22

Slide 22 text

良くなかった所(2)::Testing API Gateway ● API Gatewayをモックするローカルツールがないので、テスト難しい。 (Lambdaは単なる関数なので、ローカルでテストは容易) ただし、設定をswaggerでExport/Importできるので何かできるかも。 あるいは、そのうちAWS側から出てきそう。

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

良くなかった所(3)::パッケージ容量制限 ● Lambda 関数デプロイパッケージのサイズ 50 MB ● デプロイパッケージに圧縮できるコードのサイズ 250 MB ● リクエストあたりの最大実行時間 300 秒 → 長いバッチ処理は素ではできない。 ● 同時実行数上限のデフォルト値 100 ■ ※ 申請で拡張可能。 https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/limits.html

Slide 25

Slide 25 text

まとめ Clojureを小さく導入するのに Lambda が便利(AWSを使っている場合に限る)。 ただし、制限が多い。

Slide 26

Slide 26 text

以上です。 ありがとうございました。