Python Forum

Full Version: AttributeError: 'ec2.ServiceResource' object has no attribute 'describe_instances'
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hello,

I am trying to create a program that takes a list of AWS instance IDs from user input. And then prints out information about those instances, and then deletes them. I'm not having much progress so I was hoping to get some help!

I am using python 3.7 and boto3.

When I run the program this is the error I get:

Error:
python3 .\aws_ec2_terminate_instances.py Enter an instance ID separated by commas: i-024d1b8e8eaa8e417,i-03804b280877175be Deleting Instance IDs: i-024d1b8e8eaa8e417 Traceback (most recent call last): File ".\aws_ec2_terminate_instances.py", line 15, in <module> instance = ec2.describe_instances(InstanceIds=[instance_id]) AttributeError: 'ec2.ServiceResource' object has no attribute 'describe_instances'
This is the script as I have it so far:

import sys
import boto3
import collections
from collections import defaultdict

ec2 = boto3.resource('ec2')
instance_id_list = input("Enter an instance ID separated by commas: ")
instance_ids = instance_id_list.split(",")
print("Deleting Instance IDs:")
for instance_id in instance_ids:
    print(instance_id)
    instance = ec2.describe_instances(InstanceIds=[instance_id])
    ec2info = defaultdict()
    for tag in instance.tags:
        if 'Name'in tag['Key']:
            print(tag['Key'])
            name = tag['Value']
    # Add instance info to a dictionary    \
    print(instance.get('Instances'))
    ec2info[instance.id] = {
        'Instance ID': instance.id,
        'Type': instance.instance_type,
        'State': instance.state['Name'],
        'Private IP': instance.private_ip_address,
        'Public IP': instance.public_ip_address,
        'Launch Time': instance.launch_time
        }
    

attributes = ['Instance ID', 'Type',
              'State', 'Private IP', 'Public IP', 'Launch Time']
for instance_id, instance in ec2info.items():
    for key in attributes:
        print("{0}: {1}".format(key, instance[key]))
        print("------")
        ec2.instances.filter(InstanceIds=instance).stop()
        ec2.instances.filter(InstanceIds=instance).terminate()
I am basing this program on an earlier one that I have that gets a list of ALL AWS instances in an account, and prints out information about them. But instead of printing out everything, my goal is to get a list of instance IDs from the user, and then just print info about those instances and then delete them.

This is the working program I am basing my new one on:

from collections import defaultdict

import boto3

"""
A tool for retrieving basic information from the running EC2 instances.
"""

# Connect to EC2
ec2 = boto3.resource('ec2')

# Get information for all running instances
running_instances = ec2.instances.filter(Filters=[{
    'Name': 'instance-state-name',
    'Values': ['running']}])

ec2info = defaultdict()
for instance in running_instances:
    for tag in instance.tags:
        if 'Name'in tag['Key']:
            print(tag['Key'])
            name = tag['Value']
    # Add instance info to a dictionary         
    ec2info[instance.id] = {
        'Name': name,
        'Instance ID': instance.id,
        'Type': instance.instance_type,
        'State': instance.state['Name'],
        'Private IP': instance.private_ip_address,
        'Public IP': instance.public_ip_address,
        'Launch Time': instance.launch_time
        }

attributes = ['Name', 'Instance ID', 'Type', 'State', 'Private IP', 'Public IP', 'Launch Time']
for instance_id, instance in ec2info.items():
    for key in attributes:
        print("{0}: {1}".format(key, instance[key]))
    print("------")
Here's a sample of the output from the working program:

------
Name: usawscdvs00000-admin
Instance ID: i-84c1de8a
Type: t2.medium
State: running
Private IP: 10.48.128.41
Public IP: None
Launch Time: 2019-02-26 18:42:34+00:00
------
Name: app1-csr1kv-d
Instance ID: i-0a90f4ba
Type: c3.xlarge
State: running
Private IP: 10.48.168.4
Public IP: 52.22.62.126
Launch Time: 2017-12-20 19:21:45+00:00
------
I need some help getting the first program to do what I'm asking. I am very new to python and appreciate any help I can get!
I forgot to print the instance name tag in my original post. Here is my current error:
Error:
AttributeError: 'dict' object has no attribute 'tags'
Here is the current state of my code:
import sys
import boto3
import collections
from collections import defaultdict
ec2 = boto3.client('ec2')
instance_id_list = input("Enter an instance ID separated by commas: ")
instance_ids = instance_id_list.split(",")
print("Deleting Instance IDs:")
for instance_id in instance_ids:
    instance = ec2.describe_instances(
        InstanceIds=[instance_id]
    )
    
    ec2info = defaultdict()
    for tag in instance.tags:
        if 'Name'in tag['Key']:
             print(tag['Key'])
             name = tag['Value']
    # Add instance info to a dictionary    \
    print(instance.get('Instances'))
    ec2info[instance.id] = {
        'Name': name,
        'Instance ID': instance.id,
        'Type': instance.instance_type,
        'State': instance.state['Name'],
        'Private IP': instance.private_ip_address,
        'Public IP': instance.public_ip_address,
        'Launch Time': instance.launch_time
        }
    

attributes = ['Name', 'Instance ID', 'Type',
              'State', 'Private IP', 'Public IP', 'Launch Time']
for instance_id, instance in ec2info.items():
    for key in attributes:
        print("{0}: {1}".format(key, instance[key]))
        #print(instance.terminate())
        print("------")
How can I get passed this error?