提问

#楼主# 2019-7-30

跳转到指定楼层
本帖最后由 社群技术交流 于 2019-7-30 11:11 编辑

作者:光环云 刘立冬
Lambda实现每天定时发送所有区域正在运行EC2实例的信息
image1.png

1 创建一个有权限访问ec2和执行lambda的角色
image2.png
2  创建Lambda函数:
2.1
运行环境:Python 2.7
角色:上面创建的角色
最大内存:128M
超时:1分钟
单击“创建函数”在代码区域粘贴以下代码:
  1. import smtplib
  2. import os
  3. from email.mime.text import MIMEText
  4. from email.header import Header
  5. def lambda_handler(event,context):
  6.     import boto3
  7.     import datetime
  8.     ports=set()
  9.     public_cidr={'CidrIp':'0.0.0.0/0'}
  10.     html_body_inner=""
  11.     count=0
  12.     # initialize variables
  13.     username = os.environ['USERNAME']
  14.     password = os.environ['PASSWORD']
  15.     host = os.environ['SMTPHOST']
  16.     port = os.environ['SMTPPORT']
  17.     mail_from = os.environ.get('MAIL_FROM')
  18.     mail_to = os.environ['MAIL_TO']     # separate multiple recipient by comma. eg: "abc@gmail.com, xyz@gmail.com"
  19.     #origin = os.environ.get('ORIGIN')
  20.     #origin_req = event['headers'].get('Host')
  21.     subject = "ec2 status"
  22.     body = ""
  23.     reply_to =""
  24.     #reply_to = event['queryStringParameters'].get('reply')
  25.     #subject = event['queryStringParameters']['subject']
  26.     #body = event['body']
  27.    
  28.     response=boto3.client("ec2").describe_regions()
  29. # Iterating over all regions
  30.     for regname in response['Regions']:
  31.         ec2=boto3.client("ec2",region_name=regname['RegionName'])
  32.         all_instances=ec2.describe_instances(Filters=[{'Name':'instance-state-name','Values':['running']}])
  33.         for res in all_instances["Reservations"]:
  34.             for instance in res["Instances"]:
  35.                  count=count+1
  36.                  ports=set()
  37.                  size=instance["InstanceType"][instance["InstanceType"].find(".")+1:]
  38. # Checking if the running instance has open ports and fetching the list of open ports
  39.             for SG in instance["SecurityGroups"]:
  40.                 desc_sg=ec2.describe_security_groups(GroupIds=[ SG["GroupId"]])
  41.                 for sec_grp in desc_sg["SecurityGroups"]:
  42.                     for ip_per in sec_grp["IpPermissions"]:
  43.                          for cidr in ip_per["IpRanges"]:
  44.                            if cidr  ==  public_cidr:
  45.                              if ip_per.get("FromPort"):
  46.                                 ports.add(ip_per["FromPort"])
  47.                              else:
  48.                                 ports.add('ALL')
  49. # Print instance details if it has open ports
  50.             if len(ports)==0 :
  51.                 ports.add('----')
  52.             ports = ",".join(repr(e) for e in ports).replace("'","")
  53.             instance_name="----"
  54.             if instance. get("Tags"):
  55.                for tag in instance["Tags"]:
  56.                    if tag["Key"]=="Name":
  57.                       instance_name=tag["Value"]
  58.             html_body_inner = html_body_inner + ("<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td bgcolor=white>%s</td><td>%s</td><td bgcolor=white>%s</td></tr>"%(count,regname['RegionName'],instance["InstanceId"],instance_name,instance["InstanceType"],ports,instance["LaunchTime"].date()))
  59. # Create HTML Report
  60.             html_body ="<! DOCTYPE html><html><body>"
  61.             html_body = html_body + ("<h3>Total number of running instances: %s</h3>" %(count))
  62.             html_body = html_body + '<table border="1" CELLPADDING=1 CELLSPACING=0 width="86%"><col width="2%"><col width="13%"><col width="17%"><colwidth="14%"><col width="5%"><col width="15%"><col width="10%"><col width="10%"><tr bgcolor="#5BAAF5"><th><font color="# fff">Sr.</font></th><th><font color="# fff">Region</font></th><th><font color="# fff">Instance Id</font></th><th><font color="# fff">Instance Name</font></th><th><font color="# fff">Type</font></th><th><font color="# fff">Publicly Open Ports</font></th><th><font color="# fff">Launch Date</font></th></tr>'
  63.             html_body = html_body + html_body_inner + '</table></body></html>'
  64. # Send email notification ses=boto3.client('ses')
  65.     #body = html_body
  66.     #body = MIMEText(body, 'HTML','utf-8')
  67.     #body  = MIMEText(body,_subtype='html',_charset='gb2312')
  68.     #body.replace_header('content-transfer-encoding', 'quoted-printable')
  69.     #subject = Header(subject, 'utf-8')
  70.     body = MIMEText(html_body, 'html', 'utf-8')
  71.     body = body.as_string()
  72.     success = send_email(host, port, username, password, subject, body, mail_to, mail_from, reply_to)


  73. def send_email(host, port, username, password, subject, body, mail_to, mail_from = None, reply_to = None):
  74.     if mail_from is None: mail_from = username
  75.     if reply_to is None: reply_to = mail_to

  76.     #message = """From: %s\nTo: %s\nReply-To: %s\nSubject: %s\n\n%s""" % (mail_from, mail_to, reply_to, subject, body)
  77.     #print (message)
  78.     try:
  79.         server = smtplib.SMTP(host, port)
  80.         server.ehlo()
  81.         server.starttls()
  82.         server.login(username, password)
  83.         server.sendmail(mail_from, mail_to, body)
  84.         server.close()
  85.         return True
  86.     except Exception as ex:
  87.         print (ex)
  88.         return False
复制代码


2.2
发件人用户名密码,smtp地址、端口,收件人地址通过环境变量传入
    MAIL_FROM
    MAIL_TO
PASSWORD
SMTPHOST
SMTPPORT
USERNAME
image3.png

3   创建cloud watch event
Cron表达式 格式为 分 、时、日、月、周、年
Timezone 为 UTC
如图设定为每天早上10:27发送(北京时间)
image4.png


转播转播
回复

使用道具

联系楼主
*
*
客户公司所在区域:
*
产品:
*
简述客户的业务场景和需求
*
*
*

6

主题

14

帖子

197

积分

超级版主

Rank: 8Rank: 8

积分
197
超级管理员 发表于 2019-8-9 10:07:01
确实是干货
回复

使用道具 举报

0

主题

11

帖子

179

积分

注册会员

Rank: 2

积分
179
光环盟主 发表于 2019-8-16 11:46:12
感谢分享!
回复

使用道具 举报

0

主题

11

帖子

179

积分

注册会员

Rank: 2

积分
179
光环盟主 发表于 2019-8-19 10:50:05
Thank you!
回复

使用道具 举报

B Color Link Quote Code Smilies
光环云社区 |京ICP备18044167号-13|

京公网安备 11010102003758号