3 回答
TA贡献1789条经验 获得超8个赞
我刚刚编译了您的代码并且它的执行正常......向您的二进制文件提供凭据的众多方法之一是填充这些环境变量
export AWS_ACCESS_KEY_ID=AKfoobarT2IJEAU4
export AWS_SECRET_ACCESS_KEY=oa6oT0Xxt4foobarbambazdWFCb
export AWS_REGION=us-west-2
这就是您在使用 env var 方法时所需要的(您的值可使用 aws 控制台浏览器获得)
大局是创建一个包装器外壳脚本 (bash),其中包含以上三行来填充环境变量以提供凭据,然后在同一个外壳脚本中执行 golang 二进制文件(通常您在一些初步过程中编译 golang)...在我的情况下,我将三个环境变量的值存储在加密文件中,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))
}
}
TA贡献1878条经验 获得超4个赞
numBytes, err := downloader.Download(tempFile,
&s3.GetObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(fileName),
},
)
在我的情况下,桶值是错误的,最后缺少文字“/”。添加它可以解决我的问题。
我得到的错误 - 错误:SignatureDoesNotMatch:我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法。状态码:403,
TA贡献1815条经验 获得超6个赞
如果其他人碰巧有这个问题,
问题是关于环境变量,就像斯科特上面建议的那样,但这是由于缺乏
export AWS_SDK_LOAD_CONFIG="true"
如果此环境变量不存在,则 Golang SDK 将不会查找凭据文件,此外,我为我的两个密钥实例化了环境变量,以使连接成功。
回顾一下
如果您尝试使用共享凭据文件夹,则必须使用上述环境变量来启用它。
如果您使用环境变量,则不应受到此问题的影响。
- 3 回答
- 0 关注
- 571 浏览
添加回答
举报