【发布时间】:2019-07-10 09:40:04
【问题描述】:
我的代码基本上由两部分组成,它们各自独立工作,但不能一起工作。所以我认为我有语法问题。
第一部分是创建表,第二部分是填充它。 问题是,两个部分共享表名的变量。
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 存储桶,它就会作为 lambda 函数运行。
运行后,成功创建表,但不填充。结尾: “任务在 3.00 秒后超时” 几秒钟后它再次启动并返回“表已存在”,但仍为空。
如果我只运行 batch_writer 部分,只要它已经存在,它就会填充表。
【问题讨论】:
标签: python amazon-s3 aws-lambda amazon-dynamodb boto3