web-dev-qa-db-ja.com

Pythonラムダ関数はKeyErrorを返します

Python 3.6を使用して単純なLambda関数を作成しようとしています。

関数はリクエストクエリ文字列paramsでuserId(DynamoDBの私の主キー)を取得し、DBにアイテムが存在する場合は200を返します。これが私のラムダ関数です

import boto3
import os
from boto3.dynamodb.conditions import Key, Attr

def lambda_handler(event, context):

  userId = event["userId"]

  dynamodb = boto3.resource('dynamodb')
  table = dynamodb.Table(os.environ['Customers'])
  items = table.query(
  KeyConditionExpression=Key('userId').eq(userId)
  )

  return items["Items"]

Lambdaインターフェイスでテストを行っているときは機能し、正しいユーザーを返しますが、Postmanから試行したりAPIゲートウェイを使用したりすると、次のエラーが返されます

{
"errorMessage": "'userId'",
"errorType": "KeyError",
"stackTrace": [
    [
        "/var/task/index.py",
        7,
        "lambda_handler",
        "userId = event["userId"]"
    ]
]
}
  • ここで何が欠けていますか?
  • 「イベント」を理解するのに苦労して、ドキュメントにはそのpython辞書が記載されていますが、PostmanまたはAPI Gatewayから呼び出されたときにその結果を印刷してラムダを実際にデバッグするにはどうすればよいですか?
6
JamZ

event["userId"]を使用しています。これは、たとえばリクエストペイロードを送信することを意味します

GET API : api/users/
Request Body payload:

{
"userId":"1234"
}

上記のコードは機能しますが、userIdをパスパラメータとして送信するとします。

GET API :api/user/{userId}

その後、ラムダ関数でアクセスできます

userId = (event['pathparameters']['userId'])

印刷ステートメントprint(event)を追加し、cloudwatchログのログを確認する

3
Pandit Biradar