はじめに
サーバレスアーキテクチャだ!と興奮しながら Kinesis, API Gateway, Lamda,DynamoDB を使ったシステムを作ったお話。
細かい設定方法は要点毎にググった方が早いと思うので、Tipsを中心に。
本構成がだれかの役に立てば幸いです。
どんなシステムか
ざっくりと、下記のような感じ。
- デバイスからデータを登録したい
- 並列でデータを登録したい(将来的に1000req/sec くらい)
- 登録したデータをWEBAPIで取得したい
- サーバ費用はお安く
要するに、
大量のデータを同時に登録できて、ついでに取得できるAPIも作ってよ。
もひとつついでに、サーバを新しく立てたくないし、保守もしたくないよ。
ってこと。
こんな要件を依頼された方はこの記事が参考になるかもしれない。
どんな構成か
データ登録は
Kinesis -> Lambda -> DynaoDB
- Kinesis Stream にデータ登録
- Lambda で Kinesis からデータ取得
- 取得データを Lambda から DyanamoDB へ登録
データ取得は
API Gateway <-> Lambda <-> DynamoDB
- API Gateway から Lambada を呼び出す
- Lambda から DynamoDB にアクセスしてデータ取得
- API Gateway でデータを返却
どうやってつくったか
Kinesis -> Lambda -> DynaoDB
デバイスからデータを投げるのであればやり方は色々ある。
私が候補に挙げたのは AWS IoT と Kinesis Stream だ。
AWS IoT ではなくKinesis を選択した。
理由はKinesis の方が安く、デバイスのシャドウとか使う要件がなかったので、IoTだと高機能すぎたから。
Kinesis へのデータ登録は Cognito を使用した方が本当はいい。
今回はクローズドデバイスだったので、 AWS SDK で Kinesis 直通にした。
- IAMロールをつくる
Lamda が Kinesis にアクセスするために、AWSLambdaKinesisExecutionRole
のポリシーをアタッチしたIAMロールを作成する。 - データ登録用の Kinesis Stream をつくる
- DynamoDB をつくる
- Lambda をつくる
1で作ったロールを割り当てる
DynamoDB への処理行うファンクションを作成 - Kinesis と Lambda を連携する
Kinesis が大量のデータを一次請けしてくれるので、同時接続は安心して任せることができる。
Kinesis に溜まったデータを Lambda でコツコツと取得して DynamoDBへ放り込む。
Kinesis にデータが溜まり過ぎ、 Lambada に一気にデータが流れ込むと、 DynamoDB の書き込みキャパシティを食ってしまうので注意。
Lambda でデータ処理が追いつかない時などに発生する(エラーとかでずっとリトライするとか)
API Gateway <-> Lambda <-> DynamoDB
Lambda で関数作って API Gateway に登録するだけでAPIができてしまう。
しかも、APIのレスポンスやリクエストも事細かに設定ができるので、Lambda は取得の関数だけに集中できる。これは楽だなと思った。
- Lambda でDBからデータ取得する関数作成
- API Gateway でアクセスポイントを作成
- API Gateway から Lambda 関数を呼び出すように設定
API Gateway はかなりクセがある。
正直未だに全貌がわかっておらず、何がどこまでできるのわからない。
REST API を作る程度であれば瞬殺でいける。
つくってみて
一度やり方がわかれば爆速で開発ができそうだ。
何よりインフラのことを気にしないで、開発に集中できるのが素晴らしい。
実際に稼働させてみても大きな問題も発生せず安定おり、何かあっても即座にリソースコントロールできるのも安心だ。
ぜひみんなも使ってみてほしい。
Tips
以下、実装時に書いたQiitaの記事。
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を有効にするには設定が必要