1.5K Views
December 19, 24
スライド概要
2024年12月18日に開催したクリスマス企画「AWSでサンタさんのプレゼント配達システムを構築! 手紙からの情報抽出、配達経路の最適化」セッションの発表資料です。
2024年12月19日開催「AWS Skills Guild 第一回勉強会」でもショートバージョンを発表しました。
もしもサンタさんの仕事をシステム化するとしたら…
そんなアイデアをAWSで形にしてみました!
こどもの手紙から生成AIで情報を抽出し、地図上に最適化されたプレゼント配達経路を表示するシステムです。
ゼロから少しずつアーキテクチャを完成させていく内容なので、AWS初心者も楽しめます!
ソースコードも公開しているため、AWS CDKで誰でもすぐにデプロイ可能です。
SFとコンピュータが好き
2024-12-18 クリスマス企画 AWSでサンタさんの プレゼント配達システムを構築! ― 手紙からの情報抽出、配達経路の最適化 ― 山崎 拓也
山崎 拓也 所属: SIer 仕事: • システム開発など • アプリとAWSインフラ両方 好き: 低レイヤ、SF、AWS AWS関連: • 2024 Japan AWS Top Engineer • 2022~2024 Japan AWS All Certifications Engineer
今回はクリスマス企画です • クリスマス気分で楽しくスキルアップ! • AWS初心者でも楽しめる内容です • 左上に マークがあるスライドは初心者向けです
本日伝えたいこと • AWSを使うと面白いアイデアを素早く形にできる • Amazon Bedrockなら生成AIを簡単にシステムに組み込める • 難しいソリューションもAWS Marketplaceなら素早く実現できる
アジェンダ • サンタさんの抱える課題 • 完成したシステムの使い方 • システム構築とポイント • 手紙からの情報抽出 • プレゼント配達経路アプリ • ソースコードへのリンク • まとめ • 告知
サンタさんの抱える課題
シナリオ • サンタさんにはこども達から沢山の手紙が届く • 手紙には欲しいプレゼントと住所のほか、メッセージや絵も書 かれている • サンタさんは手紙を読むのがとっても楽しみ • サンタさんの仕事は、手紙からプレゼントと住所を帳票に書き 写し、クリスマス当日にソリに乗って配達すること
サンタさんの抱える課題 1. プレゼント名と住所を帳票へ書き写す作業に時間を取られて、 こども達からの手紙をゆっくり見ることができない 2. 空が飛べないタイプのサンタさんなのでソリで道路を走行す る必要があるが、最適な配達経路が分からず無駄に時間がか かっている
サンタさんはこれらの課題を解決するため、AWSを使っ てシステムを構築することにしました
完成したシステムの使い方
注意点 • 手紙に使用する住所は全て仙台駅前のコンビニの住所を使用しています
手紙1 プレゼントは「ツチノコのぬいぐるみ」
2枚目からはイラストなし • 手紙2「ポケモンカード」 • 手紙3「ゴジラのしっぽ」 • 手紙4「たまごっち」 • 手紙5「クレヨン」
5つの手紙をAWS(S3)へアップロード アップロード 実行 情報抽出処理 • プレゼント名 • 住所 • 住所の緯度経度
Webアプリへアクセス 1. API URL、API Keyを入力 2. Requestボタンを押す
プレゼント配達経路が表示される
マーカー選択でプレゼントと住所が表示される
簡単には思いつかないルートで最適化されている • きちんと左車線を走っている • 左下、Uターンできる交差点まで進んでからUターンしている
これによりサンタさんの課題は解決 1. 作業自動化により、こども達からの手紙をゆっくり見られる 2. 配達経路の最適化により、配達時間に余裕が生まれる
システム構築とポイント
アーキテクチャ
アーキテクチャ ここに至る過程を見ていきましょう!
手紙からの情報抽出
手紙からプレゼント名と住所を取得したい・・・ • 字が崩れている • 住所も全てひらがなで書かれている • イラストなど他の情報も含まれている
手紙からプレゼント名と住所を取得したい・・・ • 字が崩れている • 住所も全てひらがなで書かれている • イラストなど他の情報も含まれている 生成AIで解決できます!
Amazon Bedrockとは • AWSの生成AIサービス • 6社40種類以上の様々なモデルを使用可能 • 「テキストと画像」などを一度に入力できるマルチモーダルなモデルもある • Converse APIから同じインターフェースで様々なモデルが呼び出し可能 Converse API 「この画像は何ですか?」 https://aws.amazon.com/jp/bedrock/ 「サンタさんへ充てた手紙です」
今回Bedrockへ渡すシステムプロンプト 住所は漢字に変換してもらう 出力はプログラム処理しやすい ようにJSONにしてもらう
(補足)Converse APIの呼び出し方 画像データ Converse API呼び出し システムプロンプト https://docs.aws.amazon.com/ja_jp/bedrock/latest/userguide/conversation-inference-call.html
Bedrockの出力結果 システムプロンプト • プレゼント名と住所を的確に抽出している • 「ツチノコ」の「ツ」が取れてる点は特にすごい • 住所は正しく漢字に変換されている • JSONフォーマットも指定通り
ここまでのアーキテクチャ
手紙解析プログラムの実行環境が必要
手紙解析プログラムの実行環境が必要 AWS Lambda関数がぴったり!
AWS Lambda関数とは • サーバーレスなプログラム実行サービス • 最大15分間プログラムを実行可能 • リクエストに応じて自動的にスケールアウト リクエストに応じて 自動でスケールアウト https://aws.amazon.com/jp/lambda/ 最大同時実行数 を設定可能 例: 10インスタンス までスケール
ここまでのアーキテクチャ 自動でトリガー
地図に表示するため住所を緯度経度に変換したい・・・
地図に表示するため住所を緯度経度に変換したい・・・ 国土地理院のAPIを呼ぶ!
緯度経度とフォーマットされた住所が得られる • Bedrockから得られた住所をそのままAPIに渡す • 以降の住所はフォーマットされたものを使う 経度, 緯度なので注意 フォーマットされた住所
ここまでのアーキテクチャ
DBにデータを保存したい・・・ • サンタさんへの手紙は不定期に来る • DBアクセスが無い間は停止してコスト削減したい • RDBがいい • 地理情報も保存したい
DBにデータを保存したい・・・ • サンタさんへの手紙は不定期に来る • DBアクセスが無い間は停止してコスト削減したい • RDBがいい • 地理情報も保存したい Amazon Aurora Serverlessがぴったり!
Amazon Aurora Serverlessとは • AWSのサーバーレスなRDBサービス • インスタンス料金は時間あたりのACU(Aurora Capacity Unit)で決まる • ACU: Auroraのインスタンススペック(東京リージョンは1ACU = 0.15USD) • 5ACUで2時間稼働した場合: 0.15USD × 5ACU × 2時間 = 1.5USD • 使用していない間ACUが0になるため、インスタンス料金がかからない • 負荷に応じてACUが自動でスケール ここからインスタンス料金無料 https://aws.amazon.com/jp/rds/aurora/serverless/
(補足)Aurora Serverless v2作成時のポイント 1. ACUを0にできるエンジンバージョンを指定する 2. DB設定やテーブル作成などにクエリエディタを使うため、DataApi機能を有効化する 1 2 クエリエディタ コンソールからクエリを実行する機能
PostGIS拡張を使用して地理情報をAuroraへ保存 • PostGIS: PostgreSQLで地理情報を扱うための拡張機能 • AuroraでもPostGISが使用可能 • POINT型やLINESTRING型、便利な関数などが使用可能になる • 公式ドキュメントのSQLを実行することで有効化 • PostGIS 拡張機能を使用した空間データの管理 https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/Appendix.PostgreSQL.CommonDBATasks.PostGIS.html
ここまでのアーキテクチャ インターネットアクセスに必要
Lambda関数は自動でスケールするためDB接続が枯渇する ・ ・ ・
接続プール用のサービスがあるが・・・ • RDS Proxy • フルマネージドの高可用性データベースプロキシ • 次の場合にベストプラクティス • 頻繁に接続を開いたり閉じたりする • 長時間の接続を多数開いたままにする • 時間課金 https://aws.amazon.com/jp/rds/proxy/ ・ ・ ・
RDS Proxyを使うとACUが0にならずコストがかかる・・・ • ACUが0.5までしか下がらないため、アクセスが無いときにもインスタン ス料金がかかる • 東京リージョンだと 0.075USD/h 停止せず、ここまでしか下がらない https://aws.amazon.com/jp/blogs/database/introducing-scaling-to-0-capacity-with-amazon-aurora-serverless-v2/
RDS Proxyを使わずにDB接続を管理する • Lambda関数の最大同時実行数を設定する • それ以上スケールしなくなるので接続数が抑えられる → スケールしないため、リクエストが捌けなくなる 10インスタンス以上 増えないように設定
リクエストが失敗しないようにキューイングする • Amazon SQSを使用する
Amazon SQS と Lambda関数の連携 • Lambda関数で処理成功したメッセージは自動的にキューから削除される • 同じメッセージの重複処理防止のため、 SQSキューの可視性タイムアウ トを設定する • Lambda関数の実行時間より長くする 可視性タイムアウトなし 可視性タイムアウト 15分 ①メッセージ取得 ①メッセージ取得 Lambda A ②Aが処理中の メッセージも取れる Lambda B Lambda A ②Aが処理中の メッセージは 15分間取れない Lambda B
処理失敗に備えてデッドレターキューを作成 • Lambda関数で処理失敗したメッセージはデッドレターキューへ入る ①失敗! ②失敗したメッセージは DLQへ転送
再処理はコンソールの「DLQ再処理の開始」ボタンから • あるいはサンタさんがDLQのメッセージの手紙をマニュアル処理 ①DLQ再処理ボタン ②ソースキューへ転送
ここまでのアーキテクチャ
(補足)DB接続が頻繁に作られる可能性がある • Lambda関数のインスタンスが生きている間は同じインスタンスで処理が 実行される 15分間 時間 手紙 1枚目 接続毎回作る 手紙 2枚目 手紙 3枚目 手紙 4枚目
(補足)インスタンス内で接続を使い回す • 接続を大域変数として持つことでインスタンスが生きている間、同じ接続 を使い回せる 15分間 大域変数として宣言 初回のみ接続作成 時間 手紙 1枚目 接続使い回す 手紙 2枚目 手紙 3枚目 手紙 4枚目
手紙からの情報抽出部分は完成!
プレゼント配達経路アプリ
座標は分かったが、最短経路を導くには・・・ • ダイクストラ法? • 巡回セールスマン問題?
座標は分かったが、最短経路を導くには・・・ • ダイクストラ法? • 巡回セールスマン問題? 難問はAWS Marketplaceで素早く解決!
AWS Marketplaceとは • サードパーティーの製品を購入できるAWS内のオンラインストア • ソフトウェアだけでなく、SaaSやAMI(Amazon Machine Image)、機 械学習モデルなど、様々なソリューションが揃っている • 利用料はAWS利用料と一緒に支払う https://aws.amazon.com/jp/mp/marketplace-service/overview/
さっそく「delivery route」で検索 209件ヒット SaaSは32件 最も関連性が高い
HERE Tour Planningのドキュメントをみると・・・ • 巡回セールスマン問題を解けるAPIを発見! https://www.here.com/docs/ja-JP/category/tour-planning-api
サブスクライブとAPIキー発行 • 30日間 Free Trial が提供されている
最適な配達順序を取得 • プレゼント配達先の座標などをパラメーターとしてAPI呼び出し • 配達順が返る 例 サンタさんの家から出発 例 start: 38.26099, 140.881155 start: 38.26099, 140.881155 A: 38.259464, 140.879929 E: 38.258324, 140.874039 B: 38.257568, 140.87973 C: 38.256062, 140.873245 C: 38.256062, 140.873245 D: 38.257244, 140.87645 D: 38.257244, 140.87645 B: 38.257568, 140.87973 E: 38.258324, 140.874039 A: 38.259464, 140.879929 end: 38.26099, 140.881155 end: 38.26099, 140.881155 サンタさんの家に帰る
地図上で見ると・・・ 例 start: 38.26099, 140.881155 A E: 38.258324, 140.874039 C: 38.256062, 140.873245 E D: 38.257244, 140.87645 B: 38.257568, 140.87973 B A: 38.259464, 140.879929 D end: 38.26099, 140.881155 C
最適な配達経路はHERE Routing API(無料)で取得可能 • 始点、終点にサンタさんの家を指定 • 経由地に配達順序どおりの座標を指定 https://www.here.com/docs/ja-JP/category/routing-api-v8
(補足)Routing APIからはFlexible Polylineが返る • Flexible PolylineはHEREで提供される座標リストの圧縮表現 • デコードすると経路を表す膨大な座標が得られる Flexible Polyline例( 5つ) デコード例 BG4vo_oC4w22sInHpCjNPjNPjKJjKJ_ChBrBhBBB9BxCxB9 CzExShFtUzExSjDtIxEhSpK3oBxEhSjFjUlFrUlFtUjFjU_E_Th FhUtD3NjFtUvD3NtD3MxHliBZjDzE5QvFnUzE7Q7CnL BGglj_oC5o2sIAAxE7S_EvU9EvUxE7S_JkDrQmF_JkDnCa_OgFhPE7fiLxKuDjHmCyE9N BGog_oCkkn2sI8B3FuG3ToEmG_EyP_EwPjFqPxG2TzG4TzG2TjFq PzM4nBvEoM3D2IzIoIsEmT8IgeoEqOgGiUoEoOuMlHu9Bzj BuMlH-H1EsI9E BG0ph_oC40t2sIgHhE-H1EmMjHoMjH8H_EkPzJiPzJHhFuD4M1M6HnPqJ1M6HlbyQxJsFrP4IxJuF8C4NqE2UoE4 UqE2U8C4NwCyLwE2UyCyL-DsT-DsT_C6BnCsB BG-6h_oC05z2sIpIkFlPqJnPqJlPqJvJ4FhEwCkF0RmFyRFyT8FyT6KnG4e1RsP7I4KnGiK_FoPjJyenSiK_FkPlJmPpJ8Bj B BGszl_oCmr02sIoNhIoMvHoPnJoMvHwNxHyNxHgK5GawLI kMQsVOuVQsVIkM4BqRuCgI 38.260988 140.881164 38.260872 140.881127 38.260662 140.881119 38.260452 140.881111 38.26029 140.881106 38.260128 140.881101 38.26008 140.881084 38.260058 140.881067 38.260057 140.881066 38.260026 140.881025 38.260001 140.880978 38.259927 140.880681 38.259846 140.880354 38.259772 140.880057 38.259722 140.879922 38.259649 140.879633 38.259484 140.878981 38.259411 140.878692 38.259329 140.87837 38.259246 140.878044 …
ここまでのアーキテクチャ Lambda関数から HEREのAPIを呼び出す
Web APIとしてLambda関数を呼び出したい・・・ • 一般的にはAPI GatewayやALB(Application Load Balancer)を使う • 簡単に作りたい • リソースを増やしたり複雑な設定はしたくない • コストを増やしたくない • 認証もリクエストのAPIキーだけでいい
Web APIとしてLambda関数を呼び出したい・・・ • 一般的にはAPI GatewayやALB(Application Load Balancer)を使う Lambda Function URLsがぴったり! • 簡単に作りたい • リソースを増やしたり複雑な設定はしたくない • コストを増やしたくない • 認証もリクエストのAPIキーだけでいい
AWS Lambda Function URLsとは • Lambda関数にHTTPSエンドポイントを作る機能 • 無料 • CORSにも対応 • Private SubnetにあるLambda関数でもOK https://aws.amazon.com/jp/blogs/news/announcing-aws-lambda-function-urls-built-in-https-endpoints-for-single-function-microservices/
ここまでのアーキテクチャ
Webサイトをホストしたい・・・ • 簡単に作りたい • 静的Webサイトでいい • HTTPSアクセスしたい • AWS CDK(IaC)で簡単に書きたい
Webサイトをホストしたい・・・ • 簡単に作りたい • 静的Webサイトでいい • HTTPSアクセスしたい • AWS CDK(IaC)で簡単に書きたい CloudFrontとS3を使った構成がぴったり!
CloudFrontとS3でWebサイトをホスティングする • S3に静的Webサイトのリソースを配置する(index.html) • CloudFrontのOAC(Origin Access Control)を使用することで安全にWebサ イトを公開できる • S3静的Webサイトホスティング機能は使わない (パブリックアクセスを許可する必要があるため) • AWS CDKなら20行で簡単に構築可能 ※コンソールから作業する場合はAmplify Hostingがおすすめ https://aws.amazon.com/jp/blogs/news/amazon-cloudfront-introduces-origin-access-control-oac/
完成! CORS設定する 今回は index.html が1つだけ
アーキテクチャ
ソースコードへのリンク
誰でも簡単にデプロイできます • 全てのソースコードは以下リポジトリにて公開中 • https://github.com/kkmtyyz/santa-present-delivery-system • AWS CDK(IaC)にてAWS上にデプロイできます(課金注意) • AWS CDK: TypeScript Lambda: Python Webアプリ: HTML, JavaScript
まとめ
まとめ • AWSを使うと面白いアイデアを素早く形にできる • Amazon Bedrockなら生成AIを簡単にシステムに組み込める • 難しいソリューションもAWS Marketplaceなら素早く実現できる
まとめ • AWSを使うと面白いアイデアを素早く形にできる • Amazon Bedrockなら生成AIを簡単にシステムに組み込める AWSでアイデアを形にしましょう! • 難しいソリューションもAWS Marketplaceなら素早く実現できる
ご清聴ありがとうございました。