Получить URI ресурса в корзине s3

В настоящее время я создаю URI вручную с помощью интерполяции строк:

fmt.Sprintf("https://%s.%s.amazonaws.com/%s/%s", serviceId, region, namespace, filename)

ИМХО это плохо, так как я передаю их через параметры из переменных env. У меня есть доступ к объекту aws.Session, который правильно инициализирован с нашей корзиной s3.

Существует ли семантически правильный способ (возможно, с помощью API-интерфейса aws sdk) для генерации того же URI ресурса, который я использую при построении фиктивных строк?

1 ответ

Решение

Из примера...

В то время как aws-sdk-go разоблачает *http.Request в структуре, возвращаемой svc.GetObjectRequestURL-адрес, который он возвращает, действительно больше напоминает формат URL, пока вы не запустите метод по запросу Sign или же Presign,

Немного Presign примеры можно найти на этой странице. Пример Get предоставляет следующий вывод:

2017/08/03 09:47:43 URL-адрес https://get-resource-uri-test.s3-us-west-2.amazonaws.com/myKey?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIFJBK7YB3H7CTZIA%2F20170803%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Date=20170803T144743Z&X-Amz-Expires=900&X-Amz-SignedHeaders=host&X-Amz-Signature=3c279aece1eda3c33b0711bb0e5a86e330e378f9052f1e73cdb0b9ca19de6209

Обратите внимание, что я использую 'get-resource-uri-test' в качестве имени своего сегмента, так как тот, что в примере, уже использовался


Скорректированный пример

Поскольку это не тот результат, который вы ищете, я настроил пример для использования Sign, что делает вещи более чистыми, так как информация об аутентификации помещается в заголовки /etc. вместо в URL:

svc := s3.New(session.New(&aws.Config{Region: aws.String("us-west-2")}))
req, _ := svc.GetObjectRequest(&s3.GetObjectInput{
    Bucket: aws.String("get-resource-uri-test"),
    Key:    aws.String("myKey"),
})

// Instead of using Presign, which was provided in example
if err := req.Sign(); err != nil {
    log.Println("Failed to sign request", err)
}

log.Println("The URL is", req.HTTPRequest.URL)

2017/08/03 09:53:22 URL-адрес https://get-resource-uri-test.s3-us-west-2.amazonaws.com/myKey


Соображения

Несмотря на то, что это предложение действительно не позволяет делать какие-либо звонки на S3, у меня смешанные чувства по этому поводу. В некоторых отношениях, aws-sdk-go Похоже, что он разработан для того, чтобы несколько устранить необходимость в манипулировании URL-адресами, а вместо этого генерирует его (главным образом внутри) в результате того, что вы пытаетесь выполнить.

Так действительно ли нам необходимо создать целый клиент S3, чтобы получить правильно "санкционированный / благословенный" URL от Amazon in Go? Это кажется немного за борт, но это единственный способ, который я нашел до сих пор, чтобы получить отформатированный URL от aws-sdk-go, Если кто-то еще может предложить более разумную альтернативу, я бы посоветовал этому человеку также опубликовать свое решение.

Мне, вероятно, не нужно это говорить, но если этот пример вы планируете использовать в масштабе, я бы порекомендовал создать один клиент s3 (с именем svc в приведенном примере) и повторное использование его GetObjectRequest метод, чтобы избежать создания нового клиента каждый раз, когда вам нужно определить URL.

Другие вопросы по тегам