«Усечение» таблицы DynamoDB, созданной с помощью CloudFormation (SAM) - PullRequest
0 голосов
/ 16 июня 2019

Я бы хотел "усечь" (удалить все элементы) в таблице DynamoDB. Я знаю, что наиболее эффективный способ сделать это - удалить таблицу и заново создать ее (имя, индексы и т. Д.). Однако эта таблица является частью развертывания SAM-CloudFormation. На таблицу (по имени) также ссылаются в других частях приложения.

Если бы я удалил и заново создал его, я мог бы использовать то же имя, что и раньше; однако, я думаю, что это вызовет проблемы, потому что (1) удаление не является немедленным и (2) изменится ARN, что может иметь последствия для стека CloudFormation.

Похоже, что должно быть лучшее решение, чем метод грубой силы: перебирать все элементы, удаляя их по одному (с некоторой оптимизацией через batch_writer).

Я рассмотрел некоторые другие решения здесь, но они не затрагивают часть моего стека CloudFormation.

Я даже сам предоставил грубое решение другого вопроса по этой теме.

Вот подход грубой силы

import boto3

table = boto3.resource('dynamodb').Table('my-table-name')
scan = None

with table.batch_writer() as batch:
    count = 0
    while scan is None or 'LastEvaluatedKey' in scan:
        if scan is not None and 'LastEvaluatedKey' in scan:
            scan = table.scan(
                ProjectionExpression='id',
                ExclusiveStartKey=scan['LastEvaluatedKey'],
            )
        else:
            scan = table.scan(ProjectionExpression='id')

        for item in scan['Items']:
            if count % 5000 == 0:
                print(count)
            batch.delete_item(Key={'id': item['id']})
            count = count + 1

Желаемым конечным состоянием является таблица DynamoDB (которая ранее была полна элементов) с тем же именем, без элементов и все еще может быть уничтожена в ходе операции удаления CloudFormation.

1 Ответ

2 голосов
/ 16 июня 2019

Независимо от того, создали ли вы таблицу как AWS :: Serverless :: SimpleTable или AWS :: DynamoDB :: Table , не существует готового решения для очистите его с помощью CloudFormation, сохранив его имя.

Как правило, не следует называть таблицы DynamoDB, созданные CloudFormation, но позволяйте CloudFormation назначать имя для ресурса. Если бы это было так в вашей настройке, вы могли бы просто внести изменения в ресурс, который требует «замены» ресурса, например временное добавление локального вторичного индекса, который воссоздает ресурс и будет работать с ресурсами в зависимости от него.

Тем не менее, в вашей ситуации лучший подход, вероятно, состоит в том, чтобы обернуть свой метод грубой силы в пользовательский ресурс CloudFormation и включить его в свой стек CloudFormation. При этом вы можете обрезать таблицу один раз или, в зависимости от реализации вашего пользовательского ресурса, в любое время.

Имейте в виду, что удаление всех элементов из таблицы DynamoDB может занять довольно много времени, поэтому использование настраиваемого ресурса с лямбда-поддержкой может привести к ограничению времени выполнения функции Lambda в зависимости от количества элементов в таблице. Это может также стать довольно дорогостоящим, если в таблице много предметов.

...