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

AWS Lambda Python解析Config触发事件JSON遇字符串索引错误求助

问题解决:解析JSON字符串并实现IAM用户自动删除

核心错误修复

你遇到的「string indices must be integers」错误,本质是**event['invokingEvent']是JSON格式的字符串,而非字典**,直接用字典索引访问自然会报错。解决方法是先用json.loads()将其解析为Python字典,再进行字段访问。

完整实现代码

以下是修正后的Lambda代码,包含用户身份校验、用户删除的完整逻辑:

import json
import boto3
import logging

# 配置日志
logger = logging.getLogger()
logger.setLevel(logging.INFO)

# 初始化IAM客户端
iam = boto3.client('iam')

# 替换为你自己的IAM用户名(或ARN,根据校验需求调整)
ALLOWED_CREATOR = 'your-own-iam-username'

def lambda_handler(event, context):
    try:
        # 1. 解析invokingEvent字符串为字典
        invoking_event = json.loads(event['invokingEvent'])
        
        # 2. 校验事件类型是否为IAM用户创建
        change_type = invoking_event['configurationItemDiff']['changeType']
        if change_type != 'CREATE':
            logger.info(f"非创建用户事件,类型为{change_type},跳过处理")
            return
        
        # 3. 获取新创建的IAM用户名
        new_user_name = invoking_event['configurationItem']['resourceName']
        logger.info(f"检测到新创建的IAM用户:{new_user_name}")
        
        # 4. 获取事件创建者身份(根据实际EventBridge事件结构调整)
        # 注:可根据你的事件结构从event['detail']或invokingEvent的其他字段提取更精确的身份信息
        creator = invoking_event['configurationItem']['awsAccountId']
        
        # 5. 校验创建者是否为允许的用户
        if creator != ALLOWED_CREATOR:
            logger.warning(f"创建者{creator}非授权用户,将删除用户{new_user_name}")
            
            # 5.1 先移除用户所在的所有组
            groups = iam.list_groups_for_user(UserName=new_user_name)['Groups']
            for group in groups:
                iam.remove_user_from_group(GroupName=group['GroupName'], UserName=new_user_name)
                logger.info(f"已将用户{new_user_name}从组{group['GroupName']}移除")
            
            # 5.2 删除IAM用户
            iam.delete_user(UserName=new_user_name)
            logger.info(f"已成功删除非授权用户{new_user_name}")
        else:
            logger.info(f"创建者为授权用户{ALLOWED_CREATOR},保留用户{new_user_name}")
            
    except Exception as e:
        logger.error(f"处理事件时出错:{str(e)}")
        raise e

关键说明

  • JSON解析:必须通过json.loads(event['invokingEvent'])将字符串转为字典,才能正常访问内部字段。
  • 身份校验:示例中使用账号ID作为校验依据,实际可根据需求改用ARN、用户名等更精准的标识,需匹配你的EventBridge事件中携带的创建者信息。
  • 用户删除步骤:删除IAM用户前需先将其从所有组中移除,否则会触发报错;若用户存在访问密钥、登录资料等,可额外添加delete_access_key、delete_login_profile等逻辑完善清理流程。

关于SNS的疑问

不需要使用SNS:你的场景是Lambda直接由EventBridge触发并执行删除逻辑,SNS的作用是消息通知(如发送告警邮件),属于可选增强功能,而非实现核心需求的必要组件。如果需要在删除用户时收到通知,可以在Lambda中添加SNS客户端调用发送消息,但不影响核心逻辑的运行。

内容的提问来源于stack exchange,提问作者Pyg Argus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 13:50:19