Serverless Meetupというイベントで話してきた
Serverless Meetup Tokyoというイベントで「LambdaとDynamoDBでIoTバックエンド開発」をテーマにスピーカーをしてきました。
内容としては、現在取り組んでいるプロジェクトの開発スタイルを紹介したもので、いろいろざっくばらんにリアルなところを話すというのを意識しました。思ったより「うちも同じようなことで悩んでるんです」みたいにいってくださる方がいてよかったです。
口頭で話したことなどをここでも少し補足しておこうかなと思います。
=>実際は、これに加えてプッシュ通知や、IoT Jobによるデバイスファームウェアのアップデート、外部APIとの連携など、もうちょっと複雑です。
=>現状だと、DynamoDBはCloudFormationで管理していません。
=>スライドに載せられなかったコードを少し紹介します。
例えば、レコードの検索でフィルタを追加するために、構造体を用意しています。
type FilterBuilder struct {
Expr []string
Arg []interface{}
}
func (f *FilterBuilder) Op(path string, op Operator, arg interface{}) *FilterBuilder {
return f.Append(
fmt.Sprintf("'%s' %s ?", path, op),
[]interface{}{arg},
)
}
func (f *FilterBuilder) Equal(path string, arg interface{}) *FilterBuilder {
return f.Op(path, EQ, arg)
}
func (f *FilterBuilder) Between(path string, arg1 interface{}, arg2 interface{}) *FilterBuilder {
return f.Append(
fmt.Sprintf("'%s' BETWEEN ? AND ?", path),
[]interface{}{arg1, arg2},
)
}
func (f *FilterBuilder) In(path string, args ...interface{}) *FilterBuilder {
binds := strings.Join(strings.Split(strings.Repeat("?", len(args)), ""), ",")
return f.Append(
fmt.Sprintf("'%s' IN (%s)", path, binds),
args,
)
}
これは以下のように使います。
// GetMessagesByDeviceID デバイスに紐づくメッセージ一覧を取得
func GetMessagesByDeviceID(deviceID uint64) ([]*Message, error) {
fb := filterbuilder.NewFilterBuilder()
fb.Equal("DeviceID", deviceID)
messages, err := GetMessages(fb)
if err != nil {
return nil, err
}
return messages, nil
}
このように直感的にコードを書ける仕組みがたくさんあったりします。
=>MQTT Topicは、「クラウド=>デバイス」ならCommand、「デバイス=>クラウド」ならTelemetryと一概にくくることはできないときが実際には起こりそうかなと思っています(いまのプロジェクトではなさそうなのですが…)。このへんは機械的に判断せず、しっかり理解する必要がありそうです。
=>お客様と仕様を調整したり、AWSの制限について調査したりするコストはかかってくるのかなと思います。もちろん数年単位の運用では大きなコストメリットがあることが多いです。しかし、あくまで傾向ですが、初期投資としては通常の開発より金額としてはかかってきてしまう気はします。
実際に撮ってきた写真で、左上から時計回りに、どこかでダイビングした時(忘れました...)、メキシコカンクン、フィリピンエルニド、マレーシアランカウイ島です。
まだ至らない点が多かったので、次までに勉強したいと思います!
MMMは、会社としてもAWS Lambdaに力を入れています。ぜひ以下のページもご覧ください。