You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS CLI可列出所有DynamoDB表,但boto3仅返回2个表,求排查

问题

使用AWS CLI执行aws dynamodb list-tables可正常返回上百个DynamoDB表,但用boto3编写的代码仅返回2个名为LimitMonitor-...的未知表。测试boto3操作S3获取桶的功能正常,初步排除连接或权限问题。

测试代码:

import boto3

AWS_ACCESS_KEY_ID = "xxx"
AWS_SECRET_ACCESS_KEY = "xxx"
AWS_SESSION_TOKEN = "xxx"
AWS_REGION_NAME = 'us-east-1'

session = boto3.Session(
    aws_access_key_id=AWS_ACCESS_KEY_ID,
    aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
    aws_session_token=AWS_SESSION_TOKEN,
    region_name=AWS_REGION_NAME
)
available_services = session.get_available_services()
print("Available services:")
print(available_services)

s3_client = session.client('s3')
print("===== S3 =====")

buckets = [bucket['Name'] for bucket in s3_client.list_buckets()['Buckets']]
print(f"Buckets {len(buckets)}")

dynamodb_client = session.client('dynamodb')
print("===== DynamoDB =====")
table_names = dynamodb_client.list_tables()['TableNames']
print(f"Tables {len(table_names)}")
print(table_names)

输出结果:

Available services:
['accessanalyzer', 'account', ...'dynamodb'...'s3'...]
===== S3 =====
Buckets 150
===== DynamoDB =====
Tables 2
['LimitMonitor-SummaryDDB-1951SZYTWET87', 'LimitMonitor-SummaryDDB-FEBN4S1LC0OF']
解答

以下是几个可能的原因及对应的解决方法:

1. 凭证/身份不一致

代码中硬编码了AWS凭证,但CLI可能使用的是不同的凭证来源(比如环境变量、~/.aws/credentials配置文件或IAM角色),导致boto3会话访问的账号/权限范围和CLI不一致。

验证方法:

  • 在CLI中执行:aws sts get-caller-identity,记录返回的Account和Arn
  • 在boto3代码中添加以下代码,对比身份信息:
sts_client = session.client('sts')
print(sts_client.get_caller_identity())

如果两者身份不同,需调整boto3代码中的凭证,确保和CLI使用的一致。

2. 未处理DynamoDB列表分页

dynamodb_client.list_tables()默认最多返回100个表,若表数量超过100,需要通过LastEvaluatedTableName参数循环获取所有结果。虽然你的情况仅返回2个表,但可以完善代码确认:

修改DynamoDB表获取逻辑:

dynamodb_client = session.client('dynamodb')
print("===== DynamoDB =====")
table_names = []
last_evaluated = None
while True:
    kwargs = {}
    if last_evaluated:
        kwargs['ExclusiveStartTableName'] = last_evaluated
    response = dynamodb_client.list_tables(**kwargs)
    table_names.extend(response['TableNames'])
    last_evaluated = response.get('LastEvaluatedTableName')
    if not last_evaluated:
        break
print(f"Tables {len(table_names)}")
print(table_names)

3. 区域不一致

DynamoDB是区域性服务,不同区域的表相互独立。检查CLI使用的区域是否和代码中指定的us-east-1一致:

  • 在CLI中执行:aws configure get region
    如果CLI使用的是其他区域,需将代码中的AWS_REGION_NAME修改为对应区域,或者在CLI中指定区域执行aws dynamodb list-tables --region us-east-1,看是否返回同样的2个表。

关于LimitMonitor表

这两个表是AWS Config的Limit Monitor功能自动创建的,用于存储服务配额监控数据,属于AWS托管表,并非用户手动创建。


内容的提问来源于stack exchange,提问作者Steph

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 05:22:55