AWS Lambdaを用いたサーバレス開発の事例

はじめに

こんにちは、エンジニアの石橋です。インダストリー・ワンでは所属する各エンジニアが様々な業界のクライアントのDXに取り組んでいます。今回は私がテックリードとして関わった案件事例を紹介します。大人の事情により実際に取り扱ったデータの詳細などは伏せますが、インダストリー・ワンのエンジニアがどのような業務に携わっているかの一端が垣間見えると思います。

業務フロー

As-is

この案件では、取引先からFAXで受け取った資料の情報を元に、手作業でExcelファイルを作成していました。1日に様々な取引先から何件もFAXが来るので、数名が毎日その作業を行う必要があります。

また、Excelファイル作成作業について補足すると、Excelファイルの内容はFAXの内容をただ写すだけではなく、Excelファイルの一部項目においては以下のような処理も必要としていました。

  1. FAXの内容から必要な項目を抽出
  2. 取引先とFAXの内容から手元のデータで必要なものを抽出
  3. 1と2のデータを組み合わせて電卓で計算
  4. 3の演算結果をExcelに入力

以上の作業は、一部はすでにExcelマクロを利用して自動化している部分もありましたが、作業者の方の手を動かす必要は依然として残っていました。

To-be

このプロジェクトの主な目的は、現在手作業で行われているExcelファイル作成タスクを自動化することで、Excelファイルの作成コストを下げることです。また、取引先の業務フローは変更せず引き続きFAXを利用してもらうという制約がありました。

上記を踏まえて、デジタルFAXとOCR(文字認識)を利用してExcel作成作業を自動化することにしました。処理内容は以下の通りです。

  1. 取引先からFAXをデジタルFAXで受け取る
  2. デジタルFAXで受け取ったFAXは画像なので、OCRで文字を抽出する
  3. OCRの結果とデータを用いて演算処理を行い、Excelを作成する

上記の処理であれば、Excelファイル作成までに人の手を介す必要はなくなります。To-Be業務フローの大枠が固まったところで、実際にどのようなサービスを活用するのが良いかを様々な視点で考えます。

技術調査

デジタルFAX

デジタルFAXは受け取ったFAXを紙で出力せず、webブラウザ上で見ることができるサービスです。様々な会社がデジタルFAXのサービスを提供しています。実際に導入したデジタルFAXのサービス名は伏せますが、今回は自動化のためにWebAPIを提供しているサービスから利用料やセキュリティ等を考慮して選びました。

OCRサービス

画像の文字起こしをするOCRサービスは、デジタルFAXと同様にWebAPIを提供しているサービスに絞った上で、独自に精度や機能を評価を行いました。評価項目は以下の通りです。

  • 活字や手書きの文字がどの程度正確に認識可能か
  • FAXのフォーマット毎に自動で仕分けて適切なOCRができるか
  • 歪みや傾きを補正できるか
  • 利用料
  • 画像の読み込み領域を設定するUIの利便性
  • etc...

OCRはデジタルFAXより考慮する項目が多かった分、少し時間を掛けて調査しました。実際に導入したサービスの名は伏せますが、以上のような手順を踏んで総合的に評価してサービスの選定を行っています。

 

AWSサーバレス開発

アーキテクチャ

OCRの結果とデータを用いて必要なデータを計算し、Excelファイルに書き込む演算処理の部分は、クラウドサービスを活用していくことにしました。クラウドサービスに関しては弊社のエンジニア内ではAWSを活用する方針で、クライアントの了承も得られたためAWSとなりました。

アーキテクチャは処理時間や夜間にFAXを受け取ることがない事情のため、コストパフォーマンスを考慮してAWS Lambdaを用いたサーバレスの構成で開発することにしました。以下がアーキテクチャの詳細です。

 

 

上記アーキテクチャの実線矢印はデータの流れを、破線矢印は制御の流れを表しています。各処理の詳細は以下のとおりです。

  • FAX確認イベント(CloudWatchEvent)
    • デジタルFAXサービスがFAX受信時に動作するコールバック機能を提供していなかったので、n分毎にFAXを確認する"FAXとOCRの連携Lambda"を起動
  • FAXとOCRの連携(Lambda)
    • API経由でFAXを受信しているかどうかを確認し、受信していればFAXの内容をOCRへ連携
  •  OCR確認イベント(CloudWatchEvent)
    • OCRサービスがOCR完了時に動作するコールバック機能を提供していなかったので、n分毎にOCRの結果を確認する"OCR完了検知Lambda"を起動
  • OCR完了検知(Lambda)
    • OCRが完了しているものがあれば、OCRの情報をメッセージとして"演算処理キュー"へ投入
  • 演算処理(Lambda)
    • S3にあるデータとOCRの結果を基に演算を行い、結果となるメッセージをを"Excel作成キュー"へ投入
  • Excel作成(Lambda)
    • 受け取ったデータを基にExcelを作成し、S3へ配置

SQSに関してはDLQを活用し、処理が失敗したデータは確認できるようにしています。

 

実は当初、マウス操作やキーボード操作等を自動化してくれるRPAを利用することも模索しました。しかし、RPAのライセンス等とAWSのLambdaを活用するランニングコストや保守のしやすさ等を比較した結果、AWSを活用することになりました。

 

開発環境

AWS Lambdaの開発は主にエンジニア2名(私含む)で行う予定だったのですが、以下の理由からPythonを選びました。

  • 開発に関わるエンジニア2人を始め社内で経験者が多い
  • AWS Lambdaランタイムでサポートしている

LambdaにおけるExcelファイルの作成ではopenpyxlを利用しました。既存のExcelファイルのセルの値を書き換えたり、新規にExcelファイルを作成することができるので使いやすかったです。

コード管理はGitHubを利用しており、GitHub Actionsを活用してCIテストを行っています。

デプロイはserverlessを利用してコード化しています。

おわりに

今回はFAXの情報からExcelファイルの作成する業務フローを自動化するソリューションを実際にどのように開発したのかというお話でした。実はここで紹介するためにかなり簡略化しており、実際の業務フローやアーキテクチャは更に複雑なものとなっています。そこをどう解決するのかは、仕事を行う上で苦労するところだったり、醍醐味だったりします。

最後まで読んで頂きましてありがとうございました。

 

インダストリー・ワンでは一緒に働く仲間を募集しています。

herp.careers