环境需求
单位现在每隔一段时间需要核对一下 AWS 正在运行的 EC2 资源清单,为了避免核对失误以及重复性的工作,打算用脚本来解决这一重复性的工作。大概思路为 通过 AWS AK、SK 来索取 AWS EC2 list 的权限,然后通过 Python 把正在运行的 EC2 实例筛选出来,然后提取出来想要的一些内容 写入到 CSV 表格中,通过附件的方式发送到邮箱中.
运行脚本所需
Python3、pip3
Python3 所需模块
boto3
csv
codecs
smtplib
脚本内容
#!/usr/bin/python
#-*-coding:UTF-8-*-
importboto3
importcsv
importcodecs
importsmtplib
fromemail.mime.textimportMIMEText
fromemail.mime.multipartimportMIMEMultipart
fromsmtplibimportSMTP
ec2=boto3.client(
'ec2',
aws_access_key_id="AKIAUO5xxxxxxxxxxxxxxxxxxx",
aws_secret_access_key="0wcg69IbHT/5xxxxxxxxxxxxxxxxxxxxxx",
region_name='cn-north-1',
)
response=ec2.describe_instances()
withopen("/home/bsh/scripts/running.csv","w",encoding="utf-8",newline="")ascsvf:
writer=csv.writer(csvf)
csv_head=["Uptime","Project","InstanceName","InstanceID","PublicIP","PriviteIP","KeyName","State"]
writer.writerow(csv_head)
foriinresponse['Reservations']:
ifi['Instances'][0]['State']['Name']=='running':
forjini['Instances']:
if'PublicIpAddress'notinj:
j['PublicIpAddress']=""
if'Tags'notinj:
j['Tags']=[]
if'InstanceId'notinj:
j['InstanceId']=[]
if'KeyName'notinj:
j['KeyName']=[]
print(j['Tags'])
fordicinj['Tags']:
ifdic['Key']=='Name':
print(dic['Value'])
v=dic['Value']
fordicinj['Tags']:
ifdic['Key']=='Project':
print(dic['Value'])
p=dic['Value']
row_cvs=[j['LaunchTime'],p,v,j['InstanceId'],j['PublicIpAddress'],j['PrivateIpAddress'],j['KeyName'],'running']
writer.writerow(row_cvs)
print(j['LaunchTime'],p,v,j['InstanceId'],j['PublicIpAddress'],j['PrivateIpAddress'],j['KeyName'],'running')
mailto_list=['xuewenlong93@189.com']
mail_host="smtp.189.cn"
mail_user="xuewenlong93@189.cn"
mail_pass="xxxx"
defmake_mpa_msg():
email=MIMEMultipart('alterbative')
text=MIMEText(open('/home/bsh/scripts/running.csv','rb').read(),'base64','utf-8')
text["Content-Disposition"]='attachment;filename="running.csv"'
email.attach(text)
returnemail
defsend_mail(to_list,sub,content):
me="awsEC2"+"<"+mail_user+">"
msg=make_mpa_msg()
msg['Subject']=sub
msg['From']=me
msg['To']=";".join(to_list)
try:
server=smtplib.SMTP()
server.connect(mail_host)
server.login(mail_user,mail_pass)
server.sendmail(me,to_list,msg.as_string())
server.close()
returnTrue
exceptExceptionase:
print(str(e))
returnFalse
foriinrange(1):#发送1封
ifsend_mail(mailto_list,"awsec2list","msg.as_string()"):
print('发送成功')
else:
print('发送失败')
[root@ip-10-0-10-243scripts]#pythonawsout.py
发送成功
[root@ip-10-0-10-243scripts]#