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

如何通过AWS Golang SDK V2 IAM服务判断用户是否为根用户

使用AWS Golang SDK V2筛选非根用户并执行操作

核心说明

AWS IAM的根用户不会出现在ListUsers API的返回结果中,该API仅返回你创建的IAM用户。但如果需要通过用户ARN或ID判断是否为根用户,可以通过以下特征识别:

  • 根用户的ARN格式为:arn:aws:iam::<账户ID>:root
  • 根用户的用户ID等于你的AWS账户ID

实现代码

首先确保你已安装AWS Golang SDK V2的IAM模块:

go get github.com/aws/aws-sdk-go-v2/service/iam

以下是完整示例代码,包含列出IAM用户、判断根用户(针对可能的外部用户信息)并执行特定操作:

package main

import (
	"context"
	"fmt"
	"github.com/aws/aws-sdk-go-v2/aws"
	"github.com/aws/aws-sdk-go-v2/config"
	"github.com/aws/aws-sdk-go-v2/service/iam"
	"github.com/aws/aws-sdk-go-v2/service/iam/types"
)

// IsRootUser 判断用户是否为AWS根用户
func IsRootUser(user types.User) bool {
	// 根用户ARN以":root"结尾
	if arn := aws.ToString(user.Arn); arn != "" {
		return len(arn) > 5 && arn[len(arn)-5:] == ":root"
	}
	return false
}

func main() {
	// 加载AWS配置
	cfg, err := config.LoadDefaultConfig(context.TODO())
	if err != nil {
		panic(fmt.Sprintf("加载配置失败: %v", err))
	}

	// 创建IAM客户端
	client := iam.NewFromConfig(cfg)

	// 调用ListUsers API获取所有IAM用户
	input := &iam.ListUsersInput{}
	paginator := iam.NewListUsersPaginator(client, input)

	for paginator.HasMorePages() {
		page, err := paginator.NextPage(context.TODO())
		if err != nil {
			panic(fmt.Sprintf("获取用户列表失败: %v", err))
		}

		// 遍历用户列表,仅对非根用户执行操作
		for _, user := range page.Users {
			// 由于ListUsers不会返回根用户,此处判断为冗余逻辑,但适用于从其他来源获取的用户信息
			if !IsRootUser(user) {
				fmt.Printf("对非根用户执行操作: %s\n", aws.ToString(user.UserName))
				// 在此添加你的特定操作逻辑,比如修改权限、添加标签等
			}
		}
	}
}

补充说明

如果需要通过账户ID精准判断根用户,可以调用STS的GetCallerIdentity API获取当前账户ID,再对比用户ID:

import "github.com/aws/aws-sdk-go-v2/service/sts"

// getAccountID 获取当前AWS账户ID
func getAccountID(cfg aws.Config) (string, error) {
	stsClient := sts.NewFromConfig(cfg)
	result, err := stsClient.GetCallerIdentity(context.TODO(), &sts.GetCallerIdentityInput{})
	if err != nil {
		return "", err
	}
	return aws.ToString(result.Account), nil
}

修改IsRootUser函数,传入账户ID进行对比:

func IsRootUser(user types.User, accountID string) bool {
	if arn := aws.ToString(user.Arn); arn != "" {
		return len(arn) > 5 && arn[len(arn)-5:] == ":root"
	}
	return aws.ToString(user.UserId) == accountID
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 19:50:23