
AWS Lambdaを用いたサーバレス開発の事例
※こちらの記事はHatenaBlog「Industry One Tech Blog」の転載となります
1.はじめに
こんにちは、エンジニアの石橋です。インダストリー・ワンでは所属する各エンジニアが様々な業界のクライアントのDXに取り組んでいます。今回は私がテックリードとして関わった案件事例を紹介します。大人の事情により実際に取り扱ったデータの詳細などは伏せますが、インダストリー・ワンのエンジニアがどのような業務に携わっているかの一端が垣間見えると思います。
2.業務フロー
①As-is
この案件では、取引先からFAXで受け取った資料の情報を元に、手作業でExcelファイルを作成していました。1日に様々な取引先から何件もFAXが来るので、数名が毎日その作業を行う必要があります。

また、Excelファイル作成作業について補足すると、Excelファイルの内容はFAXの内容をただ写すだけではなく、Excelファイルの一部項目においては以下のような処理も必要としていました。
FAXの内容から必要な項目を抽出
取引先とFAXの内容から手元のデータで必要なものを抽出
1と2のデータを組み合わせて電卓で計算
3の演算結果をExcelに入力
以上の作業は、一部はすでにExcelマクロを利用して自動化している部分もありましたが、作業者の方の手を動かす必要は依然として残っていました。
②To-Be
このプロジェクトの主な目的は、現在手作業で行われているExcelファイル作成タスクを自動化することで、Excelファイルの作成コストを下げることです。また、取引先の業務フローは変更せず引き続きFAXを利用してもらうという制約がありました。
上記を踏まえて、デジタルFAXとOCR(文字認識)を利用してExcel作成作業を自動化することにしました。処理内容は以下の通りです。

上記の処理であれば、Excelファイル作成までに人の手を介す必要はなくなります。To-Be業務フローの大枠が固まったところで、実際にどのようなサービスを活用するのが良いかを様々な視点で考えます。
3.技術調査
①デジタルFAX
デジタルFAXは受け取ったFAXを紙で出力せず、webブラウザ上で見ることができるサービスです。様々な会社がデジタルFAXのサービスを提供しています。実際に導入したデジタルFAXのサービス名は伏せますが、今回は自動化のためにWebAPIを提供しているサービスから利用料やセキュリティ等を考慮して選びました。
②OCRサービス
画像の文字起こしをするOCRサービスは、デジタルFAXと同様にWebAPIを提供しているサービスに絞った上で、独自に精度や機能を評価を行いました。評価項目は以下の通りです。
活字や手書きの文字がどの程度正確に認識可能か
FAXのフォーマット毎に自動で仕分けて適切なOCRができるか
歪みや傾きを補正できるか
利用料
画像の読み込み領域を設定するUIの利便性
etc...
OCRはデジタルFAXより考慮する項目が多かった分、少し時間を掛けて調査しました。実際に導入したサービスの名は伏せますが、以上のような手順を踏んで総合的に評価してサービスの選定を行っています。
4.AWSサーバレス開発
①アーキテクチャ
OCRの結果とデータを用いて必要なデータを計算し、Excelファイルに書き込む演算処理の部分は、クラウドサービスを活用していくことにしました。クラウドサービスに関しては弊社のエンジニア内ではAWSを活用する方針で、クライアントの了承も得られたためAWSとなりました。
アーキテクチャは処理時間や夜間にFAXを受け取ることがない事情のため、コストパフォーマンスを考慮してAWS Lambdaを用いたサーバレスの構成で開発することにしました。以下がアーキテクチャの詳細です。

上記アーキテクチャの実線矢印はデータの流れを、破線矢印は制御の流れを表しています。各処理の詳細は以下のとおりです。
FAX確認イベント(CloudWatchEvent)
デジタルFAXサービスがFAX受信時に動作するコールバック機能を提供していなかったので、n分毎にFAXを確認する"FAXとOCRの連携Lambda"を起動
FAXとOCRの連携(Lambda)
OCR確認イベント(CloudWatchEvent)
OCR完了検知(Lambda)
演算処理(Lambda)
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を利用してコード化しています。
5.おわりに
今回はFAXの情報からExcelファイルの作成する業務フローを自動化するソリューションを実際にどのように開発したのかというお話でした。実はここで紹介するためにかなり簡略化しており、実際の業務フローやアーキテクチャは更に複雑なものとなっています。そこをどう解決するのかは、仕事を行う上で苦労するところだったり、醍醐味だったりします。
最後まで読んで頂きましてありがとうございました。
インダストリー・ワンでは一緒に働く仲間を募集しています。