从json创建一个DynamoDB表
从上述内容中可以得出以下结论:
问题的原因:用户想要从一个已存在的DynamoDB表中创建一个新的表,但是他不知道如何将现有表的结构以JSON格式导出。
解决方法:使用aws dynamo的describe-table命令来获取现有表的结构,然后将输出的JSON文件作为输入,通过aws dynamodb create-table命令来创建新的表。下面是具体的步骤:
1. 执行以下命令获取现有表的结构:
aws dynamo describe-table --table-name existing_table_name
2. 命令的输出结果是一个JSON对象,其中包含了现有表的结构。找到输出结果中的Table属性,它的值就是需要的JSON格式。
3. 将输出结果保存到一个JSON文件中,比如tabledefinition.json。
4. 执行以下命令来创建新的表:
aws dynamodb create-table --cli-input-json file://tabledefinition.json
这种方法可以用于许多aws命令,通过获取现有资源的结构,然后将其作为输入来创建新的资源。
问题的原因:
用户想要通过Python脚本从JSON文件创建一个DynamoDB表。脚本遍历CloudFormation模板中的资源,找到类型为AWS::DynamoDB::Table的资源,并使用AWS CLI命令创建表。然而,在创建表之后,用户需要等待一段时间以确保表的创建完成。这是因为在创建具有辅助索引的表时,只能有一个表处于"CREATING"状态。
解决方法:
用户可以使用如下Python脚本来创建DynamoDB表:
#!/usr/bin/env python import subprocess import time import yaml from cfn_tools import load_yaml, dump_yaml template_file = open('./template.yaml') template = load_yaml(template_file.read()) for resource_key in template["Resources"]: resource = template["Resources"][resource_key] if resource["Type"] != 'AWS::DynamoDB::Table': continue table_name = resource["Properties"]["TableName"] print(f'Creating table "{table_name}"') table_definition = template["Resources"][resource_key]["Properties"] time_to_live_definition = table_definition.get("TimeToLiveSpecification") if time_to_live_definition: # TimeToLiveSpecification is not accepted by create-table, it is a separate command del(table_definition["TimeToLiveSpecification"]) subprocess.run(["aws", "dynamodb", "create-table", "--cli-input-yaml",dump_yaml(table_definition)]) if time_to_live_definition: time_to_live_definition = { "TableName": table_name, "TimeToLiveSpecification": time_to_live_definition } subprocess.run(["aws", "dynamodb", "update-time-to-live", "--cli-input-yaml", dump_yaml(time_to_live_definition)]) # Tables are created asynch, give some time to complete time.sleep(1)
脚本中的`time.sleep(1)`语句是为了等待表的创建完成。这是因为在创建具有辅助索引的表时,只能有一个处于"CREATING"状态的表。
以上就是问题原因和解决方法。通过使用Python脚本,用户可以方便地从JSON文件创建DynamoDB表,并且通过等待表的创建完成,确保不会出现同时创建多个具有辅助索引的表的问题。