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

Python append操作无效 遍历填充后字典列表始终为空问题

问题原因

两个直接bug导致结果不符合预期:

  • Message = str(return_value) 执行时机错误。这行写在EC2实例遍历逻辑之前,此时字典内所有列表都是空的,字符串生成后不会随字典内容更新自动变化,后续SNS发送的永远是初始化阶段的空字典内容。
  • 列表追加逻辑写法错误。Python中list.append()是原地修改列表的方法,返回值为None,你写的return_value['xxx'] = return_value['xxx'] + [return_value['xxx'].append(missingtag)] 属于画蛇添足:先把元素追加进列表,再把原列表和[None]拼接后重新赋值,反而破坏了列表结构,完全不需要额外拼接。
修复方法
  1. 将Message = str(return_value)移动到所有实例遍历逻辑执行完成、调用SNS发布接口之前,确保读取的是填充完成的最终结果。
  2. 删掉所有错误的列表拼接写法,直接调用append()方法添加元素即可。
  3. 同步修复代码里的其他潜在问题:
    • 修正合法标签分支的打印文案错误(原代码误写为"unknown builder tag value",和实际逻辑不符)
    • 增加实例无Tags字段的兜底判断,避免刚创建的无标签实例触发KeyError导致Lambda运行失败
    • 删掉冗余的模块导入和重复的boto3客户端/资源初始化,减少Lambda冷启动耗时
    • 简化最后一个标签分支的重复判断:前面分支已经覆盖了标签缺失、空值、unknown值、合法值的场景,剩余非法值情况直接走else即可
    • 修正拼写错误:Dectected改为Detected

修复后的完整可运行代码如下:

import boto3   
from botocore.exceptions import ClientError

ec = boto3.client('ec2', 'us-east-1')     
sns_client = boto3.client('sns', 'us-east-1')

def lambda_handler(event, context):           
    reservations = ec.describe_instances().get('Reservations', [])
    
    # 初始化结果字典
    return_value = {
        'missingtagkeys': [],
        'missingtagvalues': [],
        'incorrecttagvalues': [],
        'unknowntagvalues': [],
        'correcttags': []
    }
        
    TopicArn = 'arn:aws:sns'
    Subject = 'Incorrect Tags Detected'
          
    buildertag = [{
        "Key": "builder",
        "Value": "unknown"
    }]
    
    for reservation in reservations:
        for instance in reservation['Instances']:
            tags = {}
            # 兜底处理无标签的实例
            if 'Tags' in instance:
                for tag in instance['Tags']:
                    tags[tag['Key']] = tag['Value']
            
            instance_id = instance['InstanceId']
            # 标签校验逻辑
            if 'builder' not in tags:
                msg = f"{instance_id} does not have builder tag. Adding 'builder' tag with value of 'unknown'."
                print(msg)
                ec.create_tags(Resources=[instance_id], Tags=buildertag)
                return_value['missingtagkeys'].append(msg)

            elif tags['builder'] == '':
                msg = f"{instance_id} has no value for builder tag."
                print(msg)
                ec.create_tags(Resources=[instance_id], Tags=buildertag)
                return_value['missingtagvalues'].append(msg)
                                        
            elif tags['builder'] == 'unknown':
                msg = f"{instance_id} has an unknown builder tag value."
                print(msg)
                return_value['unknowntagvalues'].append(msg)   

            elif tags['builder'] in ['a', 'b', 'c', 'd', 'e']:
                msg = f"{instance_id} has approved builder tags."
                print(msg)
                return_value['correcttags'].append(msg)   
                
            else:
                msg = f"{instance_id} has an incorrect builder tag value."
                print(msg)
                return_value['incorrecttagvalues'].append(msg)
    
    # 所有遍历完成后再生成消息内容
    Message = str(return_value)
    sns_client.publish(
        TopicArn=TopicArn,
        Subject=Subject,
        Message=Message
    )
    return return_value

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 11:36:20