Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 获取InvalidToken“;提供的令牌格式不正确或无效";使用GetObjectInput时_Go_Amazon S3_Aws Sdk_Aws Sdk Go - Fatal编程技术网

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

Go 获取InvalidToken“;提供的令牌格式不正确或无效";使用GetObjectInput时,go,amazon-s3,aws-sdk,aws-sdk-go,Go,Amazon S3,Aws Sdk,Aws Sdk Go,在AWS文档中详细介绍了如何从S3下载对象之后,我得到了提供的令牌格式不正确或无效的错误 我正在通过AWS SAM CLI运行代码 我的代码是: sess, _ := session.NewSession(&aws.Config{ Region: aws.String(endpoints.UsWest2RegionID), }) svc := s3.New(sess) aak := os.Getenv("AWS_ACCESS_

在AWS文档中详细介绍了如何从S3下载对象之后,我得到了
提供的令牌格式不正确或无效的
错误

我正在通过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获取对象--bucket“mybucket dev”--key“mydir/mykey_test.json”result.txt


result.txt中填充了mykey_test.json的内容,因此我知道我的creds可以访问该文件。我假设这个问题与lambda使用的角色没有访问文件的权限有关?但是我找不到足够的信息来验证这种可能性,或者如何在本地测试时解决问题。

结果是
AWS\u会话\u令牌
以字符串
(null)
的形式传递,这绝对不是有效的会话令牌。因此,我的代码如下所示:

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

现在我可以成功下载文件了

因为我们还不知道这将如何通过实际的lambda传递,所以我对它进行了如下检查:

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


尝试将您的环境变量重命名为
AWS\u-ACCESS\u-KEY\u-ID
AWS\u-SECRET\u-ACCESS\u-KEY\u-KEY
刚刚添加了以下内容:
os.Setenv(“AWS\u-ACCESS\u-KEY\u-ID”,aak)
os.Setenv(“AWS\u-SECRET\u-ACCESS\u-KEY”,ask)
,并对它们进行了Getenv以确保它们已设置。没有任何区别。你是否将
Setenv
放在
session.NewSession
之前?是的,但是creds已经从SAM那里传递了。这就是为什么我没有任何代码实际传递它们(直到现在)。仅获取和打印代码。我设置了SetEnv,以防SAM错误地传递它们(根据您上面的评论),但这并没有什么区别。我确实在新闻发布会之前确定了他们的位置。我还向配置中添加了
Credentials:Credentials.NewEnvCredentials(),
,以查看这是否会有所不同。我还打印了
os.Getenv(“AWS_地区”)
,它是
us-west-2
。只是好奇看看还有什么其他的经历。花了好几天寻找解决方案。谢谢