読者です 読者をやめる 読者になる 読者になる

dskst's diary

Life and Tech Blog

AWS/Kinesis + API Gateway + Lambda + DynamoDB を使ってみた

AWS

はじめに

サーバレスアーキテクチャだ!と興奮しながら Kinesis, API Gateway, Lamda,DynamoDB を使ったシステムを作ったお話。
細かい設定方法は要点毎にググった方が早いと思うので、Tipsを中心に。

本構成がだれかの役に立てば幸いです。

どんなシステムか

ざっくりと、下記のような感じ。

  1. バイスからデータを登録したい
  2. 並列でデータを登録したい(将来的に1000req/sec くらい)
  3. 登録したデータをWEBAPIで取得したい
  4. サーバ費用はお安く

要するに、

大量のデータを同時に登録できて、ついでに取得できるAPIも作ってよ。
もひとつついでに、サーバを新しく立てたくないし、保守もしたくないよ。

ってこと。

こんな要件を依頼された方はこの記事が参考になるかもしれない。

どんな構成か

f:id:dskst9:20160716214228p:plain

データ登録は

Kinesis -> Lambda -> DynaoDB

  1. Kinesis Stream にデータ登録
  2. Lambda で Kinesis からデータ取得
  3. 取得データを Lambda から DyanamoDB へ登録

データ取得は

API Gateway <-> Lambda <-> DynamoDB

  1. API Gateway から Lambada を呼び出す
  2. Lambda から DynamoDB にアクセスしてデータ取得
  3. API Gateway でデータを返却

どうやってつくったか

Kinesis -> Lambda -> DynaoDB

バイスからデータを投げるのであればやり方は色々ある。
私が候補に挙げたのは AWS IoT と Kinesis Stream だ。

AWS IoT ではなくKinesis を選択した。
理由はKinesis の方が安く、デバイスのシャドウとか使う要件がなかったので、IoTだと高機能すぎたから。

Kinesis へのデータ登録は Cognito を使用した方が本当はいい。
今回はクローズドデバイスだったので、 AWS SDKKinesis 直通にした。

  1. IAMロールをつくる
    Lamda が Kinesis にアクセスするために、 AWSLambdaKinesisExecutionRole のポリシーをアタッチしたIAMロールを作成する。
  2. データ登録用の Kinesis Stream をつくる
  3. DynamoDB をつくる
  4. Lambda をつくる
    1で作ったロールを割り当てる
    DynamoDB への処理行うファンクションを作成
  5. Kinesis と Lambda を連携する

Kinesis が大量のデータを一次請けしてくれるので、同時接続は安心して任せることができる。
Kinesis に溜まったデータを Lambda でコツコツと取得して DynamoDBへ放り込む。

Kinesis にデータが溜まり過ぎ、 Lambada に一気にデータが流れ込むと、 DynamoDB の書き込みキャパシティを食ってしまうので注意。
Lambda でデータ処理が追いつかない時などに発生する(エラーとかでずっとリトライするとか)

API Gateway <-> Lambda <-> DynamoDB

Lambda で関数作って API Gateway に登録するだけでAPIができてしまう。
しかも、APIのレスポンスやリクエストも事細かに設定ができるので、Lambda は取得の関数だけに集中できる。これは楽だなと思った。

  1. Lambda でDBからデータ取得する関数作成
  2. API Gateway でアクセスポイントを作成
  3. API Gateway から Lambda 関数を呼び出すように設定

API Gateway はかなりクセがある。
正直未だに全貌がわかっておらず、何がどこまでできるのわからない。
REST API を作る程度であれば瞬殺でいける。

つくってみて

一度やり方がわかれば爆速で開発ができそうだ。
何よりインフラのことを気にしないで、開発に集中できるのが素晴らしい。

実際に稼働させてみても大きな問題も発生せず安定おり、何かあっても即座にリソースコントロールできるのも安心だ。
ぜひみんなも使ってみてほしい。

Tips

以下、実装時に書いたQiitaの記事。

qiita.com

qiita.com

qiita.com

qiita.com

qiita.com

Tips for Kinesis Stream

  • シャードという単位で同時書き込み数が決まる
  • 1シャードと 1000req/sec で書き込みが可能
    書き込みする容量にもよるので注意
  • 最大25000req/secまで耐えれる
  • 書き込んだデータは24時間 Kinesis に保存される
    別途申請することで24時間以上も可能

Tips for Lambda

  • とにかく関数を登録すると動作する
  • バージョニング機能がある
  • バージョニングをエイリアスと紐付けれる
  • メモリ、CPUを変更できる

Tips for DynamoDB

  • 書き込みキャパシティ、読み込みキャパシティユニットは同時書き込み、読み込みと解釈する
  • Cloud watch 上は分間表示なのでキャパシティ計算の際は注意
  • 登録データの自動パージ機能はない、今後できるようになることを切実に願う

Tips for API Gateway

  • リクエスト、レスポンスなど柔軟にカスタマイズ可能
  • ステージを分けてデプロイが可能で、ステージごとに紐づくLambdaのエイリアスを設定できる
  • CORSを有効にするには設定が必要