如何通过AWS SNS批量发送Lambda生成的无MFA用户列表至邮箱
解决AWS Lambda批量发送未启用MFA用户列表到SNS的问题
修改后的完整代码
import boto3 def lambda_handler(event, context): # 初始化SNS资源 sns_resource = boto3.resource('sns') TOPIC_ARN = 'sns_topic_arn' sns_topic = sns_resource.Topic(TOPIC_ARN) # 初始化IAM资源 iam = boto3.resource('iam') users = iam.users.all() # 收集所有未启用MFA的用户 non_mfa_users = [] for user in users: has_mfa = any(user.mfa_devices.all()) if not has_mfa: non_mfa_users.append(user.name) # 生成消息内容 if non_mfa_users: message = "以下IAM用户未启用MFA:\n" + "\n".join([f"- {username}" for username in non_mfa_users]) else: message = "当前没有未启用MFA的IAM用户。" # 一次性发送邮件 sns_topic.publish(Message=message) return { 'statusCode': 200, 'body': f"已发送包含{len(non_mfa_users)}个未启用MFA用户的通知" }
关键修改说明
- 新增
non_mfa_users列表专门存储所有未启用MFA的用户名,避免循环结束后仅保留最后一个用户的信息 - 把所有用户整理成易读的项目符号列表,生成统一的消息内容后一次性发送
- 增加空列表判断,避免发送无意义的空内容通知
原代码问题分析
- 循环外调用
publish时,user变量指向的是循环最后一次迭代的用户,因此只会发送该用户的名字 - 循环内调用
publish会为每个用户单独发送一封邮件,不符合批量汇总发送的需求
内容的提问来源于stack exchange,提问作者Richard Alves de Oliveira
相关产品推荐
相关产品推荐

