Golang中如何正确使用AWS SDK Go V2的STS重试功能
Golang中如何正确使用AWS SDK Go V2的STS重试功能
我有一个函数,本应检查在.aws/credentials下设置的凭据,但它不工作,所以我尝试添加一些重试函数,但它仍然不工作。凭据设置是正确的,因为如果我在不运行此函数的情况下执行aws sts get-caller-identity命令,它是可以工作的。我的代码中重试功能不工作,可能是什么问题?
ctx := context.TODO()
cfg, err := config.LoadDefaultConfig(ctx, config.WithRegion("eu-central-1"))
if err != nil {
log.Fatalf("failed to load configuration, %v", err)
}
client1 := sts.NewFromConfig(cfg)
customRetry := retry.NewStandard(func(o *retry.StandardOptions) {
o.MaxAttempts = 60
})
identity, err3 := client1.GetCallerIdentity(ctx, &sts.GetCallerIdentityInput{}, func(o *sts.Options) {
o.Retryer = customRetry
})
if err3 != nil {
log.Fatal(err3)
}
log.Printf("Account: %s, Arn: %s", aws.ToString(identity.Account), aws.ToString(identity.Arn))
更多关于Golang中如何正确使用AWS SDK Go V2的STS重试功能的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于Golang中如何正确使用AWS SDK Go V2的STS重试功能的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你的代码中重试功能可能不工作的主要原因是STS客户端的配置方式。在AWS SDK Go V2中,重试器需要在创建客户端时通过配置选项设置,而不是在单个API调用中设置。以下是修正后的代码:
package main
import (
"context"
"log"
"github.com/aws/aws-sdk-go-v2/aws"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/credentials/stscreds"
"github.com/aws/aws-sdk-go-v2/service/sts"
"github.com/aws/aws-sdk-go-v2/aws/retry"
)
func main() {
ctx := context.TODO()
// 创建自定义重试器
customRetry := retry.NewStandard(func(o *retry.StandardOptions) {
o.MaxAttempts = 60
o.MaxBackoff = 30 // 可选:设置最大退避时间
})
// 在加载配置时设置重试器
cfg, err := config.LoadDefaultConfig(ctx,
config.WithRegion("eu-central-1"),
config.WithRetryer(func() aws.Retryer {
return customRetry
}),
)
if err != nil {
log.Fatalf("failed to load configuration, %v", err)
}
// 使用配置创建STS客户端
client := sts.NewFromConfig(cfg)
// 调用GetCallerIdentity
identity, err := client.GetCallerIdentity(ctx, &sts.GetCallerIdentityInput{})
if err != nil {
log.Fatalf("failed to get caller identity: %v", err)
}
log.Printf("Account: %s, Arn: %s", aws.ToString(identity.Account), aws.ToString(identity.Arn))
}
如果你的凭据问题仍然存在,可以添加显式的凭据提供链:
cfg, err := config.LoadDefaultConfig(ctx,
config.WithRegion("eu-central-1"),
config.WithRetryer(func() aws.Retryer {
return customRetry
}),
config.WithCredentialsProvider(aws.NewCredentialsCache(
stscreds.NewAssumeRoleProvider(
sts.NewFromConfig(cfg),
"arn:aws:iam::123456789012:role/YourRole",
),
)),
)
对于更细粒度的重试控制,可以使用retry.AddWithErrorCodes:
customRetry := retry.NewStandard(func(o *retry.StandardOptions) {
o.MaxAttempts = 60
o.Retryables = append(o.Retryables,
retry.AddWithErrorCodes(retry.RetryableError{},
"ExpiredTokenException",
"RequestLimitExceeded",
),
)
})
确保你的AWS配置文件正确设置:
# ~/.aws/credentials
[default]
aws_access_key_id = YOUR_ACCESS_KEY
aws_secret_access_key = YOUR_SECRET_KEY
# ~/.aws/config
[default]
region = eu-central-1
如果问题仍然存在,启用SDK的调试日志来查看详细的请求和错误信息:
cfg, err := config.LoadDefaultConfig(ctx,
config.WithRegion("eu-central-1"),
config.WithClientLogMode(aws.LogRetries|aws.LogRequest|aws.LogResponse),
config.WithRetryer(func() aws.Retryer {
return customRetry
}),
)

