如何修改AWS Lambda代码将账户IP报表直接发送至邮箱?
直接通过AWS Lambda发送IP报告Excel到邮箱的实现方案
必要前提
- 在AWS SES中验证你的发件邮箱(沙箱模式下,收件邮箱也需要验证)
- 给Lambda执行角色添加
ses:SendRawEmail权限(可通过IAM策略配置)
修改代码步骤
你原代码已成功生成Excel文件,只需把上传S3的部分替换为SES发送邮件的逻辑即可:
- 移除S3相关的导入和上传代码
- 添加SES客户端初始化
- 读取生成的Excel文件,编码成base64作为邮件附件
- 构造符合RFC格式的邮件内容,包含附件
修改后的完整代码
import boto3 import ipaddress import xlsxwriter import base64 from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase from email.mime.text import MIMEText from email.utils import formatdate from email import encoders def lambda_handler(event, context): ec2 = boto3.client('ec2') ses = boto3.client('ses', region_name='us-east-1') # 替换为你的SES区域 # 创建Excel工作簿 workbook = xlsxwriter.Workbook('/tmp/ip_report.xlsx') worksheet = workbook.add_worksheet() # 定义单元格格式 bold_format = workbook.add_format({'bold': True}) percentage_format = workbook.add_format({'num_format': '0.00%'}) # 获取所有VPC vpcs = ec2.describe_vpcs() # 初始化行计数器 row = 0 # 写入表头 worksheet.write(row, 0, 'VPC Name', bold_format) worksheet.write(row, 1, 'Subnet Name', bold_format) worksheet.write(row, 2, 'Total IPs', bold_format) worksheet.write(row, 3, 'Available IPs', bold_format) worksheet.write(row, 4, 'IP Count', bold_format) worksheet.write(row, 5, 'IP Usage Percentage', bold_format) row += 1 for vpc in vpcs['Vpcs']: vpc_id = vpc['VpcId'] vpc_name = vpc.get('Tags', [{'Key': 'Name', 'Value': 'N/A'}])[0]['Value'] # 获取VPC下的子网 subnets = ec2.describe_subnets(Filters=[{'Name': 'vpc-id', 'Values': [vpc_id]}]) awsReservationIPCount = 5 for subnet in subnets['Subnets']: subnet_name = subnet.get('Tags', [{'Key': 'Name', 'Value': 'N/A'}])[0]['Value'] cidr_block = subnet['CidrBlock'] # 计算子网总IP数 total_ips = sum(1 for _ in ipaddress.IPv4Network(cidr_block)) ip_count = total_ips - awsReservationIPCount available_ips = subnet['AvailableIpAddressCount'] # 计算IP使用率 if total_ips > 0: ip_usage_percentage = (1 - available_ips / total_ips) else: ip_usage_percentage = 0 # 写入数据到Excel worksheet.write(row, 0, vpc_name) worksheet.write(row, 1, subnet_name) worksheet.write(row, 2, total_ips) worksheet.write(row, 3, available_ips) worksheet.write(row, 4, ip_count) worksheet.write(row, 5, ip_usage_percentage, percentage_format) row += 1 # 关闭工作簿 workbook.close() # 构造邮件 sender = 'your-verified-email@example.com' # 替换为SES验证过的发件邮箱 recipient = 'recipient-email@example.com' # 替换为收件邮箱(沙箱模式下需验证) subject = 'AWS IP地址使用报告' body_text = '您好,附件是最新的AWS账户IP地址使用情况报告。' # 创建多部分邮件 msg = MIMEMultipart() msg['From'] = sender msg['To'] = recipient msg['Date'] = formatdate(localtime=True) msg['Subject'] = subject # 添加文本内容 msg.attach(MIMEText(body_text, 'plain', 'utf-8')) # 添加Excel附件 with open('/tmp/ip_report.xlsx', 'rb') as f: part = MIMEBase('application', 'vnd.openxmlformats-officedocument.spreadsheetml.sheet') part.set_payload(f.read()) encoders.encode_base64(part) part.add_header('Content-Disposition', 'attachment', filename='ip_report.xlsx') msg.attach(part) # 发送邮件 try: response = ses.send_raw_email( Source=sender, Destinations=[recipient], RawMessage={'Data': msg.as_string()} ) print(f"邮件发送成功,Message ID: {response['MessageId']}") return { 'statusCode': 200, 'body': 'IP可用性报告已生成并发送至指定邮箱。' } except Exception as e: print(f"邮件发送失败: {str(e)}") return { 'statusCode': 500, 'body': f'邮件发送失败: {str(e)}' }
关键配置说明
- 替换代码中的
region_name为你的SES实际区域(如ap-southeast-1) - 替换
sender和recipient为真实邮箱,沙箱模式下收件邮箱必须经过SES验证 - Lambda执行角色需包含以下IAM策略(示例):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ses:SendRawEmail", "Resource": "*" }, { "Effect": "Allow", "Action": ["ec2:DescribeVpcs", "ec2:DescribeSubnets"], "Resource": "*" } ] }
注意事项
- SES沙箱模式下仅能发送到验证过的邮箱,需发送至任意邮箱需申请移出沙箱
- Lambda的
/tmp目录最大容量为512MB,确保生成的Excel文件不超出限制 - 邮件总大小(含附件)默认不能超过SES的10MB限制
内容的提问来源于stack exchange,提问作者FlameBoy
相关产品推荐
相关产品推荐

