あるDynamoDBハンズオンの落とし穴?
DVAの勉強のために、以下のDynamoDBのハンズオンをやっていたところ、2か所ほど手順通りにいかなかったので、記録として残しておきます。
Pythonを使用して、DynamoDBのテーブルをクエリおよび管理する
ModuleNotFoundError: No module named 'boto3'
その1 環境構築の手順のうち、
「ステップ 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というファイルがありますが、記述が不足しており、そのまま実行してもエラーになります。
もともとのファイルは以下のようになっています。
# 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のインポートやテーブルの読み込み処理が不足しているためです。
上記のファイルを以下のように修正します。
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