如何在Go编写的AWS Lambda中读取调用者的STS会话标签?
能否在Go语言编写的AWS Lambda中获取调用者的STS会话标签?
可以实现,你需要结合AWS STS API和Lambda的执行上下文来获取并读取调用者的STS会话标签,具体步骤如下:
前提条件
确保Lambda的执行角色拥有sts:GetCallerIdentity和sts:GetSessionTags的IAM权限,否则无法调用相关API获取会话信息。
实现步骤与代码示例
- 加载AWS配置,创建STS客户端
- 调用
GetCallerIdentity获取调用者的身份ARN,从中提取会话ID - 调用
GetSessionTags传入会话ID,读取已设置的标签
package main import ( "context" "fmt" "strings" "github.com/aws/aws-lambda-go/lambda" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/service/sts" ) func handler(ctx context.Context) error { // 加载默认AWS配置 cfg, err := config.LoadDefaultConfig(ctx) if err != nil { return fmt.Errorf("加载配置失败: %v", err) } // 初始化STS客户端 stsClient := sts.NewFromConfig(cfg) // 获取调用者身份信息 callerResp, err := stsClient.GetCallerIdentity(ctx, &sts.GetCallerIdentityInput{}) if err != nil { return fmt.Errorf("获取调用者身份失败: %v", err) } // 从ARN中解析会话ID(ARN格式示例:arn:aws:sts::123456789012:assumed-role/MyRole/MySession) arnSegments := strings.Split(*callerResp.Arn, "/") if len(arnSegments) < 3 { return fmt.Errorf("调用者ARN格式无效") } sessionID := arnSegments[len(arnSegments)-1] // 获取会话标签 tagsResp, err := stsClient.GetSessionTags(ctx, &sts.GetSessionTagsInput{ SessionId: aws.String(sessionID), }) if err != nil { return fmt.Errorf("获取会话标签失败: %v", err) } // 输出会话标签 fmt.Println("STS会话标签:") for _, tag := range tagsResp.Tags { fmt.Printf("%s: %s\n", *tag.Key, *tag.Value) } return nil } func main() { lambda.Start(handler) }
注意事项
- 只有当Lambda的调用者身份是STS临时会话(带标签)时,
GetCallerIdentity返回的ARN才会包含会话ID,否则无法提取有效会话信息 - 确保IAM策略中给Lambda执行角色添加了允许调用
sts:GetCallerIdentity和sts:GetSessionTags的权限,策略示例:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "sts:GetCallerIdentity", "sts:GetSessionTags" ], "Resource": "*" } ] }
内容的提问来源于stack exchange,提问作者dolan
相关产品推荐
相关产品推荐

