Salve a tutti,
come si può leggere dal titolo, avrei bisogno di prendere dei dati salvati sul dynamodb con una funzione lambda scritta ovviamente in python.
La lambda riceve tramite una richiesta http post un xml il quale viene salvato in un s3 bucket.
Prima di procedere a salvare l'xml devo controllare che il race_id (una stringa passata assieme alla richiesta http nell'url tramite query string) combaci con uno dei valori contenuti nella tabella (chiamata registrazioneDB) della dynamodb in corrispondenza della colonna "race_id".
Vi posto giù il codice, in cui ho evidenziato con tanti ############################ la sezione che riguarda il problema per cui vi scrivo.
Infatti l'errore che mi si presenta e che vedo da cloudwatch è il seguente:
invalid syntax (lambda_function.py, line 41)
Traceback (most recent call last):
File "/var/task/lambda_function.py" Line 41
'race_id': race_id;
Di seguito il codice:
import json
import boto3
import logging
logger= logging.getLogger()
logger.setLevel(logging.INFO)
# Nome del bucket. TODO: sostituire con il nome del proprio bucket.
DEFAULT_BUCKET = 'mdv-xmlresults-bucket2'
def lambda_handler(event, context):
# A seconda del tipo di metodo HTTP si fanno cose diverse:
# - GET -> si restituisce una stringa di saluto. Serve solo per assicurarsi che tutto stia funzionando, verrà eliminato in seguito
# - POST -> ci si aspetta che il body della richiesta contenga l'XML e che ci sia il paramtero raceid.
# La stringa XML ricevuta viene salvata nel oggetto S3 (file) "RACEID.xml"
# - PUT -> si restituisce l'oggetto event per vedere cosa contiene. Serve solo per DEBUG. Verrà cambiato in seguito.
httpMethod = event['requestContext']['http']['method']
print("httpMethod è: " + event['requestContext']['http']['method']);
if httpMethod == 'GET':
res = {
'statusCode': 200,
'body': json.dumps('Ciao from Lambda!')
}
elif httpMethod == 'POST':
xmlstring = event['body']
object_name = event['queryStringParameters']['raceid'] + '.xml'
#prendo da DynamoDB il token che corrisponde (se esiste) al race_id fornito in string query
race_id= event['queryStringParameters']['raceid'];
client = boto3.resource("dynamobd");
table = client.get_item (
tablename= 'registrazioneDB',
Key={
'race_id': race_id;
})
put_to_bucket(content=xmlstring, object_name=object_name)
res = {'statusCode': 200, 'body': 'File updloaded.'}
elif httpMethod == 'PUT':
res = {'statusCode': 200, 'body': json.dumps(str(event))}
else:
res = {'statusCode': 405, 'body': 'Method Not Allowed'}
return res
def put_to_bucket(bucket_name=DEFAULT_BUCKET, object_name='prova.xml', content=None):
assert check_xml(content)
s3 = boto3.resource('s3')
obj = s3.Object(bucket_name, object_name)
obj.put(Body=content)
def check_xml(xml_string):
# TODO XML validation
return True
Dove sta il problema ?