この記事は公開されてから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)
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)
無事にデータを取得することができました。