キースキーマの属性の数は、属性定義で定義された属性の数と一致する必要があります


106

DynamoDB JavaScriptシェルを使用して簡単なテーブルを作成しようとしていますが、次の例外が発生します。


    {   
    "message": "The number of attributes in key schema must match the number of attributes defined in attribute definitions.",
    "code": "ValidationException",
    "time": "2015-06-16T10:24:23.319Z",
    "statusCode": 400,
    "retryable": false 
    }

以下は私が作成しようとしているテーブルです:


    var params = {
        TableName: 'table_name',
        KeySchema: [ 
            { 
                AttributeName: 'hash_key_attribute_name',
                KeyType: 'HASH',
            },

        ],
        AttributeDefinitions: [ 
            {
                AttributeName: 'hash_key_attribute_name',
                AttributeType: 'S', 
            },
            {
                AttributeName: 'attribute_name_1',
                AttributeType: 'S', 
            }
        ],
        ProvisionedThroughput: { 
            ReadCapacityUnits: 1, 
            WriteCapacityUnits: 1, 
        },


    };
    dynamodb.createTable(params, function(err, data) {
        if (err) print(err); 
        else print(data); 
    });

ただし、keySchemaに2番目の属性を追加すると、正常に機能します。作業テーブルの下:


    var params = {
        TableName: 'table_name',
        KeySchema: [ 
            { 
                AttributeName: 'hash_key_attribute_name',
                KeyType: 'HASH',
            },
            { 
                AttributeName: 'attribute_name_1', 
                KeyType: 'RANGE', 
            }

        ],
        AttributeDefinitions: [ 
            {
                AttributeName: 'hash_key_attribute_name',
                AttributeType: 'S', 
            },
            {
                AttributeName: 'attribute_name_1',
                AttributeType: 'S', 
            }
        ],
        ProvisionedThroughput: { 
            ReadCapacityUnits: 1, 
            WriteCapacityUnits: 1, 
        },


    };
    dynamodb.createTable(params, function(err, data) {
        if (err) print(err); 
        else print(data); 
    });

キースキーマに範囲を追加したくありません。それを修正する方法はありますか?


これはDynamoDBLocalに対してのみ発生しますか?実際のサービスに対して同じことをしようとするとどうなりますか?
mkobit

まだAWSアカウントを持っていないので、実際のサービスに対してテストできませんでした。DynamoDBローカルの最新バージョン(dynamodb_local_2015-04-27_1.0)を使用しています。
NAbbas 2015年

1
私はdynamodb_local_2016-04-19で同じ動作を経験しています
Chris

2
MingliangのTL; DRがすべてを語っています。
クリス

回答:


226

DynamoDBはスキーマレスです(キースキーマを除く)

つまり、テーブルを作成するときにキースキーマ(属性名とタイプ)を指定する必要があります。まあ、非キー属性を指定する必要はありません。後で任意の属性を持つアイテムを配置できます(もちろんキーを含める必要があります)。

ドキュメントページAttributeDefinitions次のように定義されます

テーブルとインデックスのキースキーマを記述する属性の配列。

テーブルを作成するとき、AttributeDefinitionsフィールドはハッシュおよび/または範囲キーにのみ使用されます。最初のケースでは、2つのAttributeDefinitionsを提供する一方で、ハッシュキーのみ(番号1)があります。これが例外の根本的な原因です。

TL; DR では、非キー属性定義を含めないでくださいAttributeDefinitions


10
1つの例外を除いて、非キー属性はAttributeDefinitions、そのキーがインデックスとして使用されるhash場合、またはrangeキーがインデックスで使用される場合に含まれる必要があります
Srle

22

atで非キー属性を"AttributeDefinitions"使用する場合、それをインデックスとして使用する必要があります。それ以外の場合は、DynamoDBの動作方法に反します。リンクを参照し てください

したがって"AttributeDefinitions"、インデックスまたは主キーとして使用しない場合は、非キー属性を配置する必要はありません。

var params = {
        TableName: 'table_name',
        KeySchema: [ // The type of of schema.  Must start with a HASH type, with an optional second RANGE.
            { // Required HASH type attribute
                AttributeName: 'UserId',
                KeyType: 'HASH',
            },
            { // Optional RANGE key type for HASH + RANGE tables
                AttributeName: 'RemindTime', 
                KeyType: 'RANGE', 
            }
        ],
        AttributeDefinitions: [ // The names and types of all primary and index key attributes only
            {
                AttributeName: 'UserId',
                AttributeType: 'S', // (S | N | B) for string, number, binary
            },
            {
                AttributeName: 'RemindTime',
                AttributeType: 'S', // (S | N | B) for string, number, binary
            },
            {
                AttributeName: 'AlarmId',
                AttributeType: 'S', // (S | N | B) for string, number, binary
            },
            // ... more attributes ...
        ],
        ProvisionedThroughput: { // required provisioned throughput for the table
            ReadCapacityUnits: 1, 
            WriteCapacityUnits: 1, 
        },
        LocalSecondaryIndexes: [ // optional (list of LocalSecondaryIndex)
            { 
                IndexName: 'index_UserId_AlarmId',
                KeySchema: [ 
                    { // Required HASH type attribute - must match the table's HASH key attribute name
                        AttributeName: 'UserId',
                        KeyType: 'HASH',
                    },
                    { // alternate RANGE key attribute for the secondary index
                        AttributeName: 'AlarmId', 
                        KeyType: 'RANGE', 
                    }
                ],
                Projection: { // required
                    ProjectionType: 'ALL', // (ALL | KEYS_ONLY | INCLUDE)
                },
            },
            // ... more local secondary indexes ...
        ],
    };
    dynamodb.createTable(params, function(err, data) {
        if (err) ppJson(err); // an error occurred
        else ppJson(data); // successful response
    });

2

私もこの問題を抱えていたので、他の人の役に立つ場合に備えて、ここで何が悪いのかを投稿します。

CreateTableRequestには、の空の配列がありましたGlobalSecondaryIndexes

CreateTableRequest createTableRequest = new CreateTableRequest
{
  TableName = TableName,
  ProvisionedThroughput = new ProvisionedThroughput { ReadCapacityUnits = 2, WriteCapacityUnits = 2 },
  KeySchema = new List<KeySchemaElement>
  {
     new KeySchemaElement
     {
        AttributeName = "Field1",
        KeyType = KeyType.HASH
     },
     new KeySchemaElement
     {
        AttributeName = "Field2",
        KeyType = KeyType.RANGE
     }
  },
  AttributeDefinitions = new List<AttributeDefinition>()
  {
     new AttributeDefinition
     {
         AttributeName = "Field1", 
         AttributeType = ScalarAttributeType.S
     },
     new AttributeDefinition
     {
        AttributeName = "Field2",
        AttributeType = ScalarAttributeType.S
     }
  },
  //GlobalSecondaryIndexes = new List<GlobalSecondaryIndex>
  //{                            
  //}
};

テーブル作成でこれらの行をコメント化すると、問題が解決しました。したがって、リストはnull空ではなく、でなければなりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.