Загрузка Carrierwave на S3 не удалась, но curl работает
Я пытаюсь загрузить изображения на S3, используя Carrierwave (1.0.0 на Rails 4.2). Я получаю 403 Отказано в доступе. Тем не менее, когда я делаю руководство PUT
запрос с помощью curl, он работает просто отлично. Я подтвердил, что Rails правильно читает мои секреты. Все это подразумевает, что Excon почему-то не отправляет мои учетные данные.
Что я могу сделать?
Рабочая команда curl:
$ file=airplane.jpg
$ bucket=mybucket
$ resource="/${bucket}/${file}"
$ contentType="image/jpeg"
$ dateValue=`date -R`
$ stringToSign="PUT\n\n${contentType}\n${dateValue}\n${resource}"
$ s3Key=redacted:)
$ s3Secret=redacted:)
$ signature=`echo -en ${stringToSign} | openssl sha1 -hmac ${s3Secret} -binary | base64`
$ curl -X PUT -T "${file}" \
> -H "Host: ${bucket}.s3.amazonaws.com" \
> -H "Date: ${dateValue}" \
> -H "Content-Type: ${contentType}" \
> -H "Authorization: AWS ${s3Key}:${signature}" \
> https://${bucket}.s3.amazonaws.com/${file}
Конфигурация Carrierwave:
config.fog_credentials = {
provider: 'AWS',
aws_access_key_id: secrets[:aws_access_key_id],
aws_secret_access_key: secrets[:aws_secret_access_key],
region: 'eu-west-1',
host: 's3-eu-west-1.amazonaws.com'
}
config.fog_provider = 'fog/aws'
config.storage :fog
config.fog_directory = 'mybucket'
config.fog_public = true
config.fog_attributes = { 'Cache-Control' => 'max-age=315576000' }
РЕДАКТИРОВАТЬ: обновление - я не знаю, что я изменил, но вдруг я получаю следующую ошибку при использовании команды curl:
<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message></Error>
1 ответ
Решение
В конечном итоге это было связано с неправильной настройкой S3. Я больше не помню точных деталей.