You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 19:47:34