AttributeError: 'dict' object has no attribute 'Instance' python

Question:

i am trying to start the EC2 Instance with PrivateIP where i provide as argument "PrivateIP" and below code will describe the ec2 and get InstanceId. Once InstanceId received, it starts the EC2 instance

def status_ec2_instance(instanceIds_list, region_Name):
    ec2 = boto3.resource('ec2', region_name=region_Name)
    ec2_client = boto3.client('ec2', region_name=region_Name)
    print(instanceIds_list)
    a=instanceIds_list[0]
    print(a)
    #response=ec2_client.describe_instances(InstanceIds=instanceIds_list)
    response = ec2_client.describe_instances(Filters=[
        {
            'Name': 'private-ip-address',
            'Values': [
                a,
            ]    
        }
    ])
    for ec2 in response['Reservations'][0]['Instances']:
        instanceIds = ec2['InstanceId']
        print(instanceIds)
        response=ec2_client.start_instances(InstanceIds=[instanceIds])
        print('started your instances: ' + str(instanceIds))
        instance_started = []
        print(instanceIds)
        instance_response = ec2.Instance([instanceIds])
        instance_state = instance_response.state
        if instance_state['Name'] == 'running'and instance not in instance_started:
            instance_started.append(instance)
            print(instance,instance_state['Name'])
                
                    
    print("started instances ",str(instance_started))
    return instance_started

if __name__ == "__main__":
    PrivateIP = sys.argv[1]
    region_Name = "us-east-1"
    #instanceIds_list = [instanceIds]
    instanceIds_list = [PrivateIP]
    status_list=status_ec2_instance(instanceIds_list, region_Name)

However, i have received an error below

Traceback (most recent call last):
  File "test3-status.py", line 100, in <module>
    status_list=status_ec2_instance(instanceIds_list, region_Name)
  File "test3-status.py", line 71, in status_ec2_instance
    instance_response = ec2.Instance([instanceIds])
AttributeError: 'dict' object has no attribute 'Instance'

Please help how to fix this?

Asked By: shailysharma

||

Answers:

You have reused the ec2 variable that previously stored the boto client, but then has a dictionary assigned to it.

def status_ec2_instance(instanceIds_list, region_Name):
    ec2 = boto3.resource('ec2', region_name=region_Name)
    //...
    for ec2 in response['Reservations'][0]['Instances']:
        instanceIds = ec2['InstanceId']
        // ...
        instance_response = ec2.Instance([instanceIds])

This should work:

def status_ec2_instance(instanceIds_list, region_Name):
    ec2 = boto3.resource('ec2', region_name=region_Name)
    //...
    for instance in response['Reservations'][0]['Instances']:
        instanceIds = instance['InstanceId']
        // ...
        instance_response = ec2.Instance([instanceIds])
Answered By: azro