【问题标题】:How to run AWS SDK with credentials from variables?如何使用来自变量的凭证运行 AWS 开发工具包?
【发布时间】:2020-03-12 14:02:53
【问题描述】:

我之前用过环境变量,效果很好。

现在我将我的配置变量迁移到一个文件中,并且我有 AWS_SECRET_ACCESS_KEY 和 AWS_ACCESS_KEY_ID 变量,其中包含从该文件加载的相应值。

我试过这段代码但收到错误:

creds := credentials.NewStaticCredentials("123", conf.AWS_SECRET_ACCESS_KEY, conf.AWS_ACCESS_KEY_ID)
sess, err := session.NewSession(&aws.Config{Credentials: creds})

这是错误

InvalidClientTokenId:请求中包含的安全令牌无效。

如何正确地将我的密钥注入到 aws sdk 调用中?

【问题讨论】:

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


    【解决方案1】:

    尝试重新排序您的参数,以便 ACCESS_KEY 是第一个参数,而 SECRET_KEY 是第二个:

    creds := credentials.NewStaticCredentials(conf.AWS_ACCESS_KEY_ID, conf.AWS_SECRET_ACCESS_KEY, "")
    

    也尝试添加区域:

    sess, err := session.NewSession(&aws.Config{
        Region:      aws.String("us-west-2"),
        Credentials: credentials.NewStaticCredentials(conf.AWS_ACCESS_KEY_ID, conf.AWS_SECRET_ACCESS_KEY, ""),
    })
    

    【讨论】:

    • 我得到了InvalidToken: The provided token is malformed or otherwise invalid. 我认为我们应该先生成令牌,对吗? @戴夫枫
    • 没有意识到 NewStaticCredentials 第三个参数可能是一个空字符串!如果我确实需要提供“令牌”,那么在该方法的上下文中这实际上意味着什么或如何获取令牌。文档留下了很多不足之处。
    【解决方案2】:

    此外,如果您不知道,SDK 允许使用.aws/config 下的共享配置。您可以将您的值放在那里,然后将环境变量 AWS_SDK_LOAD_CONFIG 设置为真实值以加载共享配置。共享配置示例如下所示:

    [default]
    aws_access_key_id = AKID
    aws_secret_access_key = SECRET
    

    然后运行:

    AWS_SDK_LOAD_CONFIG=true go run main.go
    

    【讨论】:

      【解决方案3】:

      或者你可以临时设置环境变量。

      package main
      import (
          "fmt"
          "os"
          "github.com/aws/aws-sdk-go/aws"
          "github.com/aws/aws-sdk-go/aws/session"
          "github.com/aws/aws-sdk-go/service/s3/s3manager"
      )
      
      const (
          AccessKeyId     = "XXXXXXXXXXXXXXXXXX"
          SecretAccessKey = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
          Region          = "eu-west-1"
          Bucket          = "XXXXX-XXXX-XXX"
      )
      
      func main() {
          os.Setenv("AWS_ACCESS_KEY_ID",     AccessKeyId)
          os.Setenv("AWS_SECRET_ACCESS_KEY", SecretAccessKey)
      
          filename := os.Args[1]
      
          file, err := os.Open(filename)
          if err != nil {
              fmt.Println("Failed to open file", filename, err)
              os.Exit(1)
          }
          defer file.Close()
      
          conf := aws.Config{Region: aws.String(Region)}
          sess := session.New(&conf)
      
          svc := s3manager.NewUploader(sess)
      
          fmt.Println("Uploading file to S3...")
          result, err := svc.Upload(&s3manager.UploadInput{
              Bucket: aws.String(Bucket),
              Key:    aws.String(filepath.Base(filename)),
              Body:   file,
          })
          if err != nil {
              fmt.Println("error", err)
              os.Exit(1)
          }
      }
      

      【讨论】:

        【解决方案4】:

        使用此通用服务连接您的 sdk 客户端

        var awsSession *session.Session
        
        func init() {
            initializeAwsSession()
        }
        
        
        func initializeAwsSession() {
            awsSession = session.Must(session.NewSession(&aws.Config{
                Region:      aws.String("ap-southeast-1"),
                Credentials: credentials.NewStaticCredentials("YOUR_ACCESS_KEY","YOUR SECRET_KEY", ""),
            }))
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-10-14
          • 1970-01-01
          • 2019-04-24
          • 2017-05-14
          • 1970-01-01
          • 2015-08-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多