aws lambdaで作ったサーバーレスdbレスapi

22
AWS Lambda でででで でででででで DB でで API

Upload: taiki-sakamoto

Post on 07-Jan-2017

826 views

Category:

Engineering


0 download

TRANSCRIPT

Page 1: AWS Lambdaで作ったサーバーレスDBレスAPI

AWS Lambda で作ったサーバーレス DB レス API

Page 2: AWS Lambdaで作ったサーバーレスDBレスAPI

このスライドは• 22 枚です

Page 3: AWS Lambdaで作ったサーバーレスDBレスAPI

ホームページ作った (WIP)

• React/Redux + API• コードはhttps://github.com/sambaiz/sambaiz.net(星を押すと運勢が上がる)• 個人のホームページなのでなるべく節約したかった

Page 4: AWS Lambdaで作ったサーバーレスDBレスAPI

必要な API

• GET /articles?p= – 記事一覧 ( 日付の降順、ページング )

• GET /articles/{id}– 記事詳細

Page 5: AWS Lambdaで作ったサーバーレスDBレスAPI

登場するサービス

Page 6: AWS Lambdaで作ったサーバーレスDBレスAPI

EC2

• サーバー

Page 7: AWS Lambdaで作ったサーバーレスDBレスAPI

RDS

• RDB• Amazon 謹製の Aurora が使える• MySQL 5.7 も使える

Page 8: AWS Lambdaで作ったサーバーレスDBレスAPI

一般的な API

• EC2 がリクエストを受け取る• RDS を見にいく• レスポンスを返す

Page 9: AWS Lambdaで作ったサーバーレスDBレスAPI

EC2 を使うと• 監視が必要 ( こわい)• そんなにリクエストこなくて無駄になるリソース(コスト)

Page 10: AWS Lambdaで作ったサーバーレスDBレスAPI

Lambda

• イベント駆動で関数を実行できる• Node.js 4.3.2 が使えるようになった• リクエスト数とコンピューティング時間で課金

Page 11: AWS Lambdaで作ったサーバーレスDBレスAPI

API Gateway

• Lambda を呼んだりする API を作れる

Page 12: AWS Lambdaで作ったサーバーレスDBレスAPI

サーバーレス API

• API Gateway がリクエストを受け取る• Lambda が RDS を見にいく• レスポンスを返す

Page 13: AWS Lambdaで作ったサーバーレスDBレスAPI

RDS を使うと• それなりにコストがかかる ( 個人の感想 )

Page 14: AWS Lambdaで作ったサーバーレスDBレスAPI

S3

• ストレージ• Bucket と Key から Object を保存したり取得したり

Page 15: AWS Lambdaで作ったサーバーレスDBレスAPI

サーバーレスで DB レスな API

• API Gateway がリクエストを受け取る• Lambda が S3 を見にいく– 見にいくオブジェクトはマスタデータを更新

/ 削除したときに自動的に生成しておく• レスポンスを返す

Page 16: AWS Lambdaで作ったサーバーレスDBレスAPI

S3 を使うと• ワイルドカードが使えない– 前方一致は使える

• listObject で取れる順序が辞書順固定

Page 17: AWS Lambdaで作ったサーバーレスDBレスAPI

ワイルドカードが使えない• id と date からなるオブジェクトがあるとして、 Key 名を article-{date}-{id} のようにすると、 article-1-* のようにはとれないので困る• でも前方一致は使えるので、例えば、 article-{date} で listObject すれば、 date のものをまとめて取得することはできる

Page 18: AWS Lambdaで作ったサーバーレスDBレスAPI

listObject で取れる順序が辞書順固定• 今回のように日付の降順で取りたいような場合工夫が必要function orderByDateDesc(date) { let n = (new Date().getTime() + "").length; return (Array(n+1).join("0") + (Math.pow(10,n) – new Date(date).getTime())).slice(-1 * n) } const ID_DATE_KEY = (id, date) => `${ID_DATE_KEY_PREFIX}-${orderByDateDesc(date)}-${id}.json`;

Page 19: AWS Lambdaで作ったサーバーレスDBレスAPI

やること (PUT)

Article bucket Gen bucket

{key}.json (metadat

a)

{key}.md (article detail)

article-id-{id}.json

article-id-date-

{date}-{id}.json

Article-page{pag

e}.json

article-origin-key-to-id-date-{key}.json

実際に API で読むもの

Page 20: AWS Lambdaで作ったサーバーレスDBレスAPI

やること (DELETE)

Article bucket Gen bucket

{key}.json (metadat

a)

DELETED

article-id-{id}.json

article-id-date-

{date}-{id}.json

Article-page{pag

e}.json

article-origin-key-to-id-date-{key}.json

Page 21: AWS Lambdaで作ったサーバーレスDBレスAPI

感想• 結果には満足している

Page 22: AWS Lambdaで作ったサーバーレスDBレスAPI