AWS CDK で類似学生計算エンジンを定義して、 IaC の良さを感じる①
はじめに
こんにちは!株式会社POLでエンジニアをやっている @mejihabenatawa です!
POLは「研究者の可能性を最大化するプラットフォームを創造する」をビジョンに、理系学生に特化した採用サービス、および研究開発者・技術者に特化した転職/採用サービスの2サービスを運営しています。
最近、類似学生計算エンジンを AWS をつかって構築しているので、具体的な構成やハマった部分などを書いていきたいと思います。
長くなりそうなので、以下のような全四部作でお届けする予定です。
1. 全体構成編
2. AWS Glue 編
3. AWS Batch 編
4. AWS Step Functions etc 編
まずは全体構成編いきたいと思います!
AWS CDK とは
AWS CDKはプログラミング言語を使用してクラウドインフラストラクチャをコードとして定義し、それを AWS CloudFormation を通じてデプロイするためのオープンソースのソフトウェア開発フレームワークです。AWSが開発しているツールセットでCloud Development Kitの略です。インフラに限らない開発キットなので、Infrastructure as Code (IaC) と呼ぶのが適切なのかはわからないのですが、 AWS における IaC ツールと言って良いと思います。
IaC はオライリーの本(Infrastructure as Code)だと、「 Infrastructure as Code は自動化、バージョン管理、テスト、継続的インテグレーションといった、ソフトウェア開発のプラクティスをシステム管理に応用するための方法論です。」と定義されている。IaC は狭義だと単にサーバーやストレージ、アプリケーションの設定をソースコードで管理・プロビジョニングすること、広義だとソフトウェア開発者の開発者体験をインフラストラクチャまで拡張することみたいな感じだと思います。
IaC のメリット
以下の4つがあると、こちらの本にかかれています。
- 構築における再利用性と冪等性
- コード〜ドキュメント間におけるパラメータ値の乖離
- 改定証跡の担保
- アプリケーション開発者とのコラボレーション
説明の詳細は省きますが、インフラストラクチャ構築の属人性が高くなりやすい部分をコードとして定義できるので、レビューや共有がしやすいと思います。
今回の構成
以下のような構成のものを typescript で作成しました。
ざっくりとしたファイル構成は以下です
-- project
|
|-- batch -- AWS Batch 関連のディレクトリ
|
|-- cdk -- AWS CDK 関連のディレクトリ
|
|-- glue -- AWS Glue 関連のディレクトリ
|
|-- README.md
AWS Glue の役割
AWS Glue では RDS から学生のプロフィール情報を取得し、学生の特徴ベクトルの計算を行います。プロフィール情報の取得や学生の特徴ベクトルの計算は Python のスクリプトで定義できるので、そのファイルを glue 以下に配置し S3 にアップロードすることで、Glue 上で実行することができます。計算結果の学生ベクトルは S3 に保存します。
-- glue
|
|-- src
|-- calculate_vector.py -- ベクトルを計算する Python スクリプト
AWS Batch の役割
AWS Glue では Facebook 社が開発を行っている近傍探索ライブラリの Faiss を使用して、学生ベクトル同士の近さを計算し、ベクトルが近い学生を類似学生と見なし、DynamoDBに書き込みます。こちらも Python ファイルで書いたものを AWS Batch 上で実行します。元々 Lambda で実行しようとしていたのですが、" Function Can't open SHM2 failed " というエラーが発生して実行できませんでした。おそらく、faiss では shared memory が必要ですが、Lambda では /dev/shm がサポートされていなくて、SHM2 が使えないというものでした。
処理の流れとしては、Glue で保存した学生ベクトルを S3 から読み込み、Faiss Index を計算して、類似学生の ID を Dynamo DB に保存します。
-- batch
|
|-- src
| |-- calculate_faiss_index.py -- Faiss Index を計算する Python スクリプト
|
|_ Dockerfile -- AWS Batch 上で スクリプトを動かすための Docker ファイル
AWS Step Functions の役割
上記のアプリケーションのワークフローを定義し、一連のイベントとして実行します。スケジュールは AWS Event Bridge で定義し、Lambda と Slack で Error Handling をしています。
まとめ
今回は AWS CDK の紹介と、作成したシステムの概要を説明しました。インフラのコードだけではなく、Glue や Batch の Python スクリプトを github で管理しつつ、 Deploy も簡単にできるのでメリットを実感することができました。次回以降で各アプリケーションの書き方も紹介しますが、パラメータや開発環境ごとの変数も管理できるので便利だと思います。
ぜひ、続編も読んでいただければと思います!
株式会社POLではエンジニア、デザイナー、プロダクトマネージャーを大募集してます!お話しだけでも構いませんのでお気軽にお声がけください!!!