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



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

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


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

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.