Как исправить ошибку: введите элемент в DynamodB с лямбда python - PullRequest
1 голос
/ 19 апреля 2020

У меня есть некоторые проблемы с использованием лямбды и динамодаба.

это мой python код:

import json
import boto3

def lambda_handler(event, context):
    client = boto3.client('dynamodb', region_name='ap-northeast-2')
    dynamodb = boto3.resource('dynamodb', region_name='ap-northeast-2')

    response = client.put_item(
        TableName='tablename',
        Item = {
            'key1': 'value1',
            'key2': 'value2',
            'key3': 'value3',
            'key4': 'value4'
                }
        )

и это журнал ошибок:

{
  "errorMessage": "Parameter validation failed:\nInvalid type for parameter Item.key1, value: value1, type: <class 'int'>, valid types: <class 'dict'>\nInvalid type for parameter Item.key2, value: value2, type: <class 'str'>, valid types: <class 'dict'>\nInvalid type for parameter Item.key3, value: value3, type: <class 'str'>, valid types: <class 'dict'>\nInvalid type for parameter Item.key4, value: value4, type: <class 'int'>, valid types: <class 'dict'>",
  "errorType": "ParamValidationError",
  "stackTrace": [
    "  File \"/var/task/lambda_function.py\", line 8, in lambda_handler\n    response = client.put_item(\n",
    "  File \"/var/runtime/botocore/client.py\", line 316, in _api_call\n    return self._make_api_call(operation_name, kwargs)\n",
    "  File \"/var/runtime/botocore/client.py\", line 598, in _make_api_call\n    request_dict = self._convert_to_request_dict(\n",
    "  File \"/var/runtime/botocore/client.py\", line 646, in _convert_to_request_dict\n    request_dict = self._serializer.serialize_to_request(\n",
    "  File \"/var/runtime/botocore/validate.py\", line 297, in serialize_to_request\n    raise ParamValidationError(report=report.generate_report())\n"
  ]
}

Я искал ошибку проверки параметров, и aws сказал, что мне нужно загрузить или обновить pip3 и AWS CLI, поэтому я и сделал. но это все равно делает ошибку.

Ответы [ 2 ]

3 голосов
/ 19 апреля 2020

В boto3 SDK есть два метода put_item(), один из которых на уровне клиента , а другой - на уровне ресурсов . Они отличаются, в частности, отличается способ предоставления атрибутов элемента. Вы используете API уровня клиента, но передаете атрибуты, как если бы вы использовали API уровня ресурса.

Вот как вы используете API уровня ресурса:

import boto3

def lambda_handler(event, context):
    dynamodb = boto3.resource('dynamodb', region_name='ap-northeast-2')
    table = dynamodb.table('tablename')

    response = table.put_item(
        Item = {
            'key1': 'value1',
            'key2': 'value2',
            'key3': 'value3',
            'key4': 'value4'
        }
    )
1 голос
/ 19 апреля 2020

Ваш синтаксис не соответствует действительности. См. Пример из https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#DynamoDB .Client.put_item

response = client.put_item(
    Item={
        'AlbumTitle': {
            'S': 'Somewhat Famous',
        },
        'Artist': {
            'S': 'No One You Know',
        },
        'SongTitle': {
            'S': 'Call Me Today',
        },
    },
    ReturnConsumedCapacity='TOTAL',
    TableName='Music',
)

Значения не являются строками, а являются экземплярами AttributeValue типа

...