Go语言 使用GetObjectInput时获取InvalidToken“提供的令牌格式不正确或无效

vsikbqxv  于 2023-01-15  发布在  Go
关注(0)|答案(2)|浏览(137)

按照AWS文档中关于如何从S3下载对象的说明,我得到了The provided token is malformed or otherwise invalid错误。
我正在通过AWS SAM CLI运行代码。
我的代码是:

sess, _ := session.NewSession(&aws.Config{
        Region: aws.String(endpoints.UsWest2RegionID),
    })

    svc := s3.New(sess)

    aak := os.Getenv("AWS_ACCESS_KEY")
    ask := os.Getenv("AWS_SECRET_KEY")
    fmt.Println("aak", aak, "ask", ask) // both of these correctly show my keys are being passed in

    resp, err := svc.GetObject(&s3.GetObjectInput{
        Bucket: aws.String(bucket),
        Key:    aws.String(key),
    })

    if err != nil {
        fmt.Println(err)
    }

我正在运行它:sam local invoke LambdaMyFunction --debug -e test/event.json
我已验证AWS访问和密钥是否正确。我已验证是否可以通过CLI下载对象:aws s3api get-object --bucket "mybucket-dev" --key "mydir/mykey_test.json" result.txt
result.txt是用mykey_test. json的内容填充的,所以我知道我的cred可以访问这个文件。我假设这个问题与lambda使用的角色没有访问这个文件有关,但是我找不到足够的信息来验证这种可能性,或者如何解决本地测试的问题。

mklgxw1f

mklgxw1f1#

结果发现AWS_SESSION_TOKEN是以字符串(null)的形式传递的,这肯定不是一个有效的会话令牌,所以我的代码如下所示:

os.Setenv("AWS_SESSION_TOKEN", "")
sess, _ := session.NewSession()

现在我可以成功下载文件了。
因为我们还不知道它是如何通过实际的lambda传入的,所以我设置了一个检查,如下所示:

// this is STUPID!!! But necessary.
    if os.Getenv("AWS_SESSION_TOKEN") == "(null)" {
        os.Setenv("AWS_SESSION_TOKEN", "")
    }
    sess, _ := session.NewSession()
mrwjdhj3

mrwjdhj32#

如果您的SSO,,,for windows,在命令提示符中.. aws sso login --profile然后使用sam本地调用'HelloWorldFunction' --profile并且它工作(没有无效令牌错误...

相关问题