May-19-2020, 02:49 PM
Hi,
I have inherited a number of python scripts for AWS Lambda that need upgrading from python 2.7 to v3. The following script has been through the 2to3 python script. However I'm getting ' TypeError: a bytes-like object is required, not 'str' '.
Sorry but I'm new to python and no idea how I should fix this.
Thanks in advance.
This is my code -
I have inherited a number of python scripts for AWS Lambda that need upgrading from python 2.7 to v3. The following script has been through the 2to3 python script. However I'm getting ' TypeError: a bytes-like object is required, not 'str' '.
Sorry but I'm new to python and no idea how I should fix this.
Thanks in advance.
This is my code -
import os import json import urllib.request, urllib.parse, urllib.error import boto3 import botocore import datetime import json import csv print('Loading function') region_list = {'eu-west-1','eu-west-2','eu-central-1'} date = datetime.date.today().strftime("%Y_%m_%d") #file path filepath ='/tmp/' #filename filename = os.environ['filename'] + date + '.csv' tempfile = filepath + filename mybucket = os.environ['bucket'] account = os.environ['account'] #print ('filename "%s"' % str(filename)) session = boto3.session.Session() s3_client = session.client('s3', config= boto3.session.Config(signature_version='s3v4')) def lambda_handler(event, context): with open(tempfile, 'wb+') as out: dict_writer = csv.DictWriter(out, fieldnames=['Region','InstanceId','Name','Status','Instance_Size','Launch_Time','Service','CPU.Average','CPU.Max','CPUCreditBalance.Max','CPUCreditBalance.Min']) dict_writer.writeheader() for region in region_list: client = session.client('ec2', region_name=region) cwclient = session.client('cloudwatch', region_name=region) #filters=[{'Name': 'instance-state-name', 'Values': ['running']}] #response = client.describe_instances(Filters=filters) response = client.describe_instances() instance_list = [] for instances in response['Reservations']: for instance in instances['Instances']: inst = {} inst['Region'] = region inst['InstanceId'] = instance['InstanceId'] inst['Name'] = instance['InstanceId'] inst['Instance_Size'] = instance['InstanceType'] state = instance['State'] inst['Status'] = state['Name'] launch = instance['LaunchTime'] inst['Launch_Time'] = launch.strftime("%Y_%m_%d %H:%M") inst['Service'] = '' inst['Name'] = '' inst['CPU.Average'] = '' inst['CPU.Max'] = '' try: if len(instance['Tags']) > 0: for tag in instance['Tags']: if tag['Key'] == 'Service': inst['Service'] = tag['Value'] if tag['Key'] == 'Name': inst['Name'] = tag['Value'] except KeyError as e: print(('I got a KeyError - reason "%s"' % str(e))) cwresponse=cwclient.get_metric_statistics( Period = 900, StartTime = datetime.datetime.utcnow() - datetime.timedelta(days=4), EndTime = datetime.datetime.utcnow(), Namespace = 'AWS/EC2', MetricName = 'CPUUtilization', Statistics = ['Average','Maximum'], Dimensions = [{'Name' : 'InstanceId', 'Value' : instance['InstanceId']}] ) average = 0 maxcpu = 0 if cwresponse['Datapoints']: for data in cwresponse['Datapoints']: cpu = data['Maximum'] ave = data['Average'] if cpu > maxcpu: maxcpu = cpu if ave > average: average = ave inst['CPU.Max'] = maxcpu inst['CPU.Average'] = average cwresponse2=cwclient.get_metric_statistics( Period = 900, StartTime = datetime.datetime.utcnow() - datetime.timedelta(days=4), EndTime = datetime.datetime.utcnow(), Namespace = 'AWS/EC2', MetricName = 'CPUCreditBalance', Statistics = ['Minimum','Maximum'], Dimensions = [{'Name' : 'InstanceId', 'Value' : instance['InstanceId']}] ) minbal = 999999 maxbal = 0 if cwresponse2['Datapoints']: for data in cwresponse2['Datapoints']: minimum = data['Minimum'] maximum = data['Maximum'] if minimum < minbal: minbal = minimum if maximum > maxbal: maxbal = maximum inst['CPUCreditBalance.Max'] = maxbal inst['CPUCreditBalance.Min'] = minbal dict_writer.writerow(inst) instance_list.append(inst) out.close() # Upload the file to S3 s3_client.upload_file(tempfile, mybucket, account + filename, ExtraArgs={'ACL': 'public-read'})
Error:[ERROR] TypeError: a bytes-like object is required, not 'str'
Traceback (most recent call last):
File "/var/task/lambda_function.py", line 35, in lambda_handler
dict_writer.writeheader()
File "/var/lang/lib/python3.8/csv.py", line 143, in writeheader
return self.writerow(header)
File "/var/lang/lib/python3.8/csv.py", line 154, in writerow
return self.writer.writerow(self._dict_to_list(rowdict))