求人機能の実装の概要について(AWS Startup Tech Meetup 関西 #1より)

こんにちは、エンジニアのAlvinです!今回は、AWS Startup Tech Meetup 関西 #1の登壇でお話しした「サーバレスを使って大量データ処理を実装した話」の概要について書いていきたいと思います。

背景

少し背景を説明すると、Baseconnectが提供する企業情報データベース「Musubu」は、企業の営業活動を支える高品質なデータを提供するために、技術と人力を組み合わせ、単なるスクレイピングやクローリング技術では実現できない独自のデータ製造に取り組んでいます。

しかし、日々更新されるジョブデータや外部媒体からの企業データの取得には限界があります。特に情報の更新性、網羅性に課題がありました。

そこで今回、パートナー企業様と連携することになりました。パートナー企業様の求人データとMusubuのデータベースを連携させることで、求人媒体に掲載されている企業の検索が可能になります。ターゲティング精度を高めることで、求職者の検索ニーズを最適化することを目指しました。

やろうとしたこと

システムを設計する場合、まずは要件を知ることが必要不可欠だと思います。そこで弊社が保持している情報を精査すると、以下のようなことを考慮する必要がありました。

  • データはBaseconnectが作成したAPI Endpointに送信される
  • 求人データは、パートナー企業様から、週1回受信する(数万件のデータ)
  • どの会社の情報なのか特定する必要がある
  • 企業が特定された求人データはMusubuのデータベースに追加する必要がある

これらの内容を実現するために、まず最初に思い浮かんだのはサーバーで構築することです。求人データを受信するエンドポイントとして機能し、それを処理してMusubuのデータベースに挿入するための常時稼働のサーバーです。

しかし、週1回実行される処理の場合、インスタンスを構築するのは無駄が多いと考え、別の選択肢を検討することにしました。

サーバーレスの活用

次に考えたのがサーバーレスについてです。 エンドポイントには、AWS API GatewayAWS Lambdaを使うのはどうかと考えました。しかし、ここで厄介なことがありました。

それは、送られてきた求人データをどのように処理するかです。理想としては、受け取ったものを、そのまま処理することですが、ここでいくつかの問題がありました。

問題点

  • 忙しい時間帯には、Musubuのデータベースが負荷に耐えられない恐れがある。
  • 処理にかかる時間は少なくとも3時間が必要と予測される。対して、AWS Lambdaは15分しか起動しない。

そのため、これらの問題点をクリアにするために、新たなサービスを探しました。そこで見つけたサービスが「AWS Batch」です。サーバーレスでの実行ができ、好きなタイミングでのトリガー設定や、長時間実行できるという、まさに求めていた内容にぴったりの優れたサービスでした。

開発プロセス

ここでは、そのAWS Batchを使った開発過程を簡単にご紹介します。

  1. まず、ローカルにDockerイメージを構築し、gitでコードを管理します。コンテナを作って、その中でコードを実行できれば問題ありません。
  2. コーディング後、AWS Elastic Container Registryでイメージリポジトリを作成し、そこにプッシュしました。毎回ローカル環境からプッシュするのは運用効率が悪いので、CI/CDを設定しています。Githubのgitリポジトリを更新すると、CI/CDパイプラインがAWS ECRの更新を代行してくれます。
  3. 最後に、週1回バッチを実行させたいので、AWS Eventbridgeを利用しています。AWS EventbridgeはAWS Batchと統合されており、どのジョブをいつ実行するかを選択するだけでできます。これでScheduledジョブは完了です。

※実装の詳細については省略します。

まとめ

全体として、このような仕組みになりました。

  1. パートナー企業様から求人データを受け取って、当社のストレージ(AWS S3)に格納します。
  2. 翌日、AWS Batchのジョブが実行され、処理されます。まず、CSVからのデータを抽出し、弊社のデータベーススキーマに変換します。
  3. 次に、どの求人データがどの会社のものかを弊社の名寄せシステムで識別します。
  4. 最後に、品質を保証するため、データのチェックを行います。問題がなければ「Musubu」で公開し、お客様に提供します。

終わりに

Baseconnectでは「これは本当にベストな方法なのか?」と常に新しいやり方を模索することを大事にしています。今後もより良いユーザーエクスペリエンスを実現するために、日々取り組んでいきたいと思います。ありがとうございました。 今回の取り組みの詳細はこちらからご覧下さい!

speakerdeck.com