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
相关产品推荐
相关产品推荐

