Произошла ошибка (ResourceInUseException) при вызове операции CreateTable: таблица уже существует: - PullRequest
0 голосов
/ 15 апреля 2019

Ошибка ниже при создании таблицы в Dynamodb для помещения данных из корзины s3 и загрузки в таблицу, содержащую более 4 столбцов.

ошибка в cloudwatchlogs: «ошибка инициализации модуля: произошла ошибка (ResourceInUseException) при вызове операции CreateTable: таблица уже существует: "пример кода:

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]
            })

МОИ Запросы: Пожалуйста, помогите мне, взяв несколько случайных '|'отдельные значения для заданных столбцов в текстовом файле и запуск кода в лямбда-выражении.

Примечание. Используемые службы - это Dynamodb в качестве ресурса, S3 в качестве клиента.В этом случае я получаю сообщение об ошибке, но я вижу, что каждый раз, когда я сохраняю код и загружаю текстовый файл в s3, создается таблица, а затем появляется ошибка, описанная выше.Я удаляю таблицу, сохраняю лямбда-код и загружаю файл в S3, и снова та же самая ошибка, которую я получаю.Здесь S3 действует как триггер.Я также создал одну роль S3-lambda-cloudwatchlogs-dynamodb.

уже указано выше

1 Ответ

0 голосов
/ 16 апреля 2019

Обычно создание таблицы в большинстве случаев является однократной операцией. Вы должны создать таблицу в другом скрипте, запустить ее один раз, а затем запустить другую часть кода в lambda.

Если в любом случае вам придется каждый раз создавать и уничтожать таблицу, то проверьте состояние таблицы перед операцией put_item. Потому что как только вы запустите таблицу, создайте API, если не будете созданы мгновенно. Это запрос на создание таблицы, создание которой займет некоторое время. Вот документ, описывающий table_status, на основе которого можно принять решение, когда следует запустить операцию put_item

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

...