По сути, мой код состоит из двух частей, обе работают самостоятельно, но не вместе. Поэтому я думаю, что у меня есть проблема с синтаксисом.
Первая часть создает таблицу, вторая часть заполняет ее.
Проблема в том, что обе части разделяют переменную имени таблицы.
import os
import boto3
import botocore.session
region = os.environ.get('AWS_DEFAULT_REGION', 'us-east-2')
session = botocore.session.get_session()
dynamo = session.create_client('dynamodb', region_name=region)
s3 = boto3.client('s3')
dynamodb = boto3.resource('dynamodb')
def lambda_handler(event, context):
bucket = event['Records'][0]['s3']['bucket']['name']
key = event['Records'][0]['s3']['object']['key']
obj = s3.get_object(Bucket=bucket, Key=key)
rows = obj['Body'].read().decode("utf-8"). split ('\n')
table = dynamodb.Table(key)
dynamodb.create_table(
TableName=key,
KeySchema=[
{
'AttributeName': 'first',
'KeyType': 'HASH' #Partition key
},
{
'AttributeName': 'last',
'KeyType': 'RANGE' #Sort key
}
],
AttributeDefinitions=[
{
'AttributeName': 'first',
'AttributeType': 'S'
},
{
'AttributeName': 'last',
'AttributeType': 'S'
},
],
ProvisionedThroughput={
'ReadCapacityUnits': 5,
'WriteCapacityUnits': 5
}
)
# Wait for the table to exist before exiting
print('Waiting for', key, '...')
waiter = dynamo.get_waiter('table_exists')
waiter.wait(TableName=key)
with table.batch_writer() as batch:
for row in rows:
batch.put_item(Item={
'first':row.split(',')[0],
'last':row.split(',')[1],
'age':row.split(',')[2],
'date':row.split(',')[3]
})
Это работает как лямбда-функция всякий раз, когда CSV сбрасывается в мое ведро s3.
После запуска он успешно создает таблицу, но не заполняет ее. Окончание с:
«Задание истекло через 3,00 секунды»
Он запускается снова через несколько секунд и возвращает «Таблица уже существует», но остается пустой.
Если я запускаю только часть batch_writer, она будет заполнять таблицу, пока она уже существует.