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