import csv import datetime import sys import boto3 import json import uuid import os import googleapiclient from googleapiclient import discovery from oauth2client.client import GoogleCredentials projectName = "dbaas-prod" # csvFile = open('vms.csv', 'w+') # fieldnames = [ # 'date', # 'tenant', # 'project', # 'vm_type', # 'region', # 'cpus' # ] # # writer = csv.DictWriter(csvFile, fieldnames=fieldnames) # writer.writeheader() ec2Infos = [] def find_vms_from_gcp(): credentials = GoogleCredentials.get_application_default() computeClient = discovery.build('compute', 'v1', credentials=credentials) request = computeClient.instances().aggregatedList(project = projectName) while request is not None: response = request.execute() if 'items' not in response: continue zonedInstances = response['items'] for zones in zonedInstances.items(): zoneName = zones[0] zoneName = str(zoneName).replace('zones/', '') instancesList = zones[1] if 'instances' not in instancesList: continue for instance in instancesList['instances']: instanceName = instance['name'] machineType = instance['machineType'] machineTypeSeps = machineType.split('/') machineType = machineTypeSeps[len(machineTypeSeps) -1 ] if 'shoot--' in instanceName: if 'labels' not in instance: continue labels = instance['labels'] tenant = labels.get('tenant') project = labels.get('project') print( { "date": datetime.date.today(), 'tenant': tenant, 'project': project, 'vm_type': machineType, 'region': zoneName, } ) ec2Infos.append({ "date": datetime.date.today(), 'tenant': tenant, 'project': project, 'vm_type': machineType, 'region': zoneName, }) request = computeClient.instances().aggregatedList_next(previous_request=request, previous_response=response) def find_vms_by_regions(region): ec2Client = boto3.client('ec2', region_name=region) response = ec2Client.describe_instances() for reservation in response['Reservations']: for instance in reservation['Instances']: instanceName = None if 'Tags' not in instance: continue tags = instance['Tags'] print(instance['InstanceType'], instance['CpuOptions']['CoreCount']) tenant = None project = None for tag in tags: if tag['Key'] == 'Name': instanceName = tag['Value'] if tag['Key'] == 'tenant': tenant = tag['Value'] if tag['Key'] == 'project': project = tag['Value'] if instanceName is None: continue if project is None: continue if tenant is None: continue ec2Infos.append({ "date": datetime.date.today(), 'tenant': tenant, 'project': project, 'vm_type': instance['InstanceType'], 'region': region, 'cpus': instance['CpuOptions']['CoreCount'], }) def lambda_handler(event, context): for region in ["us-west-2", "us-east-1", "ap-northeast-1", "ap-northeast-2", "ap-southeast-1", "eu-central-1"]: find_vms_by_regions( region ) find_vms_from_gcp() sqs = boto3.client('sqs') queue = sqs.get_queue_url(QueueName=os.getenv("QUEUE_NAME")) for r in ec2Infos: sqs.send_message( QueueUrl=queue['QueueUrl'], MessageBody=json.dumps(r), MessageDeduplicationId=uuid.uuid4().hex, MessageGroupId=os.getenv("MESSAGE_GROUP_ID") ) return { 'statusCode': 200, 'body': json.dumps('Hello from Lambda!') }