获取无标签/标签为空的EC2卷:SNS仅发送最后一个卷ID求助
问题修复方案
先看你代码里的几个关键问题:
vol_id = []放在了if分支里,每次找到符合条件的卷时都会重置列表,之前的ID全丢了,最后只剩最后一个vol_id.append(vol.id)不在条件判断范围内,不管卷是否符合要求都会被加入列表,而且当vol.tags为空时,还会因为未初始化vol_id报错- 发送消息时用了
vol.id遍历,这是单个字符串,会把每个字符拆出来拼接,完全不符合预期
修正后的代码:
import boto3 def lambda_handler(event, context): # 初始化EC2资源和SNS客户端,放在函数内部更稳妥 ec2 = boto3.resource('ec2') sns_client = boto3.client('sns') sns_arn = 'SNS ARN' # 提前初始化空列表,避免循环里重置 missing_tags_volumes = [] volumes = ec2.volumes.all() for vol in volumes: # 先判断标签是否存在 if vol.tags is None: missing_tags_volumes.append(vol.id) print(vol.id) else: # 检查是否有custName标签 tag_keys = [tag['Key'] for tag in vol.tags] if 'custName' not in tag_keys: missing_tags_volumes.append(vol.id) print(vol.id) # 只有当有符合条件的卷时才发送SNS,避免空消息 if missing_tags_volumes: # 把卷ID用换行拼接成易读的消息 message = "以下EC2卷缺少custName标签或无标签:\n" + "\n".join(missing_tags_volumes) response = sns_client.publish( TopicArn=sns_arn, Message=message, Subject='EC2缺少必填标签' )
修改点说明:
- 把
missing_tags_volumes列表初始化放在循环外,确保所有符合条件的卷ID都能被累积 - 调整条件判断逻辑,先处理无标签的情况,再处理有标签但缺少custName的情况,逻辑更清晰
- SNS客户端初始化移到函数内部,Lambda环境里这种方式更规范,避免冷启动时的潜在问题
- 消息内容用列表生成,把所有卷ID拼接成易读的格式,还加了判断,没有问题卷时不发消息
- 变量名更清晰,比如
sns_arn、missing_tags_volumes,比原来的vol_id更容易理解
内容的提问来源于stack exchange,提问作者Ritwik Raman
相关产品推荐
相关产品推荐

