import json import logging import urllib3 import threading import boto3 import time import random import os localtime = time.asctime( time.localtime(time.time()) ).replace(" "," ").replace(" ","-").replace(":","-") http = urllib3.PoolManager() appr_client = boto3.client('servicecatalog-appregistry') s3client = boto3.client('s3') ec2_client = boto3.client('ec2') nepdb_client = boto3.client('neptune') logger = logging.getLogger() def ec2_descroutetb(event): Filters=[{'Name': 'vpc-id','Values': [event['ResourceProperties']['VpcId'] ] }] _res = ec2_client.describe_route_tables(Filters=Filters)['RouteTables'] _rtable ='' for _throute in _res: for _rt in _throute['Routes']: if 'GatewayId' in _rt: if _rt['GatewayId'].find('igw') > -1: _rtable = _throute['RouteTableId'] return _rtable def get_neptuneinfo(event): _ret ={} _rep = nepdb_client.describe_db_instances(DBInstanceIdentifier=event['ResourceProperties']['DBInstanceIdentifier']) #print(_rep) azname = _rep['DBInstances'][0]['AvailabilityZone'] for ss in _rep['DBInstances'][0]['DBSubnetGroup']['Subnets'] : if ss['SubnetAvailabilityZone']['Name'] == azname: subnet = ss['SubnetIdentifier'] # if ss _ret['dbinfo'] = {'AvailabilityZone':_rep['DBInstances'][0]['AvailabilityZone'], 'SecurityGroupIds':_rep['DBInstances'][0]['VpcSecurityGroups'][0]['VpcSecurityGroupId'], 'VpcId':_rep['DBInstances'][0]['DBSubnetGroup']['VpcId'], 'SubnetIds':subnet} return _ret 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 gen_surl(bucketname, keyname): url = s3client.generate_presigned_url(ClientMethod='get_object', Params={ 'Bucket': bucketname, 'Key': keyname}) return url 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 sc_make_cft(event): bucket = event['ResourceProperties']['bucket'] prefix = event['ResourceProperties']['prefix'] #loadneptunearn = event['ResourceProperties']['loadneptunearn'] #loadneptunerolearn = event['ResourceProperties']['loadneptunerolearn'] #Lapreg2neptunearn = event['ResourceProperties']['Lapreg2neptunearn'] #Lapreg2neptunerolearn = event['ResourceProperties']['Lapreg2neptunerolearn'] #NeptuneClusterRole = event['ResourceProperties']['NeptuneClusterRole'] #endpoint = event['ResourceProperties']['endpoint'] bkey = f"{prefix}scappregistry_product.json" sctemplate = json.loads(b_get_obj(bucket, bkey)) # #sctemplate['Resources']['Loadneptune'] = Loadneptune b_putpriv(bucket, bkey, 'text/json',json.dumps(sctemplate,indent = 2)) def lambda_handler(event, context): print(json.dumps(event)) _ret={} _ret['Message']='Loading..' timer = threading.Timer((context.get_remaining_time_in_millis() / 1000.00) - 0.5, timeout, args=[event, context]) timer.start() status = 'SUCCESS' try: if event['RequestType'] == 'Create': if event['ResourceProperties']['action']== 'setup': _rret = get_neptuneinfo(event) #sc_make_cft(event) _ret = _rret['dbinfo'] rtt= ec2_descroutetb(event) _rtableList = ec2_descroutetb(event) print(_rtableList) _ret['rtable'] = _rtableList except Exception as e: logging.error('Exception: %s' % e, exc_info=True) status = 'FAILED' finally: timer.cancel() cfnresponse(event, context, status,_ret) print(json.dumps(_ret)) return _ret