testcontainers-pythonでminioを使う際に少々手間どったのでメモに残します。
なお、この記事ではtestcontainers自体のメリット等については記載いたしません。
環境
- Python
- 3.12
- boto3
- 1.34.69
- minio
- 7.2.5
- testcontainers
- 4.1.1
ゴール
boto3でminioに対してファイルアップロードできたことを検証します。minioについてはtestcontainersでセットアップします。
下準備
testcontainersとminioをdevDependenciesに加えます。各々のパッケージマネジャで読み替えてください。
rye add --dev minio rye add --dev testcontainers
minioの起動
まずは、access_keyとsecret_keyを指定します。指定しない場合のデフォルトはminioadminです。
また、localの検証で使用しているminioと同じimageを指定しましょう。理由はわかりませんが、ライブラリではminio/minio:RELEASE.2022-12-02T19-19-22Z"を指定しています。
起動ポートを修正したい場合はportを指定しましょう。基本的にはデフォルトの9000で問題ないはずです。
from testcontainers.minio import MinioContainer async def test_01(self): config = MinioContainer( access_key="minio", secret_key="minio1234", image="minio/minio" )
次に、get_client()で起動後のインスタンスを取得します。commandは簡単には渡せなさそうですので、このインスタンスを元に必要なバケットを作成します。今回はtmp.localバケットを作成しました。
次にDocker環境でテストする場合は不要ですが、それ以外の環境でテストする場合はTestContainersを外部からアクセスすることになるので、外部ポートを知る必要があります。minio.get_config()["endpoint"]でエンドポイントの情報を取得してください。今回の私は環境変数のS3_URLに格納しています。
with config as minio: minio_client = minio.get_client() minio_client.make_bucket("tmp.local") os.environ["S3_URL"] = minio.get_config()["endpoint"]W
そのほかに取得できる情報としては次のとおりです。
{ 'endpoint': 'localhost:32841', 'access_key': 'minio', 'secret_key': 'minio1234' }
boto3をセットアップする
今まで設定したaccess_keyやsecret_key、S3_URLをboto3の作成時に渡してください。
import os import boto3 # type: ignore boto3.client( "s3", endpoint_url=f"http://{os.getenv('S3_URL', 'localhost:9000')}", aws_access_key_id="minio", aws_secret_access_key="minio1234", )
ファイルアップロードする
ファイルアップロードするロジックはboto3の使い方なので省略します。詳細はソースコードを見てください。
アップロードしたファイルを検証する
minioのインスタンスを操作すればアップロードしたファイルを確認できます。
minio_client.get_object("任意のbucket", "任意のキー").data
ソースコード
終わりに
minioのtestcontainersのexampleとしては問題ないのですが、実際にboto3からアクセスしようとしたときにポートが分からなくて困りました。最終的な本番環境ではS3を使用する人が多いと思うので、boto3の方がexampleとしては嬉しいんですがね…。
ただ、今回testcontainersを使用してみましたが、正直な感想としてはテストが遅くなるのでちゃんとユースケースは絞って利用したいですね。並列実行のテストをするときに、今回のtestcontainersは役立つと思われます。
参考情報
- testcontainers-pythonのドキュメント
- testcontainers-pythonのminioのページ
- GitHub