紙一重の積み重ね

35歳のエンジニアがなれる最高の自分を目指して、学んだことをこつこつ情報発信するブログです。

【AWS DynamoDB + Python3】欲しいattributeだけを選択してScanする方法

f:id:yokoyantech:20180718172857p:plain

困っていること

  • 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

docs.aws.amazon.com

ProjectionExpression は、スキャン結果に必要な属性を指定します。

dev.classmethod.jp

--projection-expression を指定して、結果として返して欲しいattributeを限定して、コンパクトなレスポンスにしてみましょう。(このオプションを指定しないと、全attributeが返ります。)