$30 off During Our Annual Pro Sale. View Details »

AWSDevDay Japan 2022 Amazon Neptune and Serverless

Kazuya Suda
November 11, 2022

AWSDevDay Japan 2022 Amazon Neptune and Serverless

AWS Dev Day Japan 2022ブレイクアウトセッション『Amazon Neptuneとサーバーレスから始まった高速バス予約システム開発』E-5-2の資料です。

本サービスは、とある決済アプリのNativeアプリ上の1サービスとして、Webviewでフロントエンドを開発しており、BFFアーキテクチャを採用しています。バックエンドでは、フロントエンド向けにAPIを提供し、サーバーレス構成(API Gateway + Lambdaまたは、Step Functions)で各画面での必要な情報に応じて、外部サービスのAPI、決済システムのAPI、Neptuneへのアクセスを束ねています。

いざ、サーバーレス構成でNeptuneで商用サービスを開始してみると、開発時や事前検証では見つからなかった問題が次々と発生しました。本システムの構成の説明と併せて、その辺りをどのように解決してきたのかをお話ししたいと思います。

Kazuya Suda

November 11, 2022
Tweet

More Decks by Kazuya Suda

Other Decks in Programming

Transcript

  1. Amazon Neptune と サーバーレスから始まった ⾼速バス予約システム開発 2022.11.10 KDDIアジャイル開発センター株式会社 須⽥ ⼀也

  2. 1 ©2022 KDDI Agile Development Center Corporation ⾃⼰紹介 KDDIアジャイル開発センター株式会社 エキスパート

    須⽥ ⼀也(すだ かずや) 主な経歴 1996 DDI⼊社(現KDDI) 1998〜 EZwebサービス⽴ち上げ auメールシステム開発担当 2016〜 auでんきアプリ開発チームリーダー(AWS×スクラム) 2018〜 IT勉強会『Tech-on』運営メンバー(現コミュニティマネージャー) 2019〜 MaaSアプリ開発チームリーダー 2021〜 Scrum Inc. Japan RSM/RPO Co-Trainer 202207〜 KDDIアジャイル開発センター株式会社兼務出向
  3. 2 ©2022 KDDI Agile Development Center Corporation KDDIアジャイル開発センター株式会社 2022年7⽉に事業開始 ビジネス環境の変化が加速する中、企業においてはテクノロジーを活⽤した差別化やビジネスの変⾰が求められていま

    す。KDDIでは2013年からKDDIのサービス開発にアジャイル開発⼿法を採⽤し、実践してきました。これまで培った アジャイル開発の経験を活かし、法⼈のお客さまのDX開発を⽀援することを⽬的に活動していきます。
  4. 3 ©2022 KDDI Agile Development Center Corporation お客様のニーズに合わせて様々な⽀援メニューをご提供 お客様のアジャイル開発を全⾯⽀援 CCoE⽴上げ⽀援

    アジャイル教育 UXデザイン・PoC⽀援 アジャイル開発 ⽀援 アジャイルを初めて導⼊したい アイデア創出と仮説検証をしたい お客様でアジャイル開発をしたい クラウド活⽤を広めたい
  5. 4 ©2022 KDDI Agile Development Center Corporation 本⽇のアジェンダ

  6. 5 ©2022 KDDI Agile Development Center Corporation 今⽇お話しすること • au

    Moves サービス紹介 • au Moves ⾼速バスシステム構成 • グラフDBと Amazon Neptune の基礎知識 • Amazon Neptune 設計・実装時に押さえておきたいこと • 商⽤サービス開始後に発⽣した事象と対応
  7. 6 ©2022 KDDI Agile Development Center Corporation au Moves サービス紹介

    au Moves ⾼速バスシステム構成
  8. 7 ©2022 KDDI Agile Development Center Corporation au PAY アプリで交通サービスの予約、決済が完結する「au

    Moves」を提供 au Moves au Moves ⾼速バス( 2021/12/22〜 ) au Moves タクシー(2022/2/1〜) ⾼速バスの予約、決済サービス • 出発地 • 到着地 • 出発⽇ 指定条件で便を検索。乗降バス停を 指定し予約、au PAY で決済。 タクシーの配⾞、決済サービス • 乗⾞地 • 降⾞地(省略化) 指定した乗⾞地にタクシーを配⾞。 降⾞時に au PAY で⾃動決済。
  9. 8 ©2022 KDDI Agile Development Center Corporation サーバレス+マネージドグラフDB(Amazon Neptune)で構成 Webviewでフロントエンド開発。BFFアーキテクチャを採⽤。

    au Moves ⾼速バスシステム構成 VPC AWS Cloud Public subnet Internet gateway バス予約システム NAT gateway Amazon Neptune AWS Step Functions workflow Private subnet Amazon API Gateway Amazon CloudFront au PAYシステム スマートフォン (au PAYアプリ) AWS Lambda
  10. 9 ©2022 KDDI Agile Development Center Corporation グラフDBと Amazon Neptune

    の基礎知識
  11. 10 ©2022 KDDI Agile Development Center Corporation グラフデータベースのグラフとは、統計情報を視覚的に表現するために⽤いる図のこと ではなく、グラフ理論のグラフである。 グラフとは

    グラフは G=(V,E) で表され、V は頂点(Vertices)の集合、 E は頂点と頂点をつなぐエッジ(edges)を指す。 [AWS Black Belt Online Seminar] Amazon Neptune https://www.slideshare.net/AmazonWebServicesJapan/20200714-aws-black-belt-online-seminar-amazon-neptune
  12. 11 ©2022 KDDI Agile Development Center Corporation 路線図では、各Nodeと、Node間の関係性を以下のように表すことができる。 グラフの例 [AWS

    Black Belt Online Seminar] Amazon Neptune https://www.slideshare.net/AmazonWebServicesJapan/20200714-aws-black-belt-online-seminar-amazon-neptune
  13. 12 ©2022 KDDI Agile Development Center Corporation ノード間の関係性を⽰すデータ構造を持つデータベースをグラフデータベースといい、 ノードとエッジそれぞれにプロパティを持つモデルをプロパティグラフモデルと呼ぶ。 グラフデータベースとは

    [AWS Black Belt Online Seminar] Amazon Neptune https://www.slideshare.net/AmazonWebServicesJapan/20200714-aws-black-belt-online-seminar-amazon-neptune
  14. 13 ©2022 KDDI Agile Development Center Corporation TinkerPop という Apacheプロジェクトで提供されている

    グラフトラバーサル⾔語が Gremlin。 Gremlin とは ノードとノードの繋がりを辿っていく経路のことをTraversalと呼ぶ。 Traverseは横切る、⾛査するの意。 [AWS Black Belt Online Seminar] Amazon Neptune https://www.slideshare.net/AmazonWebServicesJapan/20200714-aws-black-belt-online-seminar-amazon-neptune
  15. 14 ©2022 KDDI Agile Development Center Corporation AWSで提供されているフルマネージドグラフデータベース。 Amazon Neptune

    とは 【開催報告 & 資料公開】Amazon Neptune の歴史を紐解く – 最新の移⾏ソリューション/アップデートのご紹介 https://aws.amazon.com/jp/blogs/news/amazon-neptune-20221027/
  16. 15 ©2022 KDDI Agile Development Center Corporation Gremlin、openCypher(追加) SPARQL を利⽤可能。

    Amazon Neptune で利⽤できるインターフェース 【開催報告 & 資料公開】Amazon Neptune の歴史を紐解く – 最新の移⾏ソリューション/アップデートのご紹介 https://aws.amazon.com/jp/blogs/news/amazon-neptune-20221027/
  17. 16 ©2022 KDDI Agile Development Center Corporation 2022年10⽉27⽇にGA。 Amazon Neptune

    Serverless登場︕︕ 【開催報告 & 資料公開】Amazon Neptune の歴史を紐解く – 最新の移⾏ソリューション/アップデートのご紹介 https://aws.amazon.com/jp/blogs/news/amazon-neptune-20221027/
  18. 17 ©2022 KDDI Agile Development Center Corporation Amazon Neptune 設計・実装時に押さえておきたいこと

    〜 au Moves ⾼速バス 〜
  19. 18 ©2022 KDDI Agile Development Center Corporation 出発地の都道府県と到着地の都道府県から、 存在する便(service-ID)を含む経路を取得したい。 <クエリ>

    g.V() .has('name', '東京ʼ) .in('prefʼ) .in('areaʼ) .in('getOnʼ) .out('getOffʼ) .out('areaʼ) .out('prefʼ) .has('name', '⼤阪ʼ) .path <結果> path[v[pref-ID], v[area-ID], v[terminal-ID], v[service-ID], v[terminal-ID], v[area-Id], v[pref-ID]] ・ ・ ・ ⾼速バス検索グラフ構造(イメージ)
  20. 19 ©2022 KDDI Agile Development Center Corporation TinkerPop JavaScript Gremlin

    クライアント 利⽤している Gremlinクライアント • Gremlin で Neptune DBインスタンスに接続するため、TinkerPop JavaScript Gremlin クライアントを使⽤。 • 可⽤性確保のため、DBクラスタ内にプライマリDBインスタンスと異なるアベイラビリティーゾーンで リードレプリカDBインスタンスを構築。 • GremlinクライアントのDB接続のためのライブラリ(driver-remote-connection)が、1つのエンドポイントしか 設定できなそうだったので、プライマリDBインスタンス(読み書き可能)を指定。 • リードレプリカDBインスタンス(読み込み)は、プライマリDBインスタンス障害時のStandbyとしてのみ利⽤。 (本来は最⼤15のリードレプリカを設定可能で、読み込みのスケールと複数AZでのフェールオーバーが可能)
  21. 20 ©2022 KDDI Agile Development Center Corporation Neptune のコスト Neptune

    の気になるコスト • インスタンス起動中は時間単位で料⾦が発⽣ • ストレージ容量は GB/⽉単位で課⾦ • データベースに対するI/O は 100 万件のリクエストごとに課⾦ • バックアップストレージ、データ転送(in/out)にも課⾦あり • Amazon SageMaker がホストする Jupyter ノートブックを利⽤するための Neputuneノートブックインスタンス も時間単位で課⾦ • クラスタ停⽌機能があるが7⽇間で⾃動起動。 ⇒ 検証環境は夜間、週末は停⽌するように CloudWatch Events で設定。 メンテナンスウィンドウ時間帯も停⽌していた場合、パッチの⾃動適⽤がスキップされるため、⼿動で適⽤。
  22. 21 ©2022 KDDI Agile Development Center Corporation neptune-export Gremlinに慣れてなくても⼤丈夫 •

    Neptune のデータをCSVなどのテキストファイルにエキスポートするツール(GitHubで公開) • S3、または別のデータベースにデータを格納し、障害調査、データ分析に利⽤ (gremlin でクエリするよりも、SQLの⽅が慣れているため) awslabs/amazon-neptune-tools https://github.com/awslabs/amazon-neptune-tools/tree/master/neptune-export
  23. 22 ©2022 KDDI Agile Development Center Corporation SLA 可⽤性は⼤丈夫︖ •

    可⽤性の設計⽬標値︓99.900%(サービス) <参考> Amazon Relational Database Service (Amazon RDS)︓99.990%(マルチAZデータプレーン) • インスタンス障害、メンテナンスウィンドウでのクラスタ全体に対するパッチ適⽤(後述)などで 停⽌するケースあり 付録 A: ⼀部の AWS のサービスの可⽤性設計 https://docs.aws.amazon.com/ja_jp/wellarchitected/latest/reliability-pillar/appendix-a-designed-for-availability-for-select-aws-services.html
  24. 23 ©2022 KDDI Agile Development Center Corporation 実⾏計画 クエリが遅いなと思ったら •

    Gremlin explain で適切にクエリが⾏われているか実⾏計画を確認する(クエリは実⾏されない)。 • Gremlin profile では、実際にクエリが実⾏され、トラバーサルメトリクスなどの統計情報が出⼒される。 • Neptuneノートブックで、Amazon SageMaker がホストする Jupyter ノートブックを起動し、 “%%gremlin explain” もしくは、”%%gremlin profile” のあとに、取得したいクエリを記述。 • 特定のクエリが遅いことが疑われる場合の調査に有効。 ⇒ 現在のところは、実⾏計画の確認、クエリの最適化が必要なケースは⾒つかっていない。 [AWS Black Belt Online Seminar] Amazon Neptune https://www.slideshare.net/AmazonWebServicesJapan/20200714-aws-black-belt-online- seminar-amazon-neptune
  25. 24 ©2022 KDDI Agile Development Center Corporation au Moves ⾼速バス

    商⽤サービス開始後に発⽣した事象と対応
  26. 25 ©2022 KDDI Agile Development Center Corporation 発⽣した主な事象 商⽤サービス開始後に発⽣した事象 •

    その1︓Lambda – Neptune 接続エラー • その2︓Lambda空振り • その3︓メンテナンスウィンドウでのパッチ適⽤
  27. 26 ©2022 KDDI Agile Development Center Corporation Lambda - Neptune接続エラー

    サービス開始後に発⽣した事象(その1) • Lambda からのWebSocketがECONNRESETで切断される事象が多発 ⇒ バックオフとリトライのロジックをLambdaハンドラーで実装することを推奨。 JavaScriptおよびPythonのGremlinドライバーは、クエリ実⾏時の⾃動再接続のロジックを実装していないため、 コード例を参考に実装する必要がある。 Use AWS Lambda functions with Amazon Neptune https://aws.amazon.com/jp/blogs/database/use-aws-lambda-functions-with-amazon-neptune/ AWS Lambda function examples for Amazon Neptune https://docs.aws.amazon.com/neptune/latest/userguide/lambda-functions-examples.html#lambda-functions-examples-javascript
  28. 27 ©2022 KDDI Agile Development Center Corporation Lambda 空振り サービス開始後に発⽣した事象(その2)

    • AWS Step Functions から⾮同期で実⾏された AWS Lambda が処理が実⾏されず、Neptune へのアクセスも ⾏われなかったように⾒える事象が発⽣(Amazon CloudWatch Logs/AWS X-Ray)。 Lambdaハンドラの実⾏⾃体がスキップされているように⾒えている。 ⇒ Lambda が⾮同期で実⾏、VPC Lambda、Lambda - Neptuneの組み合わせ、など疑ったが原因は不明。 Step Functions から Lambda を同期実⾏、Lambda からのレスポンスが設定されていない場合、リトライ。 正常時X-Ray 異常時X-Ray
  29. 28 ©2022 KDDI Agile Development Center Corporation メンテナンスウィンドウでのパッチ適⽤ サービス開始後に発⽣した事象(その3) •

    夜間帯に突然 neptune reboot が発⽣ AWS Health Dashboard に通知されずに、バージョンのアップグレードが実⾏されていた。 ⇒ クラスターのメンテナンスウィンドウで、バージョンアップが⾃動実⾏。 パッチリリースは、常にリリース後の最も近いメンテナンスウィンドウで⾃動的に適⽤される。 • Neptune においては AWS Health Dashboard 以外でも保留中のメンテナンスアクションで メンテナンス通知が⾏われる場合がある。 ⇒ describe-pending-maintenance-actions コマンドで取得し、通知する仕組みを実装。 Neptune engine updates https://docs.aws.amazon.com/neptune/latest/userguide/engine-updates.html
  30. 29 ©2022 KDDI Agile Development Center Corporation 本⽇のまとめ • まずは、[AWS

    Black Belt Online Seminar] Amazon Neptune で、グラフ DBと Neptune の理解を深めましょう。 (Amazon Web Service ブログ︓「Amazon Neptune の歴史を紐解く – 最 新の移⾏ソリューション/アップデートのご紹介」に最新情報も) • Neptune の設計、実装時には、使⽤する⾔語とクライアントの制約を確認し た上で、可⽤性とコストも考慮しましょう。 • Lambda で Neptune を利⽤する場合、⾃動再接続の処理の実装要否を確認し ましょう。 • Neptune のメンテナンス情報は、保留中のメンテナンスアクションも確認し ましょう。
  31. Be a Change Leader. アジャイルに⼒を与え 共に成⻑し続ける社会を創る