ryeを使って、BoxのデータをS3に同期するバッチを作成する〜前編:rye導入編〜

## 概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623937/b18f20a4-98cf-b9ff-7562-4224aeb68079.png)

Pythonのパッケージツールであるryeを使って、BoxのデータをS3に同期するバッチを作成しようと思い、記事を執筆しています。

:::note info
内容が長くなることが予想されるので、前編・後編の２本立てで執筆しています。
前編→ryeでの環境構築
後編→SAMを使ってBoxのデータをS3に同期するバッチを作成する

前編である今回は、ryeでの環境構築についてまとめてみました。
:::

## 【背景】何のためのバッチを作成するのか？〜想定成果物〜
今回の想定成果物について考えてみました。
Kendra-Bedrockを組み合わせる、「よくあるAWSでRAGを実現するケース」を考えます。
その際、データソースを用意するドキュメントが必要になると思います。例えば、「社内文書検索」というケースでは、検索対象となるドキュメントは、BoxやGoogle Driveなど、別の場所に格納されているのが多くのケースで考えられると思います。
そこで、今回はBoxを使って、以下の要件に基づいたバッチ作成を考えます。
- データソースとなるドキュメントが対象となるBoxのフォルダに配置されたらS3にドキュメントが同期される
- S3に同期される際、ドキュメントのメタデータが付与されるようにする
    - Kendraで検索する際、ドキュメントカテゴリでフィルタリングをすることができるようにするため


## ryeとは？
https://rye.astral.sh/

Ryeは、Pythonプロジェクトの開発における バージョン管理、パッケージ管理、仮想環境の管理 を一元化するためのツールです。近年注目されているRustで開発されており、既存のツールと比べて軽量・高速に動作する、と言われているようです。

:::note warn
記事を執筆していて気がついたのですが、
後継のパッケージ`uv`の利用が現在推奨されているようです。
`uv`についての記事は、また別記事でまとめたいと思います。
::: 
## ryeの導入手順
以下の手順で、ryeプロジェクトを作成することができます。実行コマンドとその結果を、記しています。
Rust製ということもあり、pipやpoetryなど他のパッケージ管理ツールと比べてインストールにかかる時間が短い気がしました。

::: note info
プロジェクト作成時のイメージ（`rye init`実行後作成される）
![スクリーンショット 2025-01-04 16.37.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623937/6a2f09cd-e8bb-c879-5e78-74cb5c7160b3.png)
:::

<details><summary>ryeをインストール</summary>

```bash
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!
```

</details>



<details><summary>ryeプロジェクト作成</summary>

```bash
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
```

</details>

<details><summary>rye addを実行し、利用するライブラリを追加</summary>

```bash
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`で追加していく必要があるのかなと思われます。
※番外編もご覧ください。

</details>



<details><summary>rye syncでパッケージを実際にインストール</summary>

```bash
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
```

</details>


:::note info
pythonのバージョンを変えたいときは、 

```bash
rye pin 3.XX（バージョン）
```
を実行することで変更が可能です。


:::


### 番外編①)rye add は一括で行うことができるのか確認
`pip`使用時でいうところの`pip install -r requirements.txt`のような形で、一括でaddすることはできないかということを試してみました。
`requirements.txt`を作成し、以下のような形でコマンドを叩くと一括でパッケージを追加できるようです。
```bash
$ 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」がわりかし便利
![スクリーンショット 2025-01-04 16.06.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3623937/8dad1b45-6c6d-7b56-efda-309bf77de34c.png)

ryeの開発元のAstralが作成している[Ruff](https://marketplace.visualstudio.com/items?itemName=charliermarsh.ruff)を使うことで、Black, isort、Flake8といったPythonのLinterを使わずに、一括でコードフォーマットを行うことができるようです。
例えば、`.vscode/settings.json`に下記を追加することで利用できるようです。

```.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に同期するバッチを実際に作ってみた記事をご紹介できればと思います。

## 参照
https://note.spectee.com/n/n12fae344a538

https://scr.marketing-wizard.biz/dev/rye-install-requirements-txt