概要
Pythonのパッケージツールであるryeを使って、BoxのデータをS3に同期するバッチを作成しようと思い、記事を執筆しています。
内容が長くなることが予想されるので、前編・後編の2本立てで執筆しています。
前編→ryeでの環境構築
後編→SAMを使ってBoxのデータをS3に同期するバッチを作成する
前編である今回は、ryeでの環境構築についてまとめてみました。
【背景】何のためのバッチを作成するのか?〜想定成果物〜
今回の想定成果物について考えてみました。
Kendra-Bedrockを組み合わせる、「よくあるAWSでRAGを実現するケース」を考えます。
その際、データソースを用意するドキュメントが必要になると思います。例えば、「社内文書検索」というケースでは、検索対象となるドキュメントは、BoxやGoogle Driveなど、別の場所に格納されているのが多くのケースで考えられると思います。
そこで、今回はBoxを使って、以下の要件に基づいたバッチ作成を考えます。
- データソースとなるドキュメントが対象となるBoxのフォルダに配置されたらS3にドキュメントが同期される
- S3に同期される際、ドキュメントのメタデータが付与されるようにする
- Kendraで検索する際、ドキュメントカテゴリでフィルタリングをすることができるようにするため
ryeとは?
Ryeは、Pythonプロジェクトの開発における バージョン管理、パッケージ管理、仮想環境の管理 を一元化するためのツールです。近年注目されているRustで開発されており、既存のツールと比べて軽量・高速に動作する、と言われているようです。
記事を執筆していて気がついたのですが、
後継のパッケージuv
の利用が現在推奨されているようです。
uv
についての記事は、また別記事でまとめたいと思います。
ryeの導入手順
以下の手順で、ryeプロジェクトを作成することができます。実行コマンドとその結果を、記しています。
Rust製ということもあり、pipやpoetryなど他のパッケージ管理ツールと比べてインストールにかかる時間が短い気がしました。
ryeをインストール
maeno:/Users/maeno % curl -sSf https://rye.astral.sh/get | bash
This script will automatically download and install rye (latest) for you.
######################################################################## 100.0%
Welcome to Rye!
This installer will install rye to /Users/maeno/.rye
This path can be changed by exporting the RYE_HOME environment variable.
Details:
Rye Version: 0.43.0
Platform: macos (aarch64)
✔ Continue? · yes
✔ What should running `python` or `python3` do when you are not inside a Rye managed project? · Run a Python installed and managed by Rye
✔ Which version of Python should be used as default toolchain? · cpython@3.12
Installed binary to /Users/maeno/.rye/shims/rye
Bootstrapping rye internals
Fetching requested internal toolchain 'cpython@3.12.8'
Downloading cpython@3.12.8
Checking checksum
Unpacking
Downloaded cpython@3.12.8
Updated self-python installation at /Users/maeno/.rye/self
The rye directory /Users/maeno/.rye/shims was not detected on PATH.
It is highly recommended that you add it.
✔ Should the installer add Rye to PATH via .profile? · yes
Added to PATH.
note: for this to take effect you will need to restart your shell or run this manually:
source "$HOME/.rye/env"
To make it work with zsh, you might need to add this to your .zprofile:
source "$HOME/.rye/env"
For more information read https://rye.astral.sh/guide/installation/
All done!
ryeプロジェクト作成
maeno:/Users/maeno/dev/streamlit-rag-app % rye init streamlit-rag-app
success: Initialized project in /Users/maeno/dev/streamlit-rag-app/streamlit-rag-app
Run `rye sync` to get started
rye addを実行し、利用するライブラリを追加
maeno:/Users/maeno/dev/streamlit-rag-app/streamlit-rag-app % rye add boto3
Initializing new virtualenv in /Users/maeno/dev/streamlit-rag-app/streamlit-rag-app/.venv
Python version: cpython@3.12.8
Added boto3>=1.35.90 as regular dependency
Reusing already existing virtualenv
Generating production lockfile: /Users/maeno/dev/streamlit-rag-app/streamlit-rag-app/requirements.lock
Generating dev lockfile: /Users/maeno/dev/streamlit-rag-app/streamlit-rag-app/requirements-dev.lock
Installing dependencies
Resolved 8 packages in 3ms
Built streamlit-rag-app @ file:///Users/maeno/dev/streamlit-rag-app/streamlit-rag-app
Prepared 8 packages in 525ms
Installed 8 packages in 23ms
+ boto3==1.35.90
+ botocore==1.35.90
+ jmespath==1.0.1
+ python-dateutil==2.9.0.post0
+ s3transfer==0.10.4
+ six==1.17.0
+ streamlit-rag-app==0.1.0 (from file:///Users/maeno/dev/streamlit-rag-app/streamlit-rag-app)
+ urllib3==2.3.0
Done!
基本的には、一つずつ利用するライブラリをrye add
で追加していく必要があるのかなと思われます。
※番外編もご覧ください。
rye syncでパッケージを実際にインストール
maeno:/Users/maeno/dev/streamlit-rag-app/streamlit-rag-app % rye sync
Reusing already existing virtualenv
Generating production lockfile: /Users/maeno/dev/streamlit-rag-app/streamlit-rag-app/requirements.lock
Generating dev lockfile: /Users/maeno/dev/streamlit-rag-app/streamlit-rag-app/requirements-dev.lock
Installing dependencies
Resolved 46 packages in 8ms
Audited 46 packages in 0.08ms
pythonのバージョンを変えたいときは、
rye pin 3.XX(バージョン)
を実行することで変更が可能です。
番外編①)rye add は一括で行うことができるのか確認
pip
使用時でいうところのpip install -r requirements.txt
のような形で、一括でaddすることはできないかということを試してみました。
requirements.txt
を作成し、以下のような形でコマンドを叩くと一括でパッケージを追加できるようです。
$ rye add $(cat requirements.txt)
Initializing new virtualenv in /Users/maeno/dev/sync_box-files_to_s3/.venv
Python version: cpython@3.12.8
Added boto3>=1.35.91 as regular dependency
Added box-sdk-gen>=1.9.0 as regular dependency
Reusing already existing virtualenv
Generating production lockfile: /Users/maeno/dev/sync_box-files_to_s3/requirements.lock
Generating dev lockfile: /Users/maeno/dev/sync_box-files_to_s3/requirements-dev.lock
Installing dependencies
Resolved 14 packages in 3ms
Built sync-box-files-to-s3 @ file:///Users/maeno/dev/sync_box-files_to_s3
Prepared 5 packages in 335ms
Installed 14 packages in 46ms
+ boto3==1.35.91
+ botocore==1.35.91
+ box-sdk-gen==1.9.0
+ certifi==2024.12.14
+ charset-normalizer==3.4.1
+ idna==3.10
+ jmespath==1.0.1
+ python-dateutil==2.9.0.post0
+ requests==2.32.3
+ requests-toolbelt==1.0.0
+ s3transfer==0.10.4
+ six==1.17.0
+ sync-box-files-to-s3==0.1.0 (from file:///Users/maeno/dev/sync_box-files_to_s3)
+ urllib3==2.3.0
Done!
番外編② Rust製のLinter「Ruff」がわりかし便利
ryeの開発元のAstralが作成しているRuffを使うことで、Black, isort、Flake8といったPythonのLinterを使わずに、一括でコードフォーマットを行うことができるようです。
例えば、.vscode/settings.json
に下記を追加することで利用できるようです。
{
"[python]": {
"editor.codeActionsOnSave": {
"source.organizeImports": "explicit" //フォーマット時にimport行を整理
},
"editor.defaultFormatter": "charliermarsh.ruff", // フォーマットにRuffを使用
"editor.formatOnSave": true // コード保存時にフォーマット
}
}
最後に
ここまで読んでいただき、ありがとうございました。
簡単ではありますが、ここまでryeの導入手順についてまとめてみました。
コマンドも単純で、詰まることなく進められるので結構便利だな、という印象でした。
まだまだ新興のツールで、ドキュメントがまだまだ少ない点はありますが、今回触ってみて比較的導入のハードルは低いなと感じたので、今後積極的に使っていければと思いました。
後編では、ryeとAWS SAM(Serverless Application Model)を組み合わせて、BoxのデータをS3に同期するバッチを実際に作ってみた記事をご紹介できればと思います。
参照