gpt4 book ai didi

python - "Truncating"通过 CloudFormation (SAM) 创建的 DynamoDB 表

转载 作者:行者123 更新时间:2023-12-03 07:19:12 25 4
gpt4 key购买 nike

我想在 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 删除操作的一部分进行销毁。

最佳答案

无论您是否将表创建为 AWS::Serverless::SimpleTableAWS::DynamoDB::Table没有开箱即用的解决方案可以使用 CloudFormation 清空它,同时保留其名称。

作为一般最佳实践,您不应命名 CloudFormation 创建的 DynamoDB 表,而应让 CloudFormation 为资源分配名称。如果您的设置就是这种情况,您可以简单地对资源进行更改,这需要“替换”资源,例如临时添加本地二级索引,这将重新创建资源并根据该资源使用资源。

也就是说,在您的情况下,最好的方法可能是将您的蛮力方法包装在 CloudFormation custom resource 中。并将其包含在您的 CloudFormation 堆栈中。这样,您可以截断表一次,或者根据自定义资源的实现,随时截断表。

请记住,从 DynamoDB 表中删除所有项目可能需要很长时间,因此使用 Lambda 支持的自定义资源可能会遇到 Lambda 函数运行时的限制,具体取决于表中的项目数量。如果表包含大量项目,成本也可能会变得相当高。

关于python - "Truncating"通过 CloudFormation (SAM) 创建的 DynamoDB 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56616596/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com