在dynamodb中创建表以将来自s3存储桶的数据并加载到具有4列以上的表中时遇到错误。
cloudwatchlogs中的错误:“模块初始化错误:调用CreateTable操作时发生错误(ResourceInUseException):表已存在:” 示例代码:
import boto3
s3 = boto3.client('s3')
dynamodb = boto3.resource('dynamodb')
def txt_reader(event,context):
bucket_path = event['Records'][0]['s3']['bucket']['name']
key_path = event['Records'][0]['s3']['object']['key']
obj = s3.get_object(Bucket = bucket_path,Key = key_path)
body_rows = obj['Body'].read().decode('utf-8').split('\n')
# Create the DynamoDB table.
table_name = dynamodb.create_table(
TableName='TFM',
KeySchema=[
{
'AttributeName': 'CN',
'KeyType': 'HASH'
},
{
'AttributeName': 'SN',
'KeyType': 'RANGE'
}
],
AttributeDefinitions=[
{
'AttributeName': 'CN',
'AttributeType': 'S'
},
{
'AttributeName': 'SN',
'AttributeType': 'S'
},
{
'AttributeName': 'WF',
'AttributeType': 'S'
},
],
#defining local secondary index on column WF
LocalSecondaryIndexes=[
{
'IndexName': 'WF',
'KeySchema': [
{
'KeyType': 'HASH',
'AttributeName': 'CN'
},
{
'KeyType': 'RANGE',
'AttributeName': 'WF'
}
],
'Projection': {
'ProjectionType': 'ALL',
}
}
],
ProvisionedThroughput={
'ReadCapacityUnits': 5,
'WriteCapacityUnits': 5
}
)
table=dynamodb.Table(table_name)
#using a method batch_writer as batch below
with table.batch_writer() as batch:
for row in body_rows:
batch.put_item(Item = {
'CN':row.split('|')[0],
'SN':row.split('|')[1],
'WF':row.split('|')[2],
'sf':row.split('|')[3],
'Con':row.split('|')[4],
'LCI':row.split('|')[5]
})
我的查询:请通过随机输入'|'来帮助我分隔txt文件中给定列的值,然后在lambda中运行代码。
注意:要使用的服务是Dynamodb作为资源,S3是客户端。在这种情况下,我遇到了错误,但是我可以看到,每次我保存代码并在s3中上载txt文件时,也会同时创建表,然后出现上述给定的错误。我删除表,保存lambda代码,然后在S3中上传文件,然后再次遇到相同的错误。在此,S3充当触发器。我还创建了一个S3-lambda-cloudwatchlogs-dynamodb角色。
上面已经给出
答案 0 :(得分:0)
通常,在大多数情况下,表创建是一次操作。您应该在另一个脚本中创建表,使其运行一次,然后在lambda上运行代码的另一部分。
无论如何,您每次都必须创建和销毁表,然后在put_item操作之前检查表的状态。因为一旦执行表创建API,就不会立即创建。它是创建表的请求,创建表需要一段时间。这是描述table_status的文档,据此可以决定何时运行put_item操作