📝

あるDynamoDBハンズオンの落とし穴?

2021/09/13に公開

DVAの勉強のために、以下のDynamoDBのハンズオンをやっていたところ、2か所ほど手順通りにいかなかったので、記録として残しておきます。
Pythonを使用して、DynamoDBのテーブルをクエリおよび管理する

その1 ModuleNotFoundError: No module named 'boto3'

環境構築の手順のうち、
「ステップ 3:サポートコードをダウンロードする」
で、
sudo pip install boto3
を実行する手順がありますが、インストール後にPythonスクリプトを実行したところ、
ModuleNotFoundError: No module named 'boto3'
というエラーが発生しました。

解決策は、
sudo pip3 install boto3
を実行することでした。

以下の記事が参考になりました。
ModuleNotFoundError: No module named 'boto3’

pipでboto3を入れていたが、pip3にしなければいけないようだ。
単にpipだとPython2.7が実行されていたが、boto3の場合はPython3用のpip3をインストールしなければならなかった。

その2 update_item.pyの記述が足りない

項目の更新の手順で、UpdateItem APIを実行する、update_item.pyというファイルがありますが、記述が不足しており、そのまま実行してもエラーになります。

もともとのファイルは以下のようになっています。

update_item.py
# The UpdateItem API allows you to update a particular item as identified by its key.
resp = table.update_item(
    Key={"Author": "John Grisham", "Title": "The Rainmaker"},
    # Expression attribute names specify placeholders for attribute names to use in your update expressions.
    ExpressionAttributeNames={
        "#formats": "Formats",
        "#audiobook": "Audiobook",
    },
    # Expression attribute values specify placeholders for attribute values to use in your update expressions.
    ExpressionAttributeValues={
        ":id": "8WE3KPTP",
    },
    # UpdateExpression declares the updates you want to perform on your item.
    # For more details about update expressions, see https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html
    UpdateExpression="SET #formats.#audiobook = :id",
)

これを実行すると、tableという変数が定義されていないというエラーになります。
なぜかこのファイルだけboto3のインポートやテーブルの読み込み処理が不足しているためです。
上記のファイルを以下のように修正します。

update_item.py
import boto3 //追記

dynamodb = boto3.resource('dynamodb', region_name='us-east-1') //追記
table = dynamodb.Table('Books') //追記

# The UpdateItem API allows you to update a particular item as identified by its key.
resp = table.update_item(
    Key={"Author": "John Grisham", "Title": "The Rainmaker"},
    # Expression attribute names specify placeholders for attribute names to use in your update expressions.
    ExpressionAttributeNames={
        "#formats": "Formats",
        "#audiobook": "Audiobook",
    },
    # Expression attribute values specify placeholders for attribute values to use in your update expressions.
    ExpressionAttributeValues={
        ":id": "8WE3KPTP",
    },
    # UpdateExpression declares the updates you want to perform on your item.
    # For more details about update expressions, see https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html
    UpdateExpression="SET #formats.#audiobook = :id",
)

処理の最初に、以下のようにboto3のインポートと、テーブルの読み込みを追記すれば正常に動きます。

import boto3

dynamodb = boto3.resource('dynamodb', region_name='us-east-1')
table = dynamodb.Table('Books')

フィードバック送りたいけど

このハンズオンにはフィードバックを送る箇所がなかったので、送れませんでした。
こういう場合、どこからフィードバックすればいいんでしょうね。

まとめ

今回はDynamoDBのハンズオンにあった2つの落とし穴?について記録を残しました。
どなたかの参考になれば幸いです。

Discussion