[dynamodb] No validation on attributes
See original GitHub issueWe ran into this issue in production. Moto fails to validate that an attribute must be of a proper type when using put_object
:
import boto3
from moto import mock_dynamodb
@mock_dynamodb
def test_whatever():
session = boto3.Session()
dynamodb = session.resource("dynamodb")
hello_index = {
"IndexName": "hello-index",
"KeySchema": [{"AttributeName": "hello", "KeyType": "HASH"}],
"Projection": {"ProjectionType": "ALL"},
}
table_name = "lilja-test"
# Let's create a table with [id: str, hello: str], with an index to hello
dynamodb.create_table(
TableName=table_name,
KeySchema=[
{"AttributeName": "id", "KeyType": "HASH"},
],
AttributeDefinitions=[
{"AttributeName": "id", "AttributeType": "S"},
{"AttributeName": "hello", "AttributeType": "S"},
],
GlobalSecondaryIndexes=[hello_index],
BillingMode="PAY_PER_REQUEST",
)
table = dynamodb.Table(table_name)
resp = table.put_item(
TableName=table_name,
Item={
'id': 'woop',
'hello': None,
},
)
print(resp)
Running this is fine. But if I click and manually add these resources in AWS console and run a script:
import boto3
resource = boto3.resource("dynamodb")
table = resource.Table("lilja-test")
resp = table.put_item(
TableName="lilja-test",
Item={
'id': 'woop',
'hello': None,
},
)
print(resp)
Traceback (most recent call last):
File "/Users/lilja/code/temp/script.py", line 7, in <module>
resp = table.put_item(
File "/Users/lilja/Library/Caches/pypoetry/virtualenvs/temp-SZio7nyt-py3.9/lib/python3.9/site-packages/boto3/resources/factory.py", line 580, in do_action
response = action(self, *args, **kwargs)
File "/Users/lilja/Library/Caches/pypoetry/virtualenvs/temp-SZio7nyt-py3.9/lib/python3.9/site-packages/boto3/resources/action.py", line 88, in __call__
response = getattr(parent.meta.client, operation_name)(*args, **params)
File "/Users/lilja/Library/Caches/pypoetry/virtualenvs/temp-SZio7nyt-py3.9/lib/python3.9/site-packages/botocore/client.py", line 530, in _api_call
return self._make_api_call(operation_name, kwargs)
File "/Users/lilja/Library/Caches/pypoetry/virtualenvs/temp-SZio7nyt-py3.9/lib/python3.9/site-packages/botocore/client.py", line 960, in _make_api_call
raise error_class(parsed_response, operation_name)
botocore.exceptions.ClientError: An error occurred (ValidationException) when calling the PutItem operation: One or more parameter values were invalid: Type mismatch for Index Key hello Expected: S Actual: NULL IndexName: hello-index
# pypoetry.toml
[tool.poetry.dependencies]
python = "^3.9"
boto3 = "^1.26.17"
moto = {extras = ["dynamodb"], version = "^4.0.10"}
pytest = "^7.2.0"
Issue Analytics
- State:
- Created 10 months ago
- Reactions:1
- Comments:7 (2 by maintainers)
Top Results From Across the Web
Set Validation rules for AWS DynamoDB table - Stack Overflow
It only validates that when you add an item it should have attributes for your keys (partition key, sort key, etc.) and they...
Read more >Import format quotas and validation - Amazon DynamoDB
Data validation errors can occur at either the item level or file level. During import, items are validated based on DynamoDB rules before...
Read more >Amazon DynamoDB: What It Is and 10 Things You Should Know
Amazon DynamoDB is a managed NoSQL service with strong consistency and predictability, shielding you from the complexities of manual work.
Read more >put-item — AWS CLI 2.9.6 Command Reference
Since every record must contain that attribute, the attribute_not_exists function will only succeed if no matching item exists.
Read more >Cheat Sheet for Amazon DynamoDB on AWS | Zuar
There is no support for on-premise deployment or hybrid cloud. · DynamoDB is schemaless. · Primary key has at most two attributes which...
Read more >
Top Related Medium Post
No results found
Top Related StackOverflow Question
No results found
Troubleshoot Live Code
Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free
Top Related Reddit Thread
No results found
Top Related Hackernoon Post
No results found
Top Related Tweet
No results found
Top Related Dev.to Post
No results found
Top Related Hashnode Post
No results found
i would like to contribute to this issue
Oh, and tests for these kinds of error-scenarios tend to live in
tests/test_dynamodb/exceptions/test_dynamodb_exceptions.py
@aarushisoni