如何 运行 AWS SDK version 2 with credentials from variables?

How to run AWS SDK version 2 with credentials from variables?

我的问题与另一个问题相同: 但我使用的是不再使用 Session 的 SDK 版本 2(如果我理解正确的话)。

因此,我正在创建一个新客户端,并且我将凭据作为变量。我需要使用 IAM 服务。这是函数:

func getIAMClient(ctx context.Context) (*iam.Client, error) {
    cfg, err := config.LoadDefaultConfig(ctx, config.WithRegion("no-region"))
    if err != nil {
        return nil, errors.Wrap(err)
    }

    cfg.HTTPClient, err = getHTTPClient(ctx)
    if err != nil {
        return nil, err
    }

    return iam.NewFromConfig(cfg), nil
}

不同的用户会同时使用该应用程序,所以我不能只使用 ENV 文件,但我一直无法找到说明如何将这些凭据传递给我的客户端的文档页面。任何支持将不胜感激!

这可以通过 StaticCredentialsProvider as described in section "Static Credentials" of the AWS SDK for Go V2 documentation:

来实现
cfg, err := config.LoadDefaultConfig(ctx, config.WithCredentialsProvider(credentials.NewStaticCredentialsProvider("AKID", "SECRET_KEY", "TOKEN")))

要从运行时变量初始化配置,可以使用credentials.NewStaticCredentialsProvider:

staticProvider := credentials.NewStaticCredentialsProvider(
    accessKey, 
    secretKey, 
    sessionToken,
)
cfg, err := config.LoadDefaultConfig(
    context.Background(), 
    config.WithCredentialsProvider(staticProvider),
)
if err != nil {
    return nil, err
}
client := iam.New(cfg)

但是 AWS SDK 文档正确 reminds 你认为:

Do not embed credentials inside an application. Use this method only for testing purposes.

这是因为通常使用静态凭据的代码片段会传递硬编码字符串,这显然是一个安全问题。在您的情况下,您正在尝试传递运行时变量,因此只要这些变量未与您的应用程序源签入,就应该没问题。


对于一般用例,即环境变量,您可以使用external.LoadDefaultAWSConfig,它会按以下顺序自动查找:

  • 环境变量
  • 共享配置和共享凭据文件。
// import "github.com/aws/aws-sdk-go-v2/aws/external"

    cfg, err := external.LoadDefaultAWSConfig(external.WithRegion(region))
    if err != nil {
        return nil, err
    }

    client := iam.New(cfg)

引擎盖下的方法调用 external.NewEnvConfig 尝试从环境变量中获取凭据:

  • AWS_SECRET_ACCESS_KEYAWS_SECRET_KEY
  • AWS_ACCESS_KEY_IDAWS_ACCESS_KEY

有关环境变量读取优先级的更多详细信息,请参阅 EnvConfig 文档。