in tools/fixity/lambda/driver/app.py [0:0]
def s3_batch_handler(event, context):
logger.debug('## EVENT\r' + jsonpickle.encode(dict(**event)))
jobId = event['job']['id']
invocationId = event['invocationId']
invocationSchemaVersion = event['invocationSchemaVersion']
taskId = event['tasks'][0]['taskId']
sourceKey = urllib.parse.unquote_plus(event['tasks'][0]['s3Key'])
s3BucketArn = event['tasks'][0]['s3BucketArn']
sourceBucket = s3BucketArn.split(':::')[-1]
results = []
# Prepare result code and string
resultCode = None
resultString = None
try:
batch_job_id = _submit_job(sourceBucket, sourceKey)
resultCode = 'Succeeded'
resultString = 'https://console.aws.amazon.com/batch/v2/home?region=' + os.environ['AWS_REGION'] + '#jobs/detail/'+ batch_job_id
except ClientError as e:
# If request timed out, mark as a temp failure
# and S3 Batch Operations will make the task for retry. If
# any other exceptions are received, mark as permanent failure.
errorCode = e.response['Error']['Code']
errorMessage = e.response['Error']['Message']
logger.debug(errorMessage)
if errorCode == 'TooManyRequestsException':
resultCode = 'TemporaryFailure'
resultString = 'Retry request to batch due to throttling.'
elif errorCode == 'RequestTimeout':
resultCode = 'TemporaryFailure'
resultString = 'Retry request to Amazon S3 due to timeout.'
elif (errorCode == '304'):
resultCode = 'Succeeded'
resultString = 'Not modified'
elif (errorCode == 'SlowDown'):
resultCode = 'TemporaryFailure'
resultString = 'Retry request to s3 due to throttling.'
else:
resultCode = 'PermanentFailure'
resultString = '{}: {}'.format(errorCode, errorMessage)
except Exception as e:
# Catch all exceptions to permanently fail the task
resultCode = 'PermanentFailure'
resultString = 'Exception: {}'.format(e)
finally:
results.append({
'taskId': taskId,
'resultCode': resultCode,
'resultString': resultString
})
logger.info(resultCode + " # " + resultString)
return {
'invocationSchemaVersion': invocationSchemaVersion,
'treatMissingKeysAs': 'PermanentFailure',
'invocationId': invocationId,
'results': results
}