2017-09-08 2 views
0

j'obtiens l'erreur suivante lorsque vous appelez mon adresse lambdaDynamoDB exception de validation lambda

ClientError: An error occurred (ValidationException) 
when calling the CreateTable operation: 1 validation error detected: 
Value '[[email protected], 
[email protected], 
[email protected]]' at 
'keySchema' failed to satisfy constraint: Member must have length less than or equal to 2 

Voici le code:

def write_values_to_db(ddid, token, intent): 
    pid = ... 
    dynamodb_client = boto3.client('dynamodb') 
    try: 
     response = dynamodb_client.create_table(
      AttributeDefinitions=[ 
       { 
        'AttributeName': 'pid', 
        'AttributeType': 'S', 
       }, 
       { 
        'AttributeName': 'ddid', 
        'AttributeType': 'S', 
       }, 
       { 
        'AttributeName': 'token', 
        'AttributeType': 'S', 
       }, 
      ], 
      KeySchema=[ 
       { 
        'AttributeName': 'pid', 
        'KeyType': 'HASH', 
       }, 
       { 
        'AttributeName': 'ddid', 
        'KeyType': 'RANGE', 
       }, 
       { 
        'AttributeName': 'token', 
        'KeyType': 'RANGE', 
       }, 
      ], 
      ProvisionedThroughput={ 
       'ReadCapacityUnits': 5, 
       'WriteCapacityUnits': 5, 
      }, 
      TableName='Values', 
     ) 
    except dynamodb_client.exceptions.ResourceInUseException: 
     dynamodb_client.put_item(
      TableName='Values', 
      Item={ 
       'pid': pid, 
       'ddid': ddid, 
       'token': token 
      } 
     ) 

Selon mon tableau de bord de l'erreur est sur la ligne TableName='Values'. Je suivais un tutoriel et seulement changé certaines choses, donc je ne vois pas pourquoi cela ne fonctionne pas. Je ne peux pas tester sur un environnement local car j'ai des problèmes de région/d'identification.

+0

DynamoDB nécessite une clé de hachage et non plus d'une clé de plage dans la clé primaire, ne ce pas? –

Répondre

0

Le KeySchema dans votre code devrait être comme ci-dessous,

AttributeDefinitions=[ 
      { 
       'AttributeName': 'pid', 
       'AttributeType': 'S', 
      } 
     ], 
KeySchema=[ 
       { 
        'AttributeName': 'pid', 
        'KeyType': 'HASH' 
       } 
] 

Vous ne pouvez avoir qu'un seul dièze Key et une tessiture Max.

Si vous souhaitez ajouter des index, vous pouvez les créer avec des index secondaires.

http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LSI.html

ci-dessous la serait syntaxe de Global Index secondaire.

Référence: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html

GlobalSecondaryIndexes: [ 
    { 
     IndexName: 'STRING_VALUE', /* required */ 
     KeySchema: [ /* required */ 
     { 
      AttributeName: 'STRING_VALUE', /* required */ 
      KeyType: HASH | RANGE /* required */ 
     }, 
     /* more items */ 
     ], 
     Projection: { /* required */ 
     NonKeyAttributes: [ 
      'STRING_VALUE', 
      /* more items */ 
     ], 
     ProjectionType: ALL | KEYS_ONLY | INCLUDE 
     }, 
     ProvisionedThroughput: { /* required */ 
     ReadCapacityUnits: 0, /* required */ 
     WriteCapacityUnits: 0 /* required */ 
     } 
    }, 
    /* more items */ 
    ] 
+0

Je ne suis pas sûr si je veux des indices supplémentaires, je veux juste des attributs supplémentaires. Je veux que 'pid' soit la clé primaire et' ddid et consent_token' soient des attributs –

+0

Permettez-moi de modifier la réponse. Vous pouvez avoir uniquement une clé primaire sans clé de plage. – Kannaiyan

+0

Oui, j'ai essayé mais cela provoque une discordance entre le nombre d'attribtues dans KeySchema et le nombre dans AttributeSchema. J'ai été capable de résoudre mon problème en créant la table dans https://console.aws.amazon.com/dynamodb et en utilisant la méthode put_item –