如何通过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
相关产品推荐
相关产品推荐

