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

EC2实例标签转字典正常,IAM用户标签报错,语法是否有误?

问题

我有一段处理EC2标签的代码可正常运行,但对标签转字典的逻辑存在疑惑:

  1. 代码先执行tags = instance['Tags'],接着又执行tags = {x['Key']: x['Value'] for x in tags},为何重复赋值tags不会触发“string indices must be integers”类错误?
  2. 将相同逻辑应用到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 15:48:22