きり丸の技術日記

技術検証したり、資格等をここに残していきます。

testcontainers-pythonでMinioを扱う

testcontainers-pythonでminioを使う際に少々手間どったのでメモに残します。

なお、この記事ではtestcontainers自体のメリット等については記載いたしません。

環境

  • Python
    • 3.12
  • boto3
    • 1.34.69
  • minio
    • 7.2.5
  • testcontainers
    • 4.1.1

ゴール

boto3minioに対してファイルアップロードできたことを検証します。minioについてはtestcontainersでセットアップします。

下準備

testcontainersminiodevDependenciesに加えます。各々のパッケージマネジャで読み替えてください。

rye add --dev minio
rye add --dev testcontainers

minioの起動

まずは、access_keysecret_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_keysecret_keyS3_URLboto3の作成時に渡してください。

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

ソースコード

終わりに

miniotestcontainersのexampleとしては問題ないのですが、実際にboto3からアクセスしようとしたときにポートが分からなくて困りました。最終的な本番環境ではS3を使用する人が多いと思うので、boto3の方がexampleとしては嬉しいんですがね…。

ただ、今回testcontainersを使用してみましたが、正直な感想としてはテストが遅くなるのでちゃんとユースケースは絞って利用したいですね。並列実行のテストをするときに、今回のtestcontainersは役立つと思われます。

参考情報