Amazon web services AWS S3-Golang SDK-签名不匹配
我希望将S3 bucket与我正在开发的API集成,无论我走到哪里,都会遇到这个错误-Amazon web services AWS S3-Golang SDK-签名不匹配,amazon-web-services,go,amazon-s3,Amazon Web Services,Go,Amazon S3,我希望将S3 bucket与我正在开发的API集成,无论我走到哪里,都会遇到这个错误- SignatureDoesNotMatch: The request signature we calculated does not match the signature you provided. Check your key and signing method. status code: 403 我已经做了以下工作 已安装SDK和AWS CLI,并已配置AWS 双重(三重)检查密钥
SignatureDoesNotMatch: The request signature we calculated does not match the signature you provided. Check your key and signing method.
status code: 403
我已经做了以下工作
sess := session.Must(session.NewSessionWithOptions(session.Options{ <--- DEBUGGER SET HERE
SharedConfigState: session.SharedConfigEnable,
}))
svc := s3.New(sess)
result, err := svc.ListBuckets(nil)
if err != nil { exitErrorf("Unable to list buckets, %v", err) }
for _, b := range result.Buckets {
fmt.Printf("* %s created on %s\n", aws.StringValue(b.Name), aws.TimeValue(b.CreationDate))
}
我个人找不到任何关于“creds”/“v”的文档,我不知道这是否是问题的根源。正如我提到的,我可以使用AWS CLI上传到bucket中,甚至当我将我的访问密钥等硬编码到Go SDK中时,我也会收到这个错误
非常感谢您的任何想法。我刚刚编译了您的代码,代码执行正常。。。向二进制文件提供凭据的许多方法之一是填充这些环境变量
export AWS_ACCESS_KEY_ID=AKfoobarT2IJEAU4
export AWS_SECRET_ACCESS_KEY=oa6oT0Xxt4foobarbambazdWFCb
export AWS_REGION=us-west-2
这就是使用env var方法时所需的全部内容(您的值可通过aws控制台浏览器获得)
重要的是创建一个包装器shell脚本(bash),其中包含以上三行内容,以填充env vars以提供凭据,然后在同一shell脚本中执行golang二进制文件(通常在某些初步过程中编译golang)。。。在我的例子中,我将三个env变量的值存储在加密文件中,shell脚本在调用上述导出命令之前解密这些文件
有时,使用aws命令行的等效命令来让自己进入球场,这会很有帮助。。。从终点站出发
aws s3 ls s3://cairo-mombasa-zaire --region us-west-2
也可以使用上面显示的相同环境变量
为了完整起见,这里是添加了样板的代码。。。这将正常运行并列出存储桶
package main
import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/s3"
// "github.com/aws/aws-sdk-go/service/s3/s3manager"
"fmt"
"os"
)
func exitErrorf(msg string, args ...interface{}) {
fmt.Fprintf(os.Stderr, msg+"\n", args...)
os.Exit(1)
}
func main() {
region_env_var := "AWS_REGION"
curr_region := os.Getenv(region_env_var)
if curr_region == "" {
exitErrorf("ERROR - failed to get region from env var %v", region_env_var)
}
fmt.Println("here is region ", curr_region)
// Load session from shared config
sess := session.Must(session.NewSessionWithOptions(session.Options{
SharedConfigState: session.SharedConfigEnable,
}))
svc := s3.New(sess)
result, err := svc.ListBuckets(nil)
if err != nil { exitErrorf("Unable to list buckets, %v", err) }
for _, b := range result.Buckets {
fmt.Printf("* %s created on %s\n", aws.StringValue(b.Name), aws.TimeValue(b.CreationDate))
}
}
如果其他人碰巧有这个问题 问题是关于环境变量,就像上面Scott建议的那样,但这是由于缺乏
export AWS_SDK_LOAD_CONFIG="true"
如果此环境变量不存在,则Golang SDK将不会查找凭据文件,同时,我为两个密钥实例化了环境变量,从而使连接成功
重述
- 如果您试图使用共享凭据文件夹,则必须使用上述环境变量来启用它
- 如果您使用的是环境变量,则不应受到此问题的影响
这里是区域ca-central-1无法列出Bucket,SignatureDesNotMatch:我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。
似乎我能够获取环境变量,但我仍然不确定哪个部分出现故障。此外,一旦将这些值输入控制台,这些值将存储在何处?再次感谢export AWS\u ACCESS\u KEY\ID=AKfoobarT2IJEAU4 export AWS\u SECRET\u ACCESS\u KEY=oa6oT0Xxt4foobarbambazdWFCb export AWS\u REGION=us-west-2
@nvancouver我在上面的内文中回答了一遍谢谢你的留言,我正在做进一步的测试,因为我还没有解决这个问题。我想知道,我目前可以去CLI和上传等,所以我的环境似乎是通过正确的。CLI和SDK是否可能从不同的位置获取凭据?谢谢again@nvancouver我只能猜测这个问题可能是由aws提供的其他凭证技术之一的部分定义引起的,但是我只使用过env vars。。。尝试从另一台机器开始,在那里你可以重新开始。。。或者启动一个新的远程VPS盒,从那里重新开始。。。就我个人而言,我一直在为我的整个创作和毁灭过程编写脚本。。。最初需要数天手动操作的步骤现在只需要执行一个脚本。。。自动化是生产力的关键,但我们首先必须从一开始就忍受所有这些手动步骤
export AWS_SDK_LOAD_CONFIG="true"