74 votes

PropertyDefinition inconsistante

J'ai le modèle suivant que j'utilise dans l'interface utilisateur de Cloudformation pour créer une table dynamoDB. Je veux créer une table avec Clé primaire comme ID et SortKey comme Valeur

{
  "AWSTemplateFormatVersion" : "2010-09-09",

  "Description" : "DB Description",

  "Resources" : {
    "TableName" : {
      "Type" : "AWS::DynamoDB::Table",
      "Properties" : {
        "AttributeDefinitions": [ { 
          "AttributeName" : "ID",
          "AttributeType" : "S"
        }, { 
          "AttributeName" : "Value",
          "AttributeType" : "S"
        } ],
        "KeySchema": [
          { 
            "AttributeName": "ID", 
            "KeyType": "HASH"
          }
        ]                
      },
      "TableName": "TableName"
    }
  }
}

Dans l'interface utilisateur de la CF, je clique sur nouvelle pile, je pointe sur le bouton template depuis mon ordinateur local, donnez un nom à la pile et cliquez sur suivant. Après un certain temps, j'obtiens une erreur qui dit La propriété AttributeDefinitions est incohérente avec le KeySchema de la table et les index secondaires.

0 votes

Règle Linter de CloudFormation pour aider à attraper cela plus rapidement avec plus d'informations : github.com/aws-cloudformation/cfn-python-lint/pull/1284

126voto

smartypants Points 51

Le problème est que le Resources.Properties.AttributeDefinitions La clé doit uniquement définissent les colonnes utilisées pour les index ou les clés. En d'autres termes, les clés dans Resources.Properties.AttributeDefinitions doivent correspondre aux mêmes clés que celles définies dans Resources.Properties.KeySchema .

Documents AWS :

AttributeDefinitions : Une liste d'objets AttributeName et AttributeType qui décrivent le schéma de clés pour la table et les index.

donc le modèle résultant ressemblerait à ceci :

{
  "AWSTemplateFormatVersion" : "2010-09-09",

  "Description" : "DB Description",

  "Resources" : {
    "TableName" : {
    "Type" : "AWS::DynamoDB::Table",
    "Properties" : {
      "AttributeDefinitions": [ { 
        "AttributeName" : "ID",
        "AttributeType" : "S"
      } ],
      "ProvisionedThroughput":{
        "ReadCapacityUnits" : 1,
        "WriteCapacityUnits" : 1
      },
      "KeySchema": [
        { 
          "AttributeName": "ID", 
          "KeyType": "HASH"
        }
       ] ,               
      "TableName": "table5"
    }
   }
  }
}

3 votes

Si nous supprimons l'attribut 'value' des AttributeDefinitions, comment pouvons-nous ajouter la colonne 'Value' à la table ?

28 votes

stackoverflow.com/questions/25606135/ Après une recherche, il n'est pas nécessaire de définir toutes vos colonnes lorsque vous créez la table, seulement les index, puis vous pouvez ajouter des attributs "à la volée" lors de l'insertion d'une nouvelle ligne.

0 votes

stackoverflow.com/questions/47385177/ une autre réponse qui explique que

1voto

Jason Wadsworth Points 5263

La réponse acceptée est correcte en ce qui concerne la cause de l'erreur, mais vous avez dit que vous vouliez que la clé de tri soit Value . Vous devez donc modifier votre CloudFormation pour l'inclure :

{
  "AWSTemplateFormatVersion" : "2010-09-09",

  "Description" : "DB Description",

  "Resources" : {
    "TableName" : {
      "Type" : "AWS::DynamoDB::Table",
      "Properties" : {
        "AttributeDefinitions": [ { 
          "AttributeName" : "ID",
          "AttributeType" : "S"
        }, { 
          "AttributeName" : "Value",
          "AttributeType" : "S"
        } ],
        "KeySchema": [
          { 
            "AttributeName": "ID", 
            "KeyType": "HASH"
          },
          { 
            "AttributeName": "Value", 
            "KeyType": "RANGE"
          }
        ]                
      },
      "TableName": "TableName"
    }
  }
}

0voto

Tanaji Sutar Points 31

Dans AttributeDefinitions, vous devez définir uniquement les clés de partition et de plage, et non les autres attributs.

le nombre d'attributs dans AttributeDefinitions et KeySchema doit correspondre et être exactement le même.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X