使用Boto3将CloudTrail日志导入DynamoDB时遇资源未找到错误求助
解决DynamoDB PutItem时的ResourceNotFoundException问题
嘿,我来帮你搞定这个问题!你遇到的ResourceNotFoundException其实是个很常见的新手坑——DynamoDB创建表不是即时可用的,它需要花一点时间完成初始化(比如分配存储、配置吞吐量等),你刚调用完create_table就立刻执行put_item,这时候表还处于创建中的状态,自然会提示找不到资源。
另外我也帮你把代码调整成符合你需求的样子:存储桶名设为goodbucket3,加上CloudTrail名称GoodTrail的字段。
修正后的完整代码
import boto3 # 初始化DynamoDB资源 dynamodb = boto3.resource('dynamodb') # 创建表 table = dynamodb.create_table( TableName='GoodTable', AttributeDefinitions=[ { "AttributeName": "S3BucketName", "AttributeType": "S" } ], KeySchema=[ { "AttributeName": "S3BucketName", "KeyType": "HASH" } ], ProvisionedThroughput={ "ReadCapacityUnits": 1, "WriteCapacityUnits": 1 } ) # 关键步骤:等待表创建完成,直到状态变为ACTIVE table.wait_until_exists() print("表GoodTable已创建完成并可用") # 获取表对象(其实上面的table变量已经可用,这一步可省略,保留也没问题) table = dynamodb.Table('GoodTable') # 注意:这里要确保path变量已定义,替换成你实际的路径值 path = "/cloudtrail/logs/path" # 插入符合你需求的Item response = table.put_item( Item= { 'S3BucketName': 'goodbucket3', # 你要存储的目标桶名 'CloudTrailName': 'GoodTrail', # 添加CloudTrail名称字段 'content': f'{path}' } ) print("数据插入成功,响应信息:", response)
关键说明
- 等待表就绪:
table.wait_until_exists()是核心修复点,它会阻塞程序直到表状态变为ACTIVE,这时候再执行put_item就不会报错了。 - 变量定义:你原来的代码里
path变量没有定义,运行时会触发NameError,我给它加了示例赋值,记得替换成你的实际路径。 - 匹配需求的Item:按照你的要求把
S3BucketName设为goodbucket3,并新增CloudTrailName字段存储你的CloudTrail名称GoodTrail。
额外提醒
如果你的脚本可能重复运行(比如再次执行时表已经存在),create_table会抛出ResourceInUseException,可以用try-except块处理这个情况:
try: table = dynamodb.create_table(...) table.wait_until_exists() except dynamodb.meta.client.exceptions.ResourceInUseException: table = dynamodb.Table('GoodTable') print("表GoodTable已存在,直接使用")
内容的提问来源于stack exchange,提问作者user14226172
相关产品推荐
相关产品推荐

