【小ネタ】Pythonで書いたLambda関数からnullしか返ってこない時の対処法

2018.08.02

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

どうも、福岡のmeです。

今回はLambdaからDynamoDBのデータを取得するというシンプルな実装をしていたのですが、
嵌りどころがあったので同じことが繰り返されぬよう静かにここに書き記しておきます。

やろうとしていたこと

Lambda関数からDynamodbへアクセスし、データを取得

環境

Python 3.6 + Boto3

問題のコード

必要な処理を

getUsers()

内に書きLambda_handlerから呼び出すような形で実装していました。

import boto3
import os
from boto3.dynamodb.conditions import Key, Attr
from botocore.exceptions import ClientError

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table(os.environ['DB_TABLE_NAME'])
    
def getUsers(event, context):
    group_id = event["group_id"]

    try:
        items = table.scan(
            FilterExpression=Attr('group_id').eq(group_id)
            )

    except ClientError as e:
        print(e.response['Error']['Message'])
    else:
        print("GetItem SUCCESS:")
        print(items) # -> データの取得はできている
        return items[‘Items’] #-> null?
    
def lambda_handler(event, context):
   getUsers(event, context)

response

このようなレスポンスが返りました。

21行目のprint()ではデータが取れているのにも関わらずresponse はnullです。

解決策

Lambda_handlerからメソッドを呼び出すだけでは
自動的にメソッドから返る値を返してくれないことがわかりました。

return をつけることで無事にデータを取得することができました。

import boto3
import os
from boto3.dynamodb.conditions import Key, Attr
from botocore.exceptions import ClientError

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table(os.environ['DB_TABLE_NAME'])
    
def getUsers(event, context):
    group_id = event["group_id"]
    print('group_id: ' + group_id)

    try:
        items = table.scan(
            FilterExpression=Attr('group_id').eq(group_id)
            )
        
        print('Items: ')
        print(items)
        # return users
    except ClientError as e:
        print(e.response['Error']['Message'])
    else:
        print("GetItem 成功!:")
        print(items)
        return items['Items']
    
def lambda_handler(event, context):
    return getUsers(event, context)

無事にデータを取得することができました。