【成果報告】Angel Dojo 2023(後編:バックエンドについて)

【成果報告】Angel Dojo 2023(後編:バックエンドについて)
この記事をシェアする

こんにちは、スカイアーチHRソリューションズのktakedaです。

7月から10月の期間で、AWS主催のハッカソンイベントの「Angel Dojo」に参加させていただきました。Angel Dojoは、サービスの企画・開発について学びながら、約3ヶ月の間で5,6人のチームで実際にサービスを企画し、開発するハッカソンです。私たちはその期間の中で自炊を支えるためのアプリとして「Recipician」の開発を行いました。

本記事では、先日Angel Dojoのチームメイトの横井さんが投稿した記事の後編として、イベント内で実際に開発したRecipicianのバックエンドについてご紹介させていただければと思います。それでは、よろしくお願いいたします。

また、前編の記事では、Angel Dojoのイベントの概要、企画したRecipicianがどんなサービスなのかについて紹介させていただいております。宜しければ、ご覧いただけますと幸いです。

バックエンドの設計について

バックエンドを設計する上で以下の3つに沿うように設計しました。

  • AWSのサービスで完結
  • フルマネージドサービスを多く活用
  • サーバレスの構成

一つ目のAWSのサービスで完結についてはAWS主催のイベントなので、AWSのサービスをなるべく活かしたサービスを構築したいと思いこの項目を意識しました。実際、AWSのサービスのみで開発することで各リソースの管理もしやすくサービス同士の接続も容易なためメリットが多くありました。また、イベント開始時にクレジットを$500いただけたのでサービス利用についてもあまり金銭的なところを気にせず開発を進めることができました。

二つ目のフルマネージドサービスを多く活用についてはチームメンバーがみな、インフラ寄りのエンジニアでサービスの開発の経験が乏しかったのでなるべく学習のコストを抑えたり、楽できるようにするためにマネージドサービスを多く活用することを意識しました。実際、今回機械学習の技術を活用することを考えてたので、メンバーに経験が一切ない中で、フルマネージドサービスを活用することにより簡単に機械学習の技術を活用できたことは開発スピードを大幅に向上させていると感じました。

三つ目のサーバレス構成についてはとりあえず動くものを作ろうと考えていたのでサーバの設計や管理を考えることなく、システム開発に集中できるサーバレスのサービスを活用した構成にすることを意識しました。要素ごとにシステムを開発することができるので、仮で作ったものをとりあえず動かしてみてテストできるのは魅力的でした。

実際にサービス運用を考えるのであれば、考慮すべき点は多くあり開発方針は直す必要がありますが、チームメンバーの経験が浅く、動くものを作ることを意識したときにAWSの(クラウドの)マネージドサービスやサーバレスのサービスは非常に開発者にとって助けになるものだと感じました。

Recipicianの機能

本アプリの機能として案は多くありましたが今回の開発期間で実装するものとして次の4つの機能が重要だと考えアーキテクチャを考案しました。サービスの概要については前編の記事をご覧いただけますと幸いです。

  • 認証機能
  • 食材管理機能
  • 食材認識機能
  • レシピ提案機能

認証機能は、他の機能の兼ね合いでユーザのデータはすべてクラウド上でも管理できる必要があり、ユーザが自分のデータのみにしかアクセス出来ないようにするため必要な機能となります。

食材管理機能は、ユーザの自分の食材に関する情報をクラウドのデータベース上で管理し、食材のデータの追加・削除・閲覧を行う機能となります。これにより、ユーザはシステムにアクセスできる状態であれば、家にある食材についてどこでも確認することができます。また、クラウド上のデータベース上で管理された食材はレシピ提案機能でも活用されます。

食材認識機能は食材の画像から、食材名とその量を出力する機能となります。これにより、ユーザは食材登録の手間が省くことができます。本機能は画像認識となりますので、機械学習の技術を用いた実装が必要となります。

レシピ提案機能は食材管理機能で登録されている食材から作成可能なレシピを探し、さらにユーザの趣向をアプリの利用状況から判別し、作成可能なレシピからよりユーザの好みのレシピを絞り込み提案する機能となります。ユーザごとの趣向から好みのレシピを判別するため、食材認識機能同様に機械学習の技術を用いた実装が必要となります。

アーキテクチャ

