CloudFormation настаивает на том, что мой JSON для создания DynamoDB недействителен ... но я не понимаю, как

82

Вот (часть DynamoDB) мой JSON, сгенерированный Troposphere:

"sandbox": {
        "Properties": {
            "AttributeDefinitions": [
                {
                    "AttributeName": "audit_id",
                    "AttributeType": "S"
                },
                {
                    "AttributeName": "status",
                    "AttributeType": "S"
                },
                {
                    "AttributeName": "filename",
                    "AttributeType": "S"
                },
                {
                    "AttributeName": "file_detected_dt",
                    "AttributeType": "S"
                },
                {
                    "AttributeName": "time_taken",
                    "AttributeType": "N"
                },
                {
                    "AttributeName": "number_rows_processed_file",
                    "AttributeType": "N"
                },
                {
                    "AttributeName": "number_rows_created_db",
                    "AttributeType": "N"
                },
                {
                    "AttributeName": "info_messages",
                    "AttributeType": "S"
                }
            ],
            "KeySchema": [
                {
                    "AttributeName": "audit_id",
                    "KeyType": "HASH"
                }
            ],
            "ProvisionedThroughput": {
                "ReadCapacityUnits": {
                    "Ref": "ReadCapacityUnits"
                },
                "WriteCapacityUnits": {
                    "Ref": "WriteCapacityUnits"
                }
            }
        },
        "Type": "AWS::DynamoDB::Table"
    }

CloudFormation выдает мне эту ошибку при попытке развернуть VPC: Property AttributeDefinitions is inconsistent with the KeySchema of the table and the secondary indexes .

Но ... не так ли? Я уточняюaudit_id как одинокий ключ, и он определенно существует в списке AttributeDefinitions. Я новичок в CF (и в «Динамо», если на то пошло), поэтому я вполне могу упустить что-то чрезвычайно очевидное, но в данный момент для меня это не очевидно.

Я погуглил и действительно нашел только одно упоминание об этой ошибке, и это было больше связано с прослойкой между разработчиком и CF, а не с самим CF.

Кто-нибудь может указать, что не так с моим шаблоном?

user1381745
источник
Правило CloudFormation Linter, которое поможет быстрее уловить это, с дополнительной информацией: github.com/aws-cloudformation/cfn-python-lint/pull/1284
Pat Myron

Ответы:

178

Это произошло из-за моего недопонимания по поводу DynamoDB. Здесь следует определить только те атрибуты, которые будут использоваться в качестве ключей. Таким образом, изменение массива AttributeDefinitions на следующий решило проблему:

"AttributeDefinitions": [
            {
                "AttributeName": "audit_id",
                "AttributeType": "S"
            }
]
user1381745
источник
3
Это также запечатлено здесь
Бенни Бауэр
10
Ошибка здесь заключалась в попытке определить схему таблицы (т.е. «столбцы» таблицы в реляционной БД). В DynamoDb вы определяете только ключ, с помощью которого можно получить значения элемента в таблице, а не схему самого элемента. DynamoDb не имеет схемы, и значения, хранящиеся для каждого ключа, определяются при добавлении элемента. Нет формы данных для определения.
Zodman
@Zodman Большое спасибо за ваш комментарий, особенно в этой части: «DynamoDb не имеет схемы, и значения, хранящиеся для каждого ключа, определяются при добавлении элемента. Нет формы данных для определения»
Хамед Минаи
3
Ой, я целую вечность застрял на одной и той же проблеме. Благодарю.
blueprintchris
3
Не каждый герой носит плащи ... Спасибо за улов!
Марчелло Греки Линс