问题描述
我正在尝试编写Python / BOTO3脚本来获取us-east-1,us-west-1,ap-southeast-1地区的所有实例。
我要收集的信息是:
- 实例ID
- 实例类型
- 附加到实例的IAM角色
- 列表项所有警报的状态
目前我已经走了这么远,我有点受阻,将不胜感激一些帮助:
import boto3
from collections import defaultdict
regions = [
'ap-southeast-1','us-west-1','us-east-1',]
ec2 = boto3.resource('ec2',region_name="us-east-2")
running_instances = ec2.instances.filter(Filters=[{
'Name': 'instance-state-name','Values': ['running']}])
ec2info = defaultdict()
for instance in running_instances:
ec2info[instance.id] = {
'Instance ID': instance.id,'State': instance.state['Name'],'Instance Type': instance.instance_type,}
attributes = ['Instance ID','State',"Instance Type"]
for instance_id,instance in ec2info.items():
for key in attributes:
print("{0}: {1}".format(key,instance[key]))
print("------")```
Thanks in advance :-)
解决方法
获取所有警报是一个棘手的部分,因为除非您事先了解一些警报,否则将很难找到所有警报。尽管如此,我还是以CPUUtilization
为例来演示代码:
import boto3
regions = [
'ap-southeast-1','us-west-1','us-east-1',]
for region in regions:
ec2 = boto3.resource('ec2',region_name=region)
running_instances = ec2.instances.filter(Filters=[{
'Name': 'instance-state-name','Values': ['running']}])
cw = boto3.client('cloudwatch',region_name=region)
for instance in running_instances:
instance_profile = 'N/A';
if instance.iam_instance_profile:
instance_profile = instance.iam_instance_profile['Arn']
print(region,instance.id,instance.instance_type,instance_profile)
alarms = cw.describe_alarms_for_metric(
Namespace='AWS/EC2',MetricName='CPUUtilization',Dimensions=[
{
'Name': 'InstanceId','Value': instance.id
}]
)
if 'MetricAlarms' in alarms:
for alarm in alarms['MetricAlarms']:
print(f" - {alarm['AlarmName']},{alarm['StateValue']}")
示例输出:
us-west-1 i-0d45a86caf2ee0e71 t2.micro arn:aws:iam::353693526480:instance-profile/InstanceRole
- awsec2-i-0d45a86caf2ee0e71-CPU-Utilization,OK
us-east-1 i-0f7cd6d6123e6c47e t2.micro N/A