困っていること
StepFunctions
を使ってLambdaを組み立てる場合、JSONデータのサイズ上限に引っかかってしまう。
{ "error": "States.DataLimitExceeded", "cause": "The state/task 'arn:aws:lambda:ap-northeast-1:892368313445:function:hoge' returned a result with a size exceeding the maximum number of characters service limit." }
やりたいこと
- DynamoDBの
Scan
で全件データを取得する際に、返ってくるattributeを指定したい。- 全attributeが返ってくるのを防ぐことで、JSONのサイズを小さくしたい。
環境
- AWS DynamoDB
- AWS Lambda Function(Python3.6+boto3)
- AWS StepFunctions
実現方法
- Pythonで
projectionExpression
を指定して、取得するattributeを絞る。 - 複数ある場合は、
''
で属性をくくる。
以下、実装サンプル。
DynamoDB側の定義
large_class | small_class | created_at | large_class_keyword | small_class_keyword |
---|---|---|---|---|
String(パーティションキー) | String(レンジキー) | number | List | List |
実装サンプル
上記テーブルから、small_class
と、small_class_keyword
のみを抽出する。
dynamodb = boto3.resource('dynamodb') logger = logging.getLogger() logger.setLevel(logging.INFO) def lambda_handler(event, context): try: table = dynamodb.Table('categories') response = table.scan(ProjectionExpression='small_class, small_class_keyword') return {"category_datas": response['Items']} except ClientError as e: logger.error(e.response['Error']['Message'])
参考URL
ProjectionExpression は、スキャン結果に必要な属性を指定します。
--projection-expression を指定して、結果として返して欲しいattributeを限定して、コンパクトなレスポンスにしてみましょう。(このオプションを指定しないと、全attributeが返ります。)