aws lambdaで作ったサーバーレスdbレスapi
TRANSCRIPT
AWS Lambda で作ったサーバーレス DB レス API
このスライドは• 22 枚です
ホームページ作った (WIP)
• React/Redux + API• コードはhttps://github.com/sambaiz/sambaiz.net(星を押すと運勢が上がる)• 個人のホームページなのでなるべく節約したかった
必要な API
• GET /articles?p= – 記事一覧 ( 日付の降順、ページング )
• GET /articles/{id}– 記事詳細
登場するサービス
EC2
• サーバー
RDS
• RDB• Amazon 謹製の Aurora が使える• MySQL 5.7 も使える
一般的な API
• EC2 がリクエストを受け取る• RDS を見にいく• レスポンスを返す
EC2 を使うと• 監視が必要 ( こわい)• そんなにリクエストこなくて無駄になるリソース(コスト)
Lambda
• イベント駆動で関数を実行できる• Node.js 4.3.2 が使えるようになった• リクエスト数とコンピューティング時間で課金
API Gateway
• Lambda を呼んだりする API を作れる
サーバーレス API
• API Gateway がリクエストを受け取る• Lambda が RDS を見にいく• レスポンスを返す
RDS を使うと• それなりにコストがかかる ( 個人の感想 )
S3
• ストレージ• Bucket と Key から Object を保存したり取得したり
サーバーレスで DB レスな API
• API Gateway がリクエストを受け取る• Lambda が S3 を見にいく– 見にいくオブジェクトはマスタデータを更新
/ 削除したときに自動的に生成しておく• レスポンスを返す
S3 を使うと• ワイルドカードが使えない– 前方一致は使える
• listObject で取れる順序が辞書順固定
ワイルドカードが使えない• id と date からなるオブジェクトがあるとして、 Key 名を article-{date}-{id} のようにすると、 article-1-* のようにはとれないので困る• でも前方一致は使えるので、例えば、 article-{date} で listObject すれば、 date のものをまとめて取得することはできる
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`;
やること (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 で読むもの
やること (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
感想• 結果には満足している
完