Получить 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.GetObjectRequest
URL-адрес, который он возвращает, действительно больше напоминает формат URL, пока вы не запустите метод по запросу Sign
или же Presign
,
Немного Presign
примеры можно найти на этой странице. Пример Get предоставляет следующий вывод:
Обратите внимание, что я использую '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.