调用CreateTable操作时发生错误(ResourceInUseException):表已存在:

时间:2019-04-15 13:22:50

标签: amazon-web-services amazon-s3 amazon-dynamodb python-3.6

在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角色。

上面已经给出

1 个答案:

答案 0 :(得分:0)

通常,在大多数情况下,表创建是一次操作。您应该在另一个脚本中创建表,使其运行一次,然后在lambda上运行代码的另一部分。

无论如何,您每次都必须创建和销毁表,然后在put_item操作之前检查表的状态。因为一旦执行表创建API,就不会立即创建。它是创建表的请求,创建表需要一段时间。这是描述table_status的文档,据此可以决定何时运行put_item操作

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#DynamoDB.Table.table_status