motoでDynamoDBをモックするときはmock_dynamodbを使用することになったので歴史を振り返ってみた

こんにちは。サービス開発室の武田です。boto3のモックライブラリmotoについて、DynamoDBのAPIについて調べてみました。
2023.08.23

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

PythonのAWSライブラリといえばboto3ですね。boto3を使用することで、簡単にプログラムからAWSリソースを操作できます。外部APIを使用する際に課題となるのはユニットテストです。Pythonではmotoという、boto3のモッキングライブラリが開発されており、これを使用することでboto3を使用しているプログラムのテストが比較的容易に実行できます。

motoではデコレータを使用してモックを使用します。たとえばDynamoDBのモックを差し込みたい場合、次のように書きます。

@mock_dynamodb2
def test_dynamodb():
  pass

さて、長らくmotoユーザーの間では、DynamoDBをモックするならmock_dynamodb2を使用するのが常識でした。実はv4.0.0でこのAPIは削除され、代わりにmock_dynamodbを使用することになりました。結論としてはこれだけなのですが、このエントリでは、少しこのAPIの変遷について追ってみましょう。

そもそもdynamodbとdynamodb2とは

最新のmotoでは(正確にはv4.0.0以降では)mock_dynamodbというAPIを使用することになったわけですが、そもそもなぜ2種類もあったのでしょうか?

motoの初期実装ではmock_dynamodbだけが存在し、mock_dynamodb2が実装されたのは2014年のことです。

Dynamo v2 no indexes by creyer · Pull Request #69 · getmoto/moto

当時のAWS事情を知っている方はどれくらいいるでしょうか。実は2014年というのは boto3が登場する以前の話 です。

このころはまだbotoという(boto3とは違う)ライブラリが使われていました。そしてbotoでDynamoDBv2というAPIが実装されたようです。motoではこの新しいAPIに対応するため、従来のmock_dynamodbとは別にmock_dynamodb2を実装したという経緯のようです。

mock_dynamodbが対応していたのは古いAPIのため、boto3でモックする場合はmock_dynamodb2を使用するということになったのでしょう。

mock_dynamodb2は同一実装となり非推奨へ

前述のような経緯で、長らくmock_dynamodb2を使用していましたが、次のPRでこれが非推奨となりました。

Deprecate mock_dynamodb2 by bblommers · Pull Request #4919 · getmoto/moto

v3.1.0で取り込まれており、ポイントは次の3点です。

  1. moto/dynamodbディレクトリがmoto/dynamodb_v20111205にリネームされた
  2. moto/dynamodb2ディレクトリがmoto/dynamodbにリネームされた
  3. mock_dynamodbmock_dynamodb2は同一実装となった

つまり古いAPIはバージョン番号を付与した名前に変えてしまい、実質標準となっていたdynamodb2dynamodbにしたというわけです。これによってmock_dynamodb2は非推奨となりましたが、将来のバージョンで削除されるまでは、どちらを使っても同じ挙動をします。

mock_dynamodb2削除

その後、非推奨となっていたmock_dynamodb2v4.0.0で削除されます。

Remove DynamoDB2/RDS2 decorators by bblommers · Pull Request #5383 · getmoto/moto

これによって、完全にmock_dynamodb2は使用できなくなり、mock_dynamodbを使用することになりました。

moto時系列まとめ

  • 2013-02-16 first commit
  • 2013-02-27 v0.0.3リリース(dynamodb実装)
  • 2014-01-12 v0.2.16リリース(dynamodb2実装)
  • 2015-06-23 boto3 GA
  • 2017-05-13 moto GA
  • 2022-03-13 v3.1.0リリース(dynamodb2非推奨)
  • 2022-08-20 v4.0.0リリース(dynamodb2削除)

まとめ

motoでDynamoDBをモックする場合、バージョンによって使用するデコレーターが変わります。最新版を使用する際は、mock_dynamodbを使用してください。