从json创建一个DynamoDB表

5 浏览
0 Comments

从json创建一个DynamoDB表

请问是否可以直接使用表定义的JSON文件创建一个DynamoDB表?我查看了AWS CLI工具,但没有找到相关方法。只是想知道是否有可能。

aws dynamodb create-table file://tabledenifision.json

谢谢!

0
0 Comments

从上述内容中可以得出以下结论:

问题的原因:用户想要从一个已存在的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命令,通过获取现有资源的结构,然后将其作为输入来创建新的资源。

0
0 Comments

问题的原因:

用户想要通过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表,并且通过等待表的创建完成,确保不会出现同时创建多个具有辅助索引的表的问题。

0