EC2实例标签转字典正常,IAM用户标签报错,语法是否有误?
问题
我有一段处理EC2标签的代码可正常运行,但对标签转字典的逻辑存在疑惑:
- 代码先执行
tags = instance['Tags'],接着又执行tags = {x['Key']: x['Value'] for x in tags},为何重复赋值tags不会触发“string indices must be integers”类错误? - 将相同逻辑应用到IAM用户标签时代码无法运行,EC2与IAM的标签处理本质是否不同?
EC2 可运行代码示例
import boto3 ec2 = boto3.client('ec2') data = ec2.describe_instances() reservations = data['Reservations'] for reservation in reservations: for instance in reservation['Instances']: tags = instance['Tags'] # Convert the tag list to a Python dictionary to make looking up tags easier tags = {x['Key']: x['Value'] for x in tags} print(tags)
IAM 报错代码示例
iam_client = boto3.client('iam') response = iam_client.list_users() def lambda_handler(event,context): for user in response['Users']: tags = iam_client.list_user_tags(UserName = user['UserName']) tags = {x['Key']: x['Value'] for x in tags} if tags['Tags']: for tag in tags['Tags']: print(tags)
解答
1. EC2代码重复赋值不报错的原因
EC2的instance['Tags']返回的是由字典组成的列表,结构示例如下:
[{'Key': 'Name', 'Value': 'MyEC2'}, {'Key': 'Env', 'Value': 'Prod'}]
第一次赋值tags = instance['Tags']后,tags指向这个列表。第二次用字典推导式遍历tags时,每个x都是列表里的单个字典,自然可以通过x['Key']和x['Value']取值,不会触发字符串索引错误——因为这里的x是字典,不是字符串。
2. IAM代码报错的核心原因:API返回结构不同
IAM的list_user_tags()接口返回的不是直接的标签列表,而是一个包含标签列表的顶层字典,结构示例如下:
{ 'Tags': [{'Key': 'Dept', 'Value': 'Dev'}, {'Key': 'Role', 'Value': 'Admin'}], 'IsTruncated': False }
你原来的代码直接把整个响应字典赋值给tags,然后用for x in tags遍历——此时遍历的是字典的键(比如'Tags'、'IsTruncated'这些字符串),x变成字符串后再调用x['Key'],自然会报“string indices must be integers”的错误。
修正后的IAM代码
需要先从响应里取出Tags列表,再做字典推导:
import boto3 iam_client = boto3.client('iam') def lambda_handler(event, context): response = iam_client.list_users() for user in response['Users']: # 先取出标签列表 tag_response = iam_client.list_user_tags(UserName=user['UserName']) tag_list = tag_response['Tags'] # 转成字典 tags_dict = {x['Key']: x['Value'] for x in tag_list} print(tags_dict)
总结:EC2和IAM标签处理的本质差异
- EC2在
describe_instances的返回结果里,直接把标签列表嵌套在Instance字典的Tags字段中; - IAM需要单独调用
list_user_tags接口,且返回结果是一个包含标签列表的顶层字典,必须先提取Tags字段才能处理。
内容的提问来源于stack exchange,提问作者skyfire123
相关产品推荐
相关产品推荐

