Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.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
Amazon web services AWS S3-Golang SDK-签名不匹配_Amazon Web Services_Go_Amazon S3 - Fatal编程技术网

Amazon web services AWS S3-Golang SDK-签名不匹配

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 双重(三重)检查密钥

我希望将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
  • 双重(三重)检查密钥、密钥和存储桶权限的拼写
  • 尝试使用凭据文档、.env,甚至直接对值进行硬编码
  • 使用AWS CLI进行了测试(这很有效),因此我相信我可以排除权限和密钥
  • 我通过列出bucket进行测试,下面是直接取自AWS文档的代码-

    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将不会查找凭据文件,同时,我为两个密钥实例化了环境变量,从而使连接成功

    重述

    • 如果您试图使用共享凭据文件夹,则必须使用上述环境变量来启用它
    • 如果您使用的是环境变量,则不应受到此问题的影响

    尝试显式设置区域。我非常感谢您的帖子,使用您提供的模板,我仍然收到ListBucket的错误,下面是输出`
    这里是区域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"