こんにちは、エンジニアのAlvinです!今回は、AWS Startup Tech Meetup 関西 #1の登壇でお話しした「サーバレスを使って大量データ処理を実装した話」の概要について書いていきたいと思います。
背景
少し背景を説明すると、Baseconnectが提供する企業情報データベース「Musubu」は、企業の営業活動を支える高品質なデータを提供するために、技術と人力を組み合わせ、単なるスクレイピングやクローリング技術では実現できない独自のデータ製造に取り組んでいます。
しかし、日々更新されるジョブデータや外部媒体からの企業データの取得には限界があります。特に情報の更新性、網羅性に課題がありました。
そこで今回、パートナー企業様と連携することになりました。パートナー企業様の求人データとMusubuのデータベースを連携させることで、求人媒体に掲載されている企業の検索が可能になります。ターゲティング精度を高めることで、求職者の検索ニーズを最適化することを目指しました。
やろうとしたこと
システムを設計する場合、まずは要件を知ることが必要不可欠だと思います。そこで弊社が保持している情報を精査すると、以下のようなことを考慮する必要がありました。
- データはBaseconnectが作成したAPI Endpointに送信される
- 求人データは、パートナー企業様から、週1回受信する(数万件のデータ)
- どの会社の情報なのか特定する必要がある
- 企業が特定された求人データはMusubuのデータベースに追加する必要がある
これらの内容を実現するために、まず最初に思い浮かんだのはサーバーで構築することです。求人データを受信するエンドポイントとして機能し、それを処理してMusubuのデータベースに挿入するための常時稼働のサーバーです。
しかし、週1回実行される処理の場合、インスタンスを構築するのは無駄が多いと考え、別の選択肢を検討することにしました。
サーバーレスの活用
次に考えたのがサーバーレスについてです。 エンドポイントには、AWS API GatewayとAWS Lambdaを使うのはどうかと考えました。しかし、ここで厄介なことがありました。
それは、送られてきた求人データをどのように処理するかです。理想としては、受け取ったものを、そのまま処理することですが、ここでいくつかの問題がありました。
問題点
- 忙しい時間帯には、Musubuのデータベースが負荷に耐えられない恐れがある。
- 処理にかかる時間は少なくとも3時間が必要と予測される。対して、AWS Lambdaは15分しか起動しない。
そのため、これらの問題点をクリアにするために、新たなサービスを探しました。そこで見つけたサービスが「AWS Batch」です。サーバーレスでの実行ができ、好きなタイミングでのトリガー設定や、長時間実行できるという、まさに求めていた内容にぴったりの優れたサービスでした。
開発プロセス
ここでは、そのAWS Batchを使った開発過程を簡単にご紹介します。
- まず、ローカルにDockerイメージを構築し、gitでコードを管理します。コンテナを作って、その中でコードを実行できれば問題ありません。
- コーディング後、AWS Elastic Container Registryでイメージリポジトリを作成し、そこにプッシュしました。毎回ローカル環境からプッシュするのは運用効率が悪いので、CI/CDを設定しています。Githubのgitリポジトリを更新すると、CI/CDパイプラインがAWS ECRの更新を代行してくれます。
- 最後に、週1回バッチを実行させたいので、AWS Eventbridgeを利用しています。AWS EventbridgeはAWS Batchと統合されており、どのジョブをいつ実行するかを選択するだけでできます。これでScheduledジョブは完了です。
※実装の詳細については省略します。
まとめ
全体として、このような仕組みになりました。
- パートナー企業様から求人データを受け取って、当社のストレージ(AWS S3)に格納します。
- 翌日、AWS Batchのジョブが実行され、処理されます。まず、CSVからのデータを抽出し、弊社のデータベーススキーマに変換します。
- 次に、どの求人データがどの会社のものかを弊社の名寄せシステムで識別します。
- 最後に、品質を保証するため、データのチェックを行います。問題がなければ「Musubu」で公開し、お客様に提供します。
終わりに
Baseconnectでは「これは本当にベストな方法なのか?」と常に新しいやり方を模索することを大事にしています。今後もより良いユーザーエクスペリエンスを実現するために、日々取り組んでいきたいと思います。ありがとうございました。 今回の取り組みの詳細はこちらからご覧下さい!