dragonfly-s3 с пользователем S3 IAM, вызывающим запрещенный ответ 403 от Amazon
Я использую Rails 4.2.0 с dragonfly 1.0.10 и dragonfly-s3_data_store 1.1.0 с пользователем Amazon IAM, установленным с ключом и secret_key для аутентификации и полными разрешениями, установленными для конкретного сегмента. Когда я пытаюсь сохранить модель с загруженным файлом, я получаю следующий вывод.
выходной журнал
Started PATCH "/admin/sections/1/weeks/1" for ::1 at 2015-06-09 13:20:15 -0400
Started PATCH "/admin/sections/1/weeks/1" for ::1 at 2015-06-09 13:20:15 -0400
ActiveRecord::SchemaMigration Load (0.3ms) SELECT "schema_migrations".* FROM "schema_migrations"
ActiveRecord::SchemaMigration Load (0.3ms) SELECT "schema_migrations".* FROM "schema_migrations"
Processing by Admin::WeeksController#update as HTML
Processing by Admin::WeeksController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"uBK02MNoYAywWWf1K8zQQ/s/FnjY3LpLrX7O/4mYH/aJgX40CdFhqJEvz+B+A2U7X5NqXNLPM3XGp0mTtgHqAA==", "commit"=>"Save", "week"=>{"title"=>"foo", "video"=>#<ActionDispatch::Http::UploadedFile:0x007f9d888e68b8 @tempfile=#<Tempfile:/var/folders/3j/0zbm_nfs02b214_p2gszlb_r0000gn/T/RackMultipart20150609-20229-1s8vt4p.js>, @original_filename="moment.js", @content_type="text/javascript", @headers="Content-Disposition: form-data; name=\"week[video]\"; filename=\"moment.js\"\r\nContent-Type: text/javascript\r\n">, "description"=>"test", "reminder"=>"", "fla_instructions"=>""}, "section_id"=>"1", "id"=>"1"}
Parameters: {"utf8"=>"✓", "authenticity_token"=>"uBK02MNoYAywWWf1K8zQQ/s/FnjY3LpLrX7O/4mYH/aJgX40CdFhqJEvz+B+A2U7X5NqXNLPM3XGp0mTtgHqAA==", "commit"=>"Save", "week"=>{"title"=>"title", "video"=>#<ActionDispatch::Http::UploadedFile:0x007f9d888e68b8 @tempfile=#<Tempfile:/var/folders/3j/0zbm_nfs02b214_p2gszlb_r0000gn/T/RackMultipart20150609-20229-1s8vt4p.js>, @original_filename="moment.js", @content_type="text/javascript", @headers="Content-Disposition: form-data; name=\"week[video]\"; filename=\"moment.js\"\r\nContent-Type: text/javascript\r\n">, "description"=>"blah, description", "reminder"=>"", "fla_instructions"=>""}, "section_id"=>"1", "id"=>"1"}
User Load (0.7ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1 [["id", 2822]]
User Load (0.7ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1 [["id", 2822]]
Section Load (0.2ms) SELECT "sections".* FROM "sections" WHERE "sections"."id" = $1 ORDER BY "sections"."order" ASC LIMIT 1 [["id", 1]]
Section Load (0.2ms) SELECT "sections".* FROM "sections" WHERE "sections"."id" = $1 ORDER BY "sections"."order" ASC LIMIT 1 [["id", 1]]
Week Load (0.3ms) SELECT "weeks".* FROM "weeks" WHERE "weeks"."section_id" = $1 AND "weeks"."id" = $2 ORDER BY "weeks"."order" ASC LIMIT 1 [["section_id", 1], ["id", 1]]
Week Load (0.3ms) SELECT "weeks".* FROM "weeks" WHERE "weeks"."section_id" = $1 AND "weeks"."id" = $2 ORDER BY "weeks"."order" ASC LIMIT 1 [["section_id", 1], ["id", 1]]
(0.2ms) BEGIN
(0.2ms) BEGIN
[fog][WARNING] Unable to fetch credentials: connect timeout reached
[fog][WARNING] Unable to fetch credentials: connect timeout reached
[fog][WARNING] Unable to fetch credentials: connect timeout reached
(0.2ms) ROLLBACK
(0.2ms) ROLLBACK
Excon::Errors::Forbidden: Expected(200) <=> Actual(403 Forbidden)
excon.error.response
:body => "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>440C1D6D8B3F6067</RequestId><HostId>EqSSx+F4XWu14oL04q6fXaiC7K+24yQcmSVW0twY5HQhnsH2FG4Y9EKJafzjx0hJ</HostId></Error>"
:headers => {
"Content-Type" => "application/xml"
"Date" => "Tue, 09 Jun 2015 17:23:25 GMT"
"Server" => "AmazonS3"
"x-amz-id-2" => "EqSSx+F4XWu14oL04q6fXaiC7K+24yQcmSVW0twY5HQhnsH2FG4Y9EKJafzjx0hJ"
"x-amz-request-id" => "440C1D6D8B3F6067"
}
:local_address => "172.16.2.86"
:local_port => 53540
:reason_phrase => "Forbidden"
:remote_ip => "54.231.244.0"
:status => 403
:status_line => "HTTP/1.1 403 Forbidden\r\n"
from /Users/dakotabrink/.rvm/gems/ruby-2.2.1/gems/excon-0.45.3/lib/excon/middlewares/expects.rb:6:in `response_call'
конфиг / Инициализаторы /dragonfly.rb
require 'dragonfly/s3_data_store'
# Configure
Dragonfly.app.configure do
plugin :imagemagick
secret "secret goes here"
url_format "/media/:job/:name"
datastore :s3,
bucket_name: ENV['S3_BUCKET'],
access_key_id: ENV['S3_KEY'],
secret_access_key: ENV['S3_SECRET'],
use_iam_profile: true
end
# Logger
Dragonfly.logger = Rails.logger
# Mount as middleware
Rails.application.middleware.use Dragonfly::Middleware
# Add model functionality
if defined?(ActiveRecord::Base)
ActiveRecord::Base.extend Dragonfly::Model
ActiveRecord::Base.extend Dragonfly::Model::Validations
end
Настройки политики IAM
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Stmt1433856191000",
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::bucket-name/*"
]
}
]
}
Реакция на сбой кажется весьма неоднозначной в отношении того, где он терпит неудачу Поле "последний использованный" пользователя IAM обновляется при каждом "отклоненном" запросе, поэтому кажется, что Amazon распознает попытку входа в систему. Любая помощь будет оценена.
1 ответ
Если вы установите use_iam_profile
правда, это будет игнорировать access_key_id
а также secret_access_key
и попытайтесь загрузить учетные данные автоматически. Когда вы запускаете коробку ec2 с загруженным профилем IAM, это будет работать, но, поскольку вы добавляете ключи, я предполагаю, что это не так.
Из стрекозы s3 документы::use_iam_profile # boolean - if true, no need for access_key_id or secret_access_key
Дополнительную информацию о профилях IAM через EC2 и о том, как они взаимодействуют с туманом, можно найти по адресу http://www.spacevatican.org/2012/6/25/iam-roles/