接触AWS主机在13年,使用的是AWS的一年免费试用(需绑定双币信用卡),在此之前确已经用过阿里云主机。当时的感觉就是AWS主机没有aliyun入手简单(语言障碍应该也是一部分因素)。在后来的工作中更多的接触到了AWS主机,通过深入了解AWS API相关的东西,发现了AWS相对于aliyun在云产品上的成熟性和灵活性。本篇就结合python poto模块通过AWS API做AWS主机的资产信息统计。

一、创始mysql 资产表

 1DROP TABLE IF EXISTS `aws_inventory`;
 2CREATE TABLE `aws_inventory` (
 3  `id` bigint(20) NOT NULL AUTO_INCREMENT,
 4  `instanceid` varchar(128) DEFAULT NULL,
 5  `public_ip` varchar(32) DEFAULT NULL,
 6  `private_ip` varchar(32) DEFAULT NULL,
 7  `instance_type` varchar(32) DEFAULT NULL,
 8  `region` varchar(128) DEFAULT NULL,
 9  `state` varchar(32) DEFAULT NULL,
10  `key_name` varchar(128) DEFAULT NULL,
11  `public_dns_name` varchar(255) DEFAULT NULL,
12  `placement` varchar(128) DEFAULT NULL,
13  `architecture` varchar(32) DEFAULT NULL,
14  PRIMARY KEY (`id`),
15  UNIQUE KEY `uniqueid` (`id`)
16);

二、python 资产统计入库脚本

下面以ec2主机为例,统计某账户下的所有主机资产信息

 1#!/usr/bin/python
 2import boto.ec2
 3import MySQLdb
 4regions = [ 'us-east-1','eu-west-1', 'us-west-1','us-west-2','ap-northeast-1','ap-southeast-1','ap-southeast-2']
 5inventory = []
 6for region in regions:
 7        conn = boto.ec2.connect_to_region(region)
 8        reserved_instances = conn.get_all_instances()
 9        instances = []
10        for r_instance in reserved_instances:
11                for instance in r_instance.instances:
12                        instances.append(instance)
13        for i in  instances:
14                host_info =  map(str,[i.id, i.ip_address,i.private_ip_address, i.instance_type,
15                                 i.region.name, i.state, i.key_name, i.public_dns_name, i.placement,
16                                 i.architecture])
17                inventory.append(host_info)
18mysql_conn = MySQLdb.connect(host='localhost', port=3306, user='root', passwd='361way.com',db = 'sysmanager')
19db_cursor = mysql_conn.cursor()
20db_cursor.execute('truncate aws_inventory')
21db_cursor.executemany('insert into aws_inventory (instanceid, public_ip, private_ip, instance_type,
22         region, state, key_name,public_dns_name, placement, architecture )values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)', inventory)
23mysql_conn.commit()

下面针对上面的部分代码进行下分析

第4行中的区域缩写意思如下(具体可以参看AWS文档页面):

Code Name
ap-northeast-1 Asia Pacific (Tokyo) Region
ap-southeast-1 Asia Pacific (Singapore) Region
ap-southeast-2 Asia Pacific (Sydney) Region
eu-west-1 EU (Ireland) Region
sa-east-1 South America (Sao Paulo) Region
us-east-1 US East (Northern Virginia) Region
us-west-1 US West (Northern California) Region
us-west-2 US West (Oregon) Region

第7行中,并没有配置aws_access_key_id和aws_secret_access_key 。根据boto插件的用法,应该写成如下方式才可正确连接:

1>>> import boto.ec2
2>>> conn = boto.ec2.connect_to_region("us-west-2",
3...    aws_access_key_id='<aws access key>',
4...    aws_secret_access_key='<aws secret key>')

不过也可以不加这两个配置,通过环境变量的配置同样可以正常调用AWS主机信息。在linux上可以按下面三个位置任一处配置即可:

1/etc/boto.cfg - for site-wide settings that all users on this machine will use
2~/.boto - for user-specific settings
3~/.aws/credentials - for credentials shared between SDKs

此处的配置方法,可以参看boto github上的示例 。配置文件的内容按如下配置书写:

1[Credentials]
2aws_access_key_id = <your_access_key_here>
3aws_secret_access_key = <your_secret_key_here>

有多个KEY或需要使用代理进行API调用时,github上也有相应的示例,可以具体按示例进行配置。

第5-17行,是通过boto模块内的一些函数遍历出所有示例信息,这部分具体可以查看readthedocs文档pythonboto文档。

第18-23行,是入库部分。

三、总结

boto模块,这现了对ec2、s3、rds、elb、ebs 等相关应用的封装,这里只用到了其中很小的一部分功能。而在实际进行资产管理中,如zabbix平台本身就集成了资产统计功能。这里只是提供了另一种资产统计的思路。在以AWS主机为主的企业里,可以通过执行这样的python脚本将主机信息入库,也可以再进行深一步的拓展为自己的信息化平台。