顔認識で卒業アルバムの作成を支援するWebサービスを作った

Albumieという卒業アルバムの作成を支援するWebサービスを作りました🚀


このサービスでは、顔認識機能により人物で写真を検索できたり、写真ごとに写っている人物を確認できたり、すべての人物が同じくらい写っているアルバムを簡単に作成できる機能を提供しています。

作り始めたきっかけ

AWS re:Invent 2018でフルスタックのアプリケーションを簡単に構築できるらしいというAWS Amplifyを知り、なにかAmplifyで作ってみたいと思っていたところに友人から卒業アルバムの作成に時間がかかって困っているという話を聞いて作ってみようと始めました。

GitHubのコミット履歴を見ると、最初のコミットは2019年3月17日でした。
気がつくと約3年強にも及ぶ長期プロジェクトで、途中、完全に別のことに興味が持っていかれたときもありましたが、なんとかリリースできました🎉

少しずつですが開発を続けてこれたことがよかったです。

AWS Amplifyを使ってみての感想

サーバレスでコマンドひとつで環境一式を作ることができるので楽です。
開発ではAmplifyが提供しているモック機能でローカルにS3やLambda、DynamoDBなどをモックでき、ローカル環境のみで開発できる点も便利です。

ただし、あくまでもモックなので、細かい機能、例えばS3ではHEADアクションDeleteObjecsCommandがサポートされていなかったり、ちょくちょく不具合があったりします。
S3のトリガーイベントが動かなくてAmplifyの本体に修正のPRを出したこともありました。

fix: support AWS::S3::Bucket FilterRule properly in the mock mode by laboone · Pull Request #10799 · aws-amplify/amplify-cli · GitHub

自分のコードが誤っているのか、モック側が問題なのか切り分けが難しかったりするので、こういうところはどんどん成熟していくとよいなと思います。

また、DynamoDBの設計も大変だった点です。
DynamoDBはRDB(リレーショナルデータベース)とは大きく設計手法が異なります。
RDBではデータを柔軟にクエリできるので正規化さえしておけば特にデータ構造に悩むところは少ないです。

しかし、DynamoDBではRDBのような柔軟なクエリができないので、アプリケーションでどういうデータ取得が発生するかを洗い出し、それに対してどういうデータ構造が最適化かを考える必要があります。
効率的にデータを取得するためにデータを正規化せずに重複して持ったり、ひとつのカラムに複数の値を格納(Composite Key)したり、クライアント側でデータをキャッシュしたり、いろいろな工夫が必要になります。

Example of modeling relational data in DynamoDB - Amazon DynamoDBにリレーショナルデータをDynamoDBではどのように設計するかを記した例があり、このあたりを見るとDynamoDBでの設計の参考になると思います。

Amplifyでアプリケーションを作成する場合は、まずは作ろうとするアプリケーションがDynamoDBのデータモデルとマッチするかを考えてみるとよさそうです。
ちなみに、DBにはAurora Serverlessも使えますが、モックがサポートされていないようなので今のところDynamoDB一択という気がしています。

今後について

まだまだ実装したい機能がたくさんあるので、これからもどんどん機能を追加して使いやすくしていこうと思っています。
Albumieをよろしくお願いします!