全件とってからの処理なので良い実装ではないけど、場合によっては使えるので、
TIPSを貯める目的として…
DynamoDBのテーブルは、こんなシンプルな感じで、
そこからランダムな100件のリストを作成したいと思います。
要件は下記とします。
- レコード数はそれほど多くない(全件取得してもLambda内で処理できる)
- レコード数が100件未満の場合もあるため、リストの値は重複OK
で、Python(Lambda)で楽にできないかなー、とググってたら、いい記事見つけました。
“random.choice(リスト)”っていうのを使うと、リスト中の値から、
ランダムに一件を取得できるようです。
ということで、コード(Lambda)は下記のとおりです。
(余計な処理も入ってますが…)
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | 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件ランダムに取得した(重複あり)リストを作成することができました。
01 02 03 04 05 06 07 08 09 10 11 | [ { "url" : "http://xxxxxxxxxxxxxx.cloudfront.net/fa4ee1f2838b11e59f9436cb5329c05c.png" , "id" : "fa4ee1f2838b11e59f9436cb5329c05c" }, { "url" : "http://xxxxxxxxxxxxxx.cloudfront.net/436f0c8c838b11e59f9436cb5329c05c.png" , "id" : "436f0c8c838b11e59f9436cb5329c05c" }, ... ] |