PropertyDefinition inkonsistent

73

Ich habe folgende Vorlage, die ich in der Cloudformation-Benutzeroberfläche verwende, um eine dynamoDB-Tabelle zu erstellen. Ich möchte eine Tabelle mit PrimaryKey als ID und sortKey als Wert erstellen

{
  "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"
    }
  }
}

Auf der CF-Benutzeroberfläche klicke ich auf einen neuen Stapel, zeige auf die templateDatei von meinem lokalen Computer, gebe dem Stapel einen Namen und klicke auf Weiter. Nach einiger Zeit erhalte ich die Fehlermeldung, dass Property AttributeDefinitions nicht mit dem KeySchema der Tabelle und den Sekundärindizes übereinstimmt

Em Ae
quelle
CloudFormation Linter-Regel, um dies mit weiteren Informationen schneller
Pat Myron

Antworten:

123

Das Problem ist, dass der Resources.Properties.AttributeDefinitionsSchlüssel nur Spalten definieren darf , die für Indizes oder Schlüssel verwendet werden. Mit anderen Worten, die Schlüssel in Resources.Properties.AttributeDefinitionsmüssen mit den gleichen Schlüsseln übereinstimmen, die in definiert sind Resources.Properties.KeySchema.

AWS-Dokumente:

AttributeDefinitions: Eine Liste von AttributeName- und AttributeType-Objekten, die das Schlüsselschema für die Tabelle und die Indizes beschreiben.

Die resultierende Vorlage würde also folgendermaßen aussehen:

{
  "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"
    }
   }
  }
}
jens walter
quelle
3
Wenn wir das Attribut 'value' aus AttributeDefinitions entfernen, wie können wir die Spalte 'Value' zur Tabelle hinzufügen?
Dilantha
28
stackoverflow.com/questions/25606135/… Nach einer Recherche müssen beim Erstellen der Tabelle nicht alle Spalten definiert werden, sondern nur Indizes. Beim Einfügen einer neuen Zeile können Sie Attribute "on the go" hinzufügen
ThomasP1988
stackoverflow.com/questions/47385177/… eine andere Antwort, die das erklärt
ThomasP1988
Die Frage besagte, Valuedass der Sortierschlüssel sein sollte, also sollte er in der enthalten sein KeySchema, nicht aus der entfernt werden AttributeDefinitions.
Jason Wadsworth
1

Die akzeptierte Antwort ist in der Fehlerursache korrekt, aber Sie sagten, Sie wollten den Sortierschlüssel Value. Sie sollten Ihre CloudFormation also so ändern, dass sie Folgendes enthält:

{
  "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"
    }
  }
}
Jason Wadsworth
quelle
0

In AttributeDefinitions müssen Sie nur Partitions- und Bereichsschlüssel definieren, keine anderen Attribute.

Die Anzahl der Attribute in AttributeDefinitions und KeySchema sollte übereinstimmen und genau gleich sein.

Tanaji Sutar
quelle