AWS S3 - Golang SDK - SignatureDoesNotMatch - PullRequest
3 голосов
/ 10 июля 2020

Я хочу интегрировать ведро S3 с разрабатываемым им API, я сталкиваюсь с этой ошибкой везде, где я go -

SignatureDoesNotMatch: The request signature we calculated does not match the signature you provided. Check your key and signing method.
        status code: 403

Я сделал следующее

  1. Установленный SDK и AWS CLI и AWS настроенный
  2. Двойная (тройная) проверка правописания ключа, секретного ключа и прав доступа к корзине
  3. Попытка с документом учетных данных, .env и даже жесткое кодирование значений напрямую.
  4. Протестировано с AWS CLI (ЭТО РАБОТАЕТ), поэтому я считаю, что могу исключить разрешения, ключи в целом.

I Я тестирую, пытаясь перечислить сегменты, вот код, взятый непосредственно из 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))
    }

Используя отладчик, я могу видеть файлы конфигурации сеансов во время работы программы, проблема потенциально здесь

config -
       -> credentials 
                     -> creds
                         -> v
                           -> Access Key = ""
                           -> Secret Access Key  = ""
                           -> Token  = ""
                            
                     -> provider
                         ->value
                           -> Access Key With Value
                           -> Secret Access Key With Value
                           -> Token With Value

Я лично не могу найти никакой документации относительно «creds» / «v», и я не знаю, является ли это причиной проблемы. Как я уже упоминал, я могу использовать AWS CLI для загрузки в корзину, и даже когда я жестко кодирую свой ключ доступа et c в Go SDK, я получаю эту ошибку.

Спасибо Вам за любые мысли, очень признательны.

Ответы [ 2 ]

3 голосов
/ 10 июля 2020

Я только что скомпилировал ваш код и его выполнение ОК ... один из многих способов предоставить учетные данные для вашего двоичного файла - это заполнить эти переменные env

export AWS_ACCESS_KEY_ID=AKfoobarT2IJEAU4
export AWS_SECRET_ACCESS_KEY=oa6oT0Xxt4foobarbambazdWFCb
export AWS_REGION=us-west-2

, это все, что вам нужно при использовании env var (ваши значения доступны с использованием aws консольного браузера)

большая картина заключается в создании сценария оболочки оболочки (bash), который содержит три строки выше для заполнения переменных env для предоставления учетных данных, а затем в том же сценарии оболочки выполните двоичный файл golang (обычно вы компилируете golang в некотором предварительном процессе) ... в моем случае я сохраняю значения трех моих переменных env в зашифрованных файлах, которые сценарий оболочки расшифровывает непосредственно перед вызовом вышеупомянутые команды экспорта

иногда полезно отбросить удар и просто использовать команды, эквивалентные aws командной строке, чтобы попасть в примерную ... из терминала запустить

aws s3 ls s3://cairo-mombasa-zaire --region  us-west-2

который также можно использовать те же переменные env, показанные выше

для полноты, вот ваш код с шаблоном добавлено ... это работает нормально и перечисляет корзины

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))
    }
}
0 голосов
/ 17 июля 2020

Если у кого-то еще возникла эта проблема,

Проблема была связана с переменными среды, во многом такими, как Скотт предлагает выше, однако это было связано с отсутствием

export AWS_SDK_LOAD_CONFIG="true"

Если эта переменная среды отсутствует, то Golang SDK не будет искать файл учетных данных, вместе с этим я создал экземпляры переменных среды для обоих моих ключей, которые позволили установить соединение.

Подведем итоги:

, если вы пытаетесь использовать папку с общими учетными данными, вы должны использовать указанную выше переменную среды, чтобы включить ее. Если вы используете переменные среды, эта проблема не должна возникать у вас .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...