全件とってからの処理なので良い実装ではないけど、場合によっては使えるので、
TIPSを貯める目的として…
DynamoDBのテーブルは、こんなシンプルな感じで、
そこからランダムな100件のリストを作成したいと思います。
要件は下記とします。
- レコード数はそれほど多くない(全件取得してもLambda内で処理できる)
- レコード数が100件未満の場合もあるため、リストの値は重複OK
で、Python(Lambda)で楽にできないかなー、とググってたら、いい記事見つけました。
“random.choice(リスト)”っていうのを使うと、リスト中の値から、
ランダムに一件を取得できるようです。
ということで、コード(Lambda)は下記のとおりです。
(余計な処理も入ってますが…)
import logging import random import boto3 image_url = "http://xxxxxxxxxxxxxx.cloudfront.net/" def lambda_handler(event, context): logger = logging.getLogger() logger.setLevel(logging.INFO) try: logger.info(event) table = boto3.resource("dynamodb").Table("image") response = table.scan() logger.info(response) items = [] if response["Count"] != 0: for i in range(0, 100): id = random.choice(response["Items"])["id"] items.append({ "id": id, "url": image_url + id + ".png"}) logger.info(items) return items except Exception as e: logger.error(e) raise e
上記を実行すると、次のようなDynamoDBのテーブルのレコードから、
100件ランダムに取得した(重複あり)リストを作成することができました。
[ { "url": "http://xxxxxxxxxxxxxx.cloudfront.net/fa4ee1f2838b11e59f9436cb5329c05c.png", "id": "fa4ee1f2838b11e59f9436cb5329c05c" }, { "url": "http://xxxxxxxxxxxxxx.cloudfront.net/436f0c8c838b11e59f9436cb5329c05c.png", "id": "436f0c8c838b11e59f9436cb5329c05c" }, ... ]