Lambda优化:将循环输出转为字典实现单封邮件批量发送
解决IAM用户密码过期批量通知问题
Nick,我来帮你搞定这个批量通知的问题!原来的代码会给每个符合条件的用户单独发SNS邮件,我们只需要先把所有目标用户的信息收集起来,最后一次性发送汇总邮件就可以了。我帮你修改了代码,同时还优化了一些细节问题,比如时区处理和Lambda handler参数顺序:
import boto3 import datetime from dateutil.tz import tzutc # 合并重复导入,减少冗余 sts_client = boto3.client('sts') assumed_role_object = sts_client.assume_role( RoleArn="arn:aws:iam::9999999999:role/role", RoleSessionName="AssumedRoleSession2" ) credentials = assumed_role_object['Credentials'] iam_resource = boto3.resource( 'iam', aws_access_key_id=credentials['AccessKeyId'], aws_secret_access_key=credentials['SecretAccessKey'], aws_session_token=credentials['SessionToken'], ) sns_client = boto3.client('sns') def lambda_handler(event, context): # 修正参数顺序:Lambda handler标准格式是(event, context) today = datetime.datetime.now(tzutc()) # 使用UTC时间,和AWS返回的时间保持一致,避免时区偏差 expired_users = [] # 初始化列表,用来统一存储所有符合条件的用户信息 for user in iam_resource.users.all(): if user.password_last_used is not None: # 直接计算带时区的时间差,无需手动移除时区信息 delta = (today - user.password_last_used).days if delta >= 90: # 将用户信息以字典形式存入列表,方便后续格式化消息 expired_users.append({ "username": user.user_name, "days_unused": delta }) # 保留日志打印,方便调试查看 print(f"Username: {user.user_name}, 未使用天数: {delta}") # 只有存在符合条件的用户时,才发送汇总邮件 if expired_users: # 生成易读的邮件内容格式 message_lines = ["以下是密码超过90天未使用的IAM用户列表:\n"] for user_info in expired_users: message_lines.append(f"- *{user_info['username']}*: 密码未使用 {user_info['days_unused']} 天") sns_message = "\n".join(message_lines) response = sns_client.publish( TopicArn='arn:aws:sns:eu-west-2:1111111111:topic', Message=sns_message, Subject='【批量通知】密码超过90天未使用的IAM用户', ) print(f"已发送汇总邮件,共包含 {len(expired_users)} 个用户") else: print("没有找到密码超过90天未使用的IAM用户")
关键改动说明:
- 统一收集再发送:用
expired_users列表存储所有目标用户数据,循环结束后只调用一次sns.publish,避免批量发送多封邮件 - 修正时区偏差:使用UTC时间计算天数差,和AWS IAM返回的
password_last_used时区保持一致,避免本地时间导致的计算错误 - 修正handler参数顺序:标准Lambda handler参数为
(event, context),原顺序反了可能导致运行异常 - 优化消息可读性:用Markdown列表格式化邮件内容,让收件人更清晰地查看用户信息
- 添加空值判断:如果没有符合条件的用户,不会发送邮件,同时打印日志说明情况
这样修改后,你就能收到一封包含所有符合条件用户信息的汇总邮件啦!
内容的提问来源于stack exchange,提问作者Nick Barton-Wells
相关产品推荐
相关产品推荐

