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
    }),
)
回到顶部