CloudFormation insiste en que mi JSON de creación de DynamoDB no es válido ... pero no veo cómo

82

Aquí está (la parte DynamoDB de) mi JSON generado por la troposfera:

"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 me da este error al intentar girar la VPC: Property AttributeDefinitions is inconsistent with the KeySchema of the table and the secondary indexes.

¿Pero es? Lo estoy especificando audit_idcomo una clave solitaria, y definitivamente existe dentro de la lista AttributeDefinitions. Soy muy nuevo en CF (y Dynamo, para el caso), así que puede que me esté perdiendo algo extremadamente obvio, pero no es evidente para mí en este momento.

Busqué en Google y solo encontré una mención de este error, y tenía más que ver con una capa entre el desarrollador y CF, en lugar de CF en sí.

¿Alguien puede señalar qué está mal con mi plantilla?

usuario1381745
fuente
Regla de CloudFormation Linter para ayudar a captar esto más rápido con más información: github.com/aws-cloudformation/cfn-python-lint/pull/1284
Pat Myron

Respuestas:

178

Esto se debió a un malentendido de mi parte con respecto a DynamoDB. Los únicos atributos que deben definirse aquí son los que se utilizarán como claves. Por lo tanto, cambiar la matriz AttributeDefinitions a la siguiente resolvió el problema:

"AttributeDefinitions": [
            {
                "AttributeName": "audit_id",
                "AttributeType": "S"
            }
]
usuario1381745
fuente
3
Esto también se captura aquí
Benny Bauer
10
El error aquí fue intentar definir el esquema de la tabla (es decir, las 'columnas' de la tabla en DB relacional hablan). En DynamoDb, solo define la clave con la que recuperar los valores del elemento en la tabla, no el esquema del elemento en sí. DynamoDb no tiene esquema y los valores almacenados en cada clave se definen cuando se agrega el elemento. No hay forma de datos para definir.
Zodman
@Zodman Muchas gracias por su comentario, especialmente esta parte: "DynamoDb no tiene esquema, y ​​los valores almacenados en cada clave se definen cuando se agrega el elemento. No hay forma de datos para definir"
Hamed Minaee
3
Oh, hombre, estuve atrapado en este mismo problema durante años. Gracias.
blueprintchris
3
No todos los héroes usan capas ... ¡Gracias por la captura!
Marcello Grechi Lins