【问题标题】:How to run AWS SDK version 2 with credentials from variables?如何使用来自变量的凭证运行 AWS SDK 版本 2?
【发布时间】:2021-10-14 14:51:02
【问题描述】:

我的问题与其他问题相同:How to run AWS SDK with credentials from variables? 但我使用的 SDK 版本 2 不再使用 Session(如果我理解正确的话)。

所以,我正在创建一个新客户端,并将凭据作为变量。我需要使用 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 文件,但我无法找到解释如何将这些凭据传递给我的客户的文档页面。任何支持将不胜感激!

【问题讨论】:

    标签: amazon-web-services go amazon-iam aws-sdk-go


    【解决方案1】:

    这可以通过StaticCredentialsProvider 来实现,如section "Static Credentials" of the AWS SDK for Go V2 documentation 中所述:

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

    【讨论】:

    • 是的,我有变量中的信息,它们不是硬编码的。这解决了我的问题。非常感谢!
    【解决方案2】:

    要从 runtime 变量初始化配置,可以使用 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 你认为:

    不要在应用程序中嵌入凭据。仅将此方法用于测试目的。

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


    对于一般用例,即环境变量,您可以使用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 文档中提供了有关环境变量读取优先级的更多详细信息。

    【讨论】:

    • 谢谢,但我的问题正是如何手动传递凭据,而不是让 SDK 从环境或配置文件中获取它们。
    • @CamiloUrán 是的,TBH 起初我误解了你的问题。但是,寻找“环境”变量的人可能会在您的标题中找到“变量”一词。因此,我将针对您的特定问题的解决方案添加到我的答案中,并将一般部分留给其他用例
    • 我明白了!谢谢,就像你说的,一般情况也总是有用的。
    猜你喜欢
    • 1970-01-01
    • 2021-05-12
    • 2019-08-10
    • 2019-01-15
    • 2018-12-17
    • 2021-02-05
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    相关资源
    最近更新 更多