Money Forward Developers Blog

株式会社マネーフォワード公式開発者向けブログです。技術や開発手法、イベント登壇などを発信します。サービスに関するご質問は、各サービス窓口までご連絡ください。

20230215130734

170万ユーザーを支えるアカウントアグリゲーション開発の裏側

こんにちは。アグリ村長 兼 CTOの浅野です。

今回のブログでは、アカウントアグリゲーション開発の中でも「どうやって運用の工数を減らしているか」というテーマで紹介しようと思います。  

そもそもアカウントアグリゲーションは何が大変なのか

現在マネーフォワードは1700を超える金融機関に対応をしていますが、実は新規に金融機関を増やす事自体はそこまで大変ではありません。
銀行や証券会社に実口座を作成してしまえば、そのアカウントを使ってログイン処理やデータ取得部分などはさくさく作れてしまいます。

それよりも何よりも大変なのはその運用の方です。

金融機関のウェブサイトは数年毎にリニューアルを行い、2段階認証の導入やサイトを見やすくする等の改善を行っています。とすると、1700も金融機関があると毎日どこかしらリニューアルが行われている計算になります。
実際、毎週月曜になるといくつかの金融機関でリニューアルが行われていて、データが取得出来なくなっている事がよくあります。少し前にとある金融機関に新規対応したのですが、その翌週早速リニューアルをされた時は泣きながら対応しました。。。  

頻繁に発生するタスクをどう管理するか

金融機関のサイトは、基幹システムを変更するなどの大規模なリニューアルから特定のページだけちょっと見やすく変更しました的な小さなリニューアルまで、合わせると毎日結構な量の修正タスクが発生します。
それを、日々ログを監視してエンジニア自らタスク管理するのは相当な工数がかかってしまいます。
そのような問題点を解決する為に、うちではRedmineのAPIを使ってタスクを自動起票するようにしています。  

プロジェクト管理ソフトウェア Redmine

REDMINE

アカウントアグリゲーションシステムでは、どのような理由で取得が出来ていないのかという旨をユーザーへ表示する必要があるため、エラー種別毎の処理をしっかりと行っています。
そのエラーハンドリング処理の中で対応が必要なエラーの場合はRedmineのAPIを叩いて自動起票を行うという仕組みを整えています。  

RedmineのREST APIを使う

設定画面でAPIを有効にする

管理者アカウントでログインを行い、下記のチェックボックスをONにします。

管理 > 設定 > 認証 > 『RESTによるWebサービスを有効にする』

アクセスキーを取得する

APIを使いたいアカウントでログインを行い、下記の表示を確認する。

個人設定 > 右側に『APIアクセスキー』が表示されている

認証

上記で取得したアクセスキーを、リクエストヘッダX-Redmine-API-Keyに付与すればOK。簡単!

サンプルAPI

GET /issues.xml
=> returns the 25 first issues

GET /issues.xml?limit=100
=> returns the 100 first issues

GET /issues.xml?offset=30&limit=10
=> returns 10 issues from the 30th

Redmine APIのJava用ライブラリ

APIなので自分で仕様を読んで実装しても良いとは思いますが、Javaから操作する場合は便利なライブラリを使いましょう。

Redmine Java API

うちではこれを使っています。
Mavenのセントラルリポジトリでも管理されてるので、簡単に導入出来ます。

以下サンプルコード

    String uri = "https://www.hostedredmine.com";
    String apiAccessKey = "a3221bfcef5750219bd0a2df69519416dba17fc9";
    String projectKey = "taskconnector-test";
    Integer queryId = null; // any

        ...

        RedmineManager mgr = RedmineManagerFactory.createWithApiKey(uri, apiAccessKey);
        IssueManager issueManager = mgr.getIssueManager();
        List<Issue> issues = issueManager.getIssues(projectKey, queryId);
        for (Issue issue : issues) {
            System.out.println(issue.toString());
        }

        // Create issue
    Issue issueToCreate = IssueFactory.createWithSubject("some subject");
    Issue createdIssue = issueManager.createIssue(projectKey , issueToCreate);

        // Get issue by ID:
    Issue issue = issueManager.getIssueById(123);

 

アグリチームでチケットに載せている情報

  • 発生件数
  • 例外名
  • 発生日時
  • 発生クラス名
  • 発生クラス行数
  • どのサーバーで発生したか
  • どの金融機関か
  • どのバージョンのビルドか

クラス名と行数が同じチケットがあれば、そのチケットの発生件数をインクリメントして、同一チケットの内容を更新するようにしています。
発生件数の降順にソートすれば、最もユーザーに影響があるものがわかるようになっており、エンジニアはその修正に集中出来るようになっています。
 

何が改善されたか

  • 大量のログ監視メールから開放された
  • 業務が回るようになった
  • 頻度と重要度が可視化された

もはやチケット自動起票の仕組みなしには運用出来ません!
出来るところはどんどん自動化したいですね!  

最後に

マネーフォワードでは、開発効率向上の為にどんどん新しい事にチャレンジするようなエンジニアを募集しています!
みなさまのご応募お待ちしております!

マネーフォワード採用サイト
https://recruit.moneyforward.com/

Wantedly
https://www.wantedly.com/companies/moneyforward