当前位置: 首页 > 知识库问答 >
问题:

如何使用boto3将现有的AWS DynamoDB局部表转换为全局表

张晔
2023-03-14

我在两个不同的区域有两个DynamoDB表,名称相同,都支持流,都显示了全局表版本2019.11.21,一个有数据,一个为空。如果我举个例子,它们可以如下所示:

  • 地区:美国东部1号
  • 表格名称:MyTable
  • 全球表格版本:2019.11.21
  • 表中有项目:是
  • 地区: us-East-2
  • 表名:MyTable
  • 全局表版本:2019.11.21
  • 表有项:否

我使用了boto3DynamoDBclient.create_global_table()client.update_global_table()没有任何成功。

#1.尝试创建全局表

import boto3
client = boto3.client('dynamodb')
response = client.create_global_table(
    GlobalTableName='MyTable',
    ReplicationGroup=[
        {
            'RegionName': 'us-east-1'
        },
    ]
)

输出:

botocore.exceptions.ClientError: An error occurred (ValidationException) when calling the CreateGlobalTable operation: One or more parameter values were invalid: Tables must be empty. These tables contain items: [TableReplica{regionName=us-east-1, tableName=MyTable}]

我知道client.create_global_table()API调用仅适用于DynamoDB Table版本2017.11.29,该版本要求表为空。所以,这对我没用。裁判:这里

#2.尝试更新全局表

import boto3
client = boto3.client('dynamodb')
update_response = client.update_global_table(
    GlobalTableName='MyTable',
    ReplicaUpdates=[
        {
            'Create': {
                'RegionName': 'us-east-1'
            }
        }
    ]
)

输出:

botocore.errorfactory.GlobalTableNotFoundException: An error occurred (GlobalTableNotFoundException) when calling the UpdateGlobalTable operation: Global table not found: Global table with name: 'Mytable' does not exist.

添加第二个地区us-east-2也没有帮助。

boto3文档版本1.17.66未指定此操作适用于的DynamoDB表格版本的任何特定内容。因此,我认为这应该适用于2019.11.21版,但首先必须准备好全局表。参考:这里

根据这篇博客文章,现有的带有项的单个区域本地表可以转换为全局表。博客文章中使用的示例是使用AWS CLI,但提到也可以使用AWS SDK。

那么,我怎样才能用boto3做到这一点呢?

共有1个答案

昝晗昱
2023-03-14

基于评论。

要将现有的本地dynamodb表更新为全局表,需要执行两个步骤,这两个步骤都可以使用update_table完成:

  1. 必须使用update_table将现有表设置为PAY_PER_REQUEST模式或AutoScale
  2. 一旦表处于这些模式之一,可以再次使用update_table将表设置为全局模式,如AWS博客中所述。
 类似资料:
  • 问题内容: 我正在使用函数,这样我的程序就不会一团糟,但我不知道如何将局部变量变成全局变量。 问题答案: 这是两种实现相同目的的方法: 使用参数并返回(推荐) 运行时,将获得以下输出 使用全局变量(永远不要这样做) 现在您将获得:

  • 我创建了一个Lambda函数,它从DynamoDB检索一些数据,并输出一些JSON。我要做的是在中运行这个函数lambda@edge并生成一个我可以使用Cloudfront缓存的响应。 我面临的问题是,使用全局表和lambda@edge显然,这在许多地区都存在。 这使我无法从lambda环境中使用AWS_REGION。例如,如果一个请求在us-west-1中运行,环境变量将反映这一点,并且它将尝试

  • DynamoDB表已经创建并在生产中运行。根据当前用例,计划添加新的辅助全局索引。这可以通过AWS实现SDK,是否可以使用CloudForm脚本更新DynamoDB表。 任何帮助都将不胜感激。

  • 问题内容: 此代码为何起作用: 但这给出了“分配前引用的局部变量’var’”错误: 问题答案: 因为在第一个代码中,您已经创建了一个局部变量并使用了它的值,而在第二个代码中,您正在使用局部变量,而没有对其进行定义。 因此,如果要使第二个功能正常工作,则需要声明:- 在使用该功能之前。 而在此代码中: 更新 :- 但是,按照@Tim的注释,您不应在函数内部使用变量。最好在使用变量之前先定义变量,然后