[Python] Boto3でのスレッドセーフまとめ。3種類のオブジェクトこれだけ覚えておけばOK

Boto3のオブジェクト、client、resource、sessionのスレッドセーフについてまとめ。
2023.10.16

こんにちは。サービス開発室の武田です。

以前Sessionオブジェクトのスレッドセーフについて言及しました。よければこちらもご覧ください。

スレッドセーフまとめ

いきなりですがまとめです。Boto3のスレッドセーフについては、これを覚えておけばもう迷いません。

オブジェクト マルチスレッド マルチプロセス 作成例
client Yes No ec2 = boto3.client("ec2")
resource No No s3 = boto3.resource("s3")
session No No session = boto3.session.Session()

基本的にはclientが唯一の(マルチスレッドにおける)スレッドセーフなオブジェクトです。しかしネットワーク実装の関係から、マルチプロセスでは使用しないのが無難なようです。つまりマルチプロセスでは、すべてのBoto3オブジェクトは共有できません。

clientについて補足

clientはそのまま使用する分にはスレッドセーフですが、一部注意しなければいけない点があります。こちらをドキュメントから引用します。

Shared Metadata: Clients expose metadata to the end user through a few attributes (namely meta, exceptions and waiter_names). These are safe to read but any mutations should not be considered thread-safe.

Custom Botocore Events: Botocore (the library Boto3 is built on) allows advanced users to provide their own custom event hooks which may interact with boto3’s client. The majority of users will not need to use these interfaces, but those that do should no longer consider their clients thread-safe without careful review.


引用元:Multithreading or multiprocessing with clients

簡単にまとめると、変更操作と独自のイベントフックを使用する場合は無条件にスレッドセーフではなくなるから気をつけましょうね。ということになります。

まとめ

Boto3を利用する上で、どれがスレッドセーフだったか確認することがままありました。結論としてはclientのみがスレッドセーフということになります。

参考URL