AWS SDK не включает ключ доступа (AKID) в X-Amz-Credential при создании подписанного сообщения, но только в Heroku - PullRequest
0 голосов
/ 06 мая 2018

Я делаю прямую загрузку в S3, и у меня есть объявленное сообщение, объявленное так:

@s3_direct_post = S3_BUCKET.presigned_post(key: "images/#{SecureRandom.uuid}/${filename}", success_action_status: '201', acl: 'public-read', allow_any: ['utf8', 'authenticity_token'])

В среде разработки все строится правильно, и я получаю что-то вроде этого:

{"key"=>"images/1be59d13-9d65-4d70-b631-93834409f361/${filename}", "success_action_status"=>"201", "acl"=>"public-read", "policy"=>"<BASE_64_POLICY>", "x-amz-credential"=>"<MY_ACCESS_KEY>/20180505/us-east-1/s3/aws4_request", "x-amz-algorithm"=>"AWS4-HMAC-SHA256", "x-amz-date"=>"20180505T232823Z", "x-amz-signature"=>"<AMZ_SIGNATURE>"}

Но после того, как я подтолкнул его к Героку, я получил что-то вроде этого:

{"key"=>"images/1be59d13-9d65-4d70-b631-93834409f361/${filename}", "success_action_status"=>"201", "acl"=>"public-read", "policy"=>"<BASE_64_POLICY>", "x-amz-credential"=>"/20180505/us-east-1/s3/aws4_request", "x-amz-algorithm"=>"AWS4-HMAC-SHA256", "x-amz-date"=>"20180505T232823Z", "x-amz-signature"=>"<AMZ_SIGNATURE>"}

Теперь, когда мой Ключ доступа (AKID) больше не существует, я получаю эту ошибку:

<Error><Code>InvalidArgument</Code><Message>a non-empty Access Key (AKID) must be provided in the credential.</Message><ArgumentName>X-Amz-Credential</ArgumentName><ArgumentValue>/20180505/us-east-1/s3/aws4_request</ArgumentValue><RequestId>%REQUESTID%</RequestId><HostId>%HOSTID%</HostId></Error>

Мои учетные данные AWS объявлены в initalizer / aws.rb, поэтому они не зависят от типа среды. Что может быть причиной этого?

Редактировать (показывая, как я объявляю S3_BUCKET константой, которую я инициализирую в aws.rb):

Aws.config.update({ region: 'us-east-1', credentials: Aws::Credentials.new(ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY']) })

S3_BUCKET = Aws::S3::Resource.new.bucket(ENV['S3_BUCKET'])

Кроме того, разница между двумя объектами предварительно назначенного поста:

"x-amz-credential"=>"<MY_ACCESS_KEY>/20180505/us-east-1/s3/aws4_request"

"x-amz-credential"=>"/20180505/us-east-1/s3/aws4_request"

1 Ответ

0 голосов
/ 06 мая 2018

Вы не должны фиксировать свои учетные данные в своем git-репозитории, поэтому вы должны убедиться в инициализаторе:

в config / initializers / credentials.rb

AWS_ACCESS_KEY_ID = ENV['AWS_ACCESS_KEY_ID']
AWS_SECRET_ACCESS_KEY = ENV['AWS_SECRET_ACCESS_KEY']

И используйте heroku-cli для настройки учетных данных в вашем приложении

heroku config:set AWS_ACCESS_KEY_ID=someLongHashKey AWS_SECRET_ACCESS_KEY=anotherLongHashKey --app my_app_name
# see heroku config --help

Но ваша ошибка может быть связана с AWS SDK Presigned Post Ruby

и см. https://docs.aws.amazon.com/sdkforruby/api/Aws/S3/PresignedPost.html

Если это не поможет, напишите, как вы определяете Aws::S3::PresignedPost.new

Наконец, дважды проверьте, правильно ли вы задали переменные окружения в heroku

heroku config --app my_app_name #use your actual app name of course
...