import json import urllib3 import time import random import logging import threading import os import boto3 localtime = time.asctime( time.localtime(time.time()) ).replace(" "," ").replace(" ","-").replace(":","-") s3client = boto3.client('s3') ssmclient = boto3.client('ssm') http = urllib3.PoolManager() logger = logging.getLogger() # def get_ssm_para(name): response = ssmclient.get_parameter(Name=name) return response['Parameter']['Value'] def put_ssm_para(kdict): pres = ssmclient.put_parameter( Name=kdict['Name'], Description=kdict['Description'], Value=kdict['Value'], Type=kdict['Type'], Overwrite=True) def gen_surl(bucketname, keyname): url = s3client.generate_presigned_url(ClientMethod='get_object', Params={ 'Bucket': bucketname, 'Key': keyname}) return url def cfnresponse(event, context, responseStatus, responseData, physicalResourceId=None, noEcho=False): responseBody = {} responseBody['Status'] = responseStatus responseBody['Reason'] = 'See the details in CloudWatch Log Stream: ' + context.log_stream_name responseBody['PhysicalResourceId'] = physicalResourceId or context.log_stream_name responseBody['StackId'] = event['StackId'] responseBody['RequestId'] = event['RequestId'] responseBody['LogicalResourceId'] = event['LogicalResourceId'] responseBody['NoEcho'] = noEcho responseBody['Data'] = responseData json_responseBody = json.dumps(responseBody) headers = {'content-type' : '','content-length' : str(len(json_responseBody))} try: response = http.request('PUT',event['ResponseURL'],body=json_responseBody.encode('utf-8'),headers=headers) logger.debug('Status code: ' + response.reason) except Exception as e: logger.error('cfnresponse(..) failed executing requests.put(..): ' + str(e)) def timeout(event, context): logging.error('Execution is about to time out, sending failure response to CloudFormation') cfnresponse(event, context, 'FAILED',{}) def b_putpriv(bucket, key, ContentType,body): srep = s3client.put_object( ACL='private', Body=body, Bucket=bucket, Key=key, ContentType=ContentType,) #print(srep) return srep def b_get_obj(bucket, bkey): object = s3client.get_object(Bucket=bucket, Key=bkey) return(object['Body'].read().decode('utf-8')) def neptunedbreset(event): _ret = [] _ep = event['curlcmd'][0]['endpoint'].replace('loader','system') _datagtok = {'action':'initiateDatabaseReset'} _headers = {'Content-type': 'application/json'} _data = json.dumps(_datagtok) _results = http.request('POST',_ep,headers=_headers,body=_data) _jsonresults= json.loads(_results.data.decode('utf-8')) _token = _jsonresults['payload']['token'] _dataperform = {'action':'performDatabaseReset','token':_token} #performing neptune reset _data = json.dumps(_dataperform) _resultsp = http.request('POST',_ep,headers=_headers,body=_data) _jsonresultsp= json.loads(_resultsp.data.decode('utf-8')) _res = {'endpoint':_ep,'datarequestoken':_datagtok,'dataperform':_dataperform,'resetresults':_jsonresultsp} print(json.dumps(_res)) return _res def loadfiles(event): _ret = [] _headers = {'Content-type': 'application/json'} #_devent = event['curlcmd'][0] for _devent in event['curlcmd']: _ep = f"{_devent['endpoint']}" _out = f"loading {_devent['data']['source']}" print(_out) _data = json.dumps(_devent['data']) print(_ep) r = http.request('POST',_ep,headers=_headers,body=_data) _ret.append(json.loads(r.data.decode('utf-8'))) #_ret.append(_devent['data']) return _ret def lambda_handler(event, context): print(json.dumps(event)) # #return event timer = threading.Timer((context.get_remaining_time_in_millis() / 1000.00) - 0.5, timeout, args=[event, context]) timer.start() status = 'SUCCESS' # _ret={} _ret['message'] = 'loading files to neptune' _ret['WebInterface'] = f"https://{event['ResourceProperties']['bucket']}.s3.amazonaws.com/content/appreg/report/index.html" try: if event['RequestType'] == 'Create': bucket = event['ResourceProperties']['bucket'] prefix = event['ResourceProperties']['prefix'] appreg2neptuneinfokey = f"{prefix}appregenv/appreg2neptuneinfokey.json" sc_appregEnv =json.loads( b_get_obj(bucket, appreg2neptuneinfokey)) if event['ResourceProperties']['action'] == "hardupdate": _ret['message'] = 'hard update plus wait 50' _ret['reset'] = neptunedbreset(sc_appregEnv) time.sleep(45) _ret['rloadiles']= loadfiles(sc_appregEnv) except Exception as e: logging.error('Exception: %s' % e, exc_info=True) status = 'FAILED' finally: timer.cancel() print(json.dumps(_ret)) cfnresponse(event, context, status,_ret) return _ret