in lambdas/setup_rds_ddl/index.py [0:0]
def lambda_handler(event, context):
message = ''
response = cfnresponse.FAILED
instance_status = ''
# Get CloudFormation parameters
cfn_stack_id = event.get('StackId')
cfn_request_type = event.get('RequestType')
cfn_physicalResourceId = context.log_stream_name if event.get('ResourceProperties.PhysicalResourceId') is None else event.get('ResourceProperties.PhysicalResourceId')
if cfn_stack_id and cfn_request_type != 'Delete':
try:
# Wait for instance to become available before trying to connect
while instance_status.lower() != 'available':
# Exit if Lambda will timeout before next sleep ends
if context.get_remaining_time_in_millis() < (30 * 1000):
message = 'Function will timeout. Exiting with failure.'
print('[ERROR] ', message)
cfnresponse.send(event, context, response,
{
'Message': message
},
cfn_physicalResourceId)
return {
'statusCode': 200,
'body': json.dumps(message)
}
# Get instance availability status every 30 seconds
time.sleep(30)
rdsclient = boto3.client('rds')
dbinstance = rdsclient.describe_db_instances(DBInstanceIdentifier=DB_INSTANCE)
instance_status = dbinstance['DBInstances'][0]['DBInstanceStatus']
print('[INFO] DBInstance {} status: {}. Time remaining: {} ms.'.format(DB_NAME, instance_status, context.get_remaining_time_in_millis()))
sql_queries = [
'DROP TABLE IF EXISTS rideTransactions;'
,'''
CREATE TABLE rideTransactions
(
id INT NOT NULL AUTO_INCREMENT
,userId VARCHAR(64)
,stationId INT
,stationName VARCHAR(128)
,duration INT
,price DECIMAL(5,2)
,createdDate TIMESTAMP DEFAULT CURRENT_TIMESTAMP
,PRIMARY KEY (id)
);
'''
,'CREATE INDEX idxRideUserId ON rideTransactions(userId);'
,'CREATE INDEX idxRideStationId ON rideTransactions(stationId);'
]
print('[INFO] Connecting...')
conn_info = connection_info(DB_CREDS)
print("[DEBUG] DB_CREDS: " + json.dumps(DB_CREDS, indent=2))
conn = pymysql.connect(host=conn_info['host'], user=conn_info['username'], password=conn_info['password'], database=conn_info['dbname'], connect_timeout=30)
with conn.cursor() as cur:
for sql in sql_queries:
print('[INFO] Executing SQL: {}'.format(sql))
cur.execute(sql)
conn.commit()
conn.close()
message = '[SUCCESS] Executed setup queries successfully.'
response = cfnresponse.SUCCESS
except Exception as e:
print('[ERROR] ', e)
message = '{}'.format(e)
else:
message = '[INFO] Deleting function.'
response = cfnresponse.SUCCESS
cfnresponse.send(event, context, response,
{
'Message': message
},
cfn_physicalResourceId)
return {
'statusCode': 200,
'body': json.dumps(message)
}