kintone×AWSで高速開発したハッカソン参戦記
こんにちは、本橋です。
アーバンデータチャレンジ2024に徳島から参加した我々『プレイ&サバイブ』チームが、なんと嬉しいことに銀賞をいただきました。
開発したアプリは「ぼうさいパッカーン」、あなたが大規模災害に被災したときのリスクを予測・数値化します。
このアプリでは、用意されたアンケートに回答していくことでリスクの数値化を行い、スコアに応じて減殺につながる行動を提案します。アンケートの設問と、減災の提案は上月研究室(徳島大学)の研究成果をもとにしています。
ハッカソンを含めたプロジェクトの全貌は今回のチームリーダーであるCode for Tokushimaの清瀬さんのnoteに詳しくまとまっています。
僕はこのチームにエンジニアとして参加していました。この記事では、プロジェクトの中で構築したkintone-AWS-Web構成システムを中心に紹介したいと思います。
課題
そもそもの発端として、災害関連死を無くすという上月康則先生の研究がありました。研究は東日本大震災や能登半島地震のフィールドワークを重ねながら、災害関連死の理由を分析するというものです。これは被災後の生活再建と深く関係しています。生活再建とは日常を取り戻すことであり、特に高齢者にとって生活再建の遅れは災害関連死につながります。
長年のフィールドワークから、生活再建につながる平時の行動パターンが分かってきました。さまざまな関連死につながる要素を取り出して関連性を丹念に繋ぎ合わせた図がこちらです。
上月研の課題連鎖図
複雑さがよくわかりますね。
この研究成果を大勢の方に知ってもらうこと、そのためには自治体が容易に研究成果を利用できる環境を整える必要があること。
ハッカソンではそんな課題を共有いただきました。
解決の方向性
ハッカソンの中で生まれた方向性は、自分自身のリスクを把握できるアンケートを作ろう、というものでした。
アンケートを作る担当は研究室側です。アンケートを作ってスコアを調整するフィードバックを短期間に繰り返すため、手っ取り早くkintoneの入力をリアルタイムにWeb上のアンケートサイトに反映させてしまうことにしました。
kintoneのコンテンツをAWS経由でWeb公開
kintone上で入力したアンケート項目とスコア計算の重みづけをJSONデータとして公開し、そのJSONをAWSに投げてWebサイトとして構成します。
Web側のアンケート回答画面は動くものをざっとAIに作ってもらいました。とにかく時間が無いので、まず動かして研究室側に触ってもらえるようにすることが最優先です。
kintoneアプリによるデータ構築(Model)と、vibe codingしたアンケート画面(View)と、Web公開の仕組み(Controller)ということで使い慣れたMVCパターンです。
ゼロからコードを書いていたら何日かかったかわからないシステムですが、いまはkintoneもあればAWSも使えてAIも手伝ってくれます。基盤部分の開発は1日もかからずに終えることができました。
構築したシステムの概要
kintoneと繋げるときはだいたいこんな構成でやってます。
一方向の伝播のみ想定したシステム構成
1. kintone & Webhook
kintoneアプリ単体の編集操作を外部のシステムに向かって投げるWebhookを使って連携させます。CRUD操作で一通りWebhookが発火しますが、いろいろ面倒ごとが多い[1]のでDelete操作は除外しました。
2. Lambda
kintoneアプリに設定したWebhookを受け取るサービスです。
やっていることは結構シンプルで、kintoneのWebhookに含まれるデータをなるべくそのままDynamoDBに格納する、という処理を担当しています。仕様に制限をかける[1:1]ことでコード量も小さくて済みました。全体で200行くらいです。AIに依頼すれば素直に書いてくれそうです。
3. DynamoDB
テーブル設計は複数のアプリから入ってくる想定で、kintoneのアプリIDをPKにしました。SKはレコード番号です。
kintoneから入ってくる情報なので数値なら数値、文字列なら文字列として扱うことができるメリットもありますが、細かいことは気にしないですべて文字列として扱うLLスタイルです。シンプル具合がすべてです。
4. API Gateway
CORS対策として、統合レスポンスのヘッダーのマッピングとして Access-Control-Allow-Origin ヘッダに*を出力するよう指定しています。
Access-Control-Allow-Origin "*"
コンテンツの処理はパススルーです。
統合リクエストのマッピングテンプレートとして以下の定義も加えています。
{
"TableName": "<<お使いのテーブル名>>",
"Key": {
"__appid__": {
"N": "${stageVariables.appid}"
},
"<<レコード番号を格納したキー>>": {
"N": "$input.params('id')"
}
}
}
このマッピングテンプレートにより、GETパラメータにidを渡すことで、レコード1件1件に限定したアクセスができます。
Web側コード
フロント部分のコードはgithubリポジトリで公開しています。MITライセンスです。
やっていることと言えば単純で、AWS側で公開したJSONを読み込んで、カード型に表示しつつ、回答に従ってスコア計算をしています。
今後のこと
アーバンデータチャレンジの審査会を終えたことでひとまずこのプロジェクトはひと段落しました。もちろんこれで終わりのプロジェクトではありません。
今回はデータ収集機能を除外しましたが、自治体が住民向けに提供するスコア評価サービスとして提供するためにはデータの収集も分析も必要です。必要な機能を引き続き開発していこうと思っています。
そうこうしているうちに南海トラフ地震の新しい被害想定が出てきました。
また、ミャンマー、タイでも地震があり、大きな被害があったようです。
「ぼうさいパッカーン」は被災後の生活再建に目を向けた減災の取り組みです。これからも多くの方に知っていただけるよう、チームで取り組んでいこうと思います。
-
削除のWebhookではドメイン情報が飛ばなかったりします。 ↩︎ ↩︎
Discussion