前項では、Recipicianの機能について簡単に説明させていただきました。以下では、その機能についてAWSのサービスを用いてどのように実装したかをご紹介させていただきます。

アーキテクチャ全体については上記の図となっており、フロントエンド側からはAppSyncもしくはS3とやり取りを行い、内部のリソースを処理させたりデータの取得を行います。もともと方針として挙げさせていただいた通りフルマネージドサービスやサーバレスのサービスを多用して構築しました。以下では各機能ごとの使用したサービスを紹介させていただきます。

認証機能

認証機能はCognitoを使用しました。バックエンド側でフロントエンドとやり取りをするのはAppSyncとS3の二つ(厳密にはCognitoも)ですが、Cognitoを使うことでそれぞれ簡単に認可の機能を実現することができました。

AppSyncではAppSyncの設定でCognitoのユーザプールを指定するかつスキーマ内で定義により認証されていないユーザからアクセスを拒否することができます。

S3ではCognitoのIDプールにてポリシーを定義することでS3へのアクセス権を付与させることが可能となります。

マネージドサービスであるため時間をかけることなく簡単に実装でき、さらに他サービスとの親和性の高さでCognitoには大きく感動を受けました。

食材登録機能

食材登録機能はAppSync、DynamoDBを使用しました。AppSyncではなくAPI Gateway – Lambda – DynamoDBという構成も多くあると思いますが、今回DynamoDBが多くありDBごとに書き込みと読み込みのLambdaを実装し管理することが手間だと考え、一つで完結できるAppSyncを利用することにしました。またAppSyncを活用することでバックエンド側から通知を出す機能も容易に実装できるためAPI GatewayではなくAppSync – DynamoDBという構成にしました。

また、DynamoDBの中にはユーザごとのデータを区別するためパーティションキーとしてCognitoのsubというパラメータ(Cognitoユーザごとの一意の値)を指定しており、その情報を使ってDynamoDBからデータを読み書きする際にはCognitoと連携されているAppSyncを使用することで認可の際に使用するパラメータを活用することができるので容易に実装することができました。

食材認識機能

食材認識機能は主にRekognitonを使用しました。前述のとおりメンバー内に機械学習の知識や経験はありませんでしたが、簡単に画像分析のモデルを作成することができるRekognitionで利用することでその問題を解決することができました。

食材認識機能では食材の名前を明確に指定したかったので、すでに存在するモデルではなく自分たちで画像を用意してカスタムラベルを設定して新たにモデルを作成しました。時間が足らず精度の高いモデルを作成することはできませんでしたが画像を用意することができれば、ニッチな食材なども認識できるモデルを簡単に作成できるので今回は考えられませんでしたがユーザの使用によって新たな画像を収集し継続して学習できる仕組みを作ることで精度の高いモデルを目指すことが可能だと考えました。

また、Rekognitonでの画像の判別に時間がかかるためAppSyncの通知機能(Subscription)を用いてRekognitonが含まれるStepFunctionsの処理が終了したタイミングでアプリに通知が入り、分析結果をS3から取得できる仕組みを実装しました。

レシピ提案機能(未実装)

最後にレシピ提案機能となりますが、こちらについては時間がなく実装ができませんでした。使用するサービスについても調査中の段階でPersonalizeを活用して、ユーザごとの趣向分析を実施しレシピに優先度をつけることを想定していました。

バックエンドの開発を通して

いままでアプリ開発の経験もなく、サーバレスなアーキテクチャを使ったシステムの設計自体も初めて行いましたが自分の経験不足を強く実感しました。アーキテクチャについてはAWSのWell-Archteched Frameworkに即していない部分も多くあり、実際サービス化した際には多くの問題を抱えていると思います。また、開発面についても実装できなかった部分もあり、開発の見通しが甘かったと感じました。

ただ、未熟ながらもこうした経験を積むことができ、今まで触る機会のなかったサービスにも触れることができ貴重な体験をすることができました。あまり経験がなくともプロトタイプとなるものを簡単に作成できるのはクラウドサービスならではの魅力の一つだと思います。

今回の記事を通して、AWSやAngel Dojoについて興味を持っていただけましたら幸いです。
ここまでご覧いただきありがとうございました。

この記事をシェアする
著者:ktakeda
新卒1年目のAWSエンジニアです。資格勉強に奮闘中です。