2016-02-10 2 views
5

Какова должна быть моя политика IAM, чтобы позволить пользователю my-user получить доступ к ведро Amazon S3 под названием my-bucket?Простая политика Amazon IAM для s3 с использованием Rails и Paperclip

В настоящее время я следующие политики назначены my-user:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
    { 
     "Effect": "Allow", 
     "Action": ["s3:ListBucket"], 
     "Resource": ["arn:aws:s3:::my-bucket"] 
    }, 
    { 
     "Effect": "Allow", 
     "Action": [ 
     "s3:PutObject", 
     "s3:GetObject", 
     "s3:DeleteObject" 
     ], 
     "Resource": ["arn:aws:s3:::my-bucket/*"] 
    } 
    ] 
} 

Я получил эту политику от "Образец 1" по следующей ссылке:

http://blogs.aws.amazon.com/security/post/Tx3VRSWZ6B3SHAV/Writing-IAM-Policies-How-to-grant-access-to-an-Amazon-S3-bucket

В моей production.rb файле, Я применил настройки конфигурации, чтобы сообщить скрепкой использовать S3:

config.paperclip_defaults = { 
    :storage => :s3, 
    :s3_credentials => { 
    :bucket => 'my-bucket', 
    :access_key_id => ENV['AWS_ACCESS_KEY_ID'], 
    :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'] 
    } 
} 

Когда я пытаюсь использовать свое приложение для загрузки фотографии, я получаю исключение AWS::S3::Errors::AccessDenied.

Как ни странно, если я загрузить консоль рельсы и запустить следующий код вручную загрузить файл, он работает правильно:

s3 = AWS::S3.new(access_key_id: ENV['AWS_ACCESS_KEY_ID'], secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']) 
bucket = s3.buckets['my-bucket'] 
obj = bucket.objects['new_file'] 
obj.write(Pathname.new('/path/to/file')) 

Это правильно загружать файл в мой S3 ведро. Я смущен, почему у меня явно есть разрешение на загрузку файла таким образом, но когда я пытаюсь сделать это с помощью paperclip с теми же учетными данными, я получаю отказ в разрешении.

Еще более запутанным, когда я назначаю политику AdministratorAccess на my-user, paperclip может успешно загрузить файл.

Любая идея, как я могу это решить?

ответ

8

Решение здесь: https://stackoverflow.com/a/19185045/736864

Когда скрепка загружает файл в S3, он также пытается установить файл, чтобы быть в открытом доступе, что означает, что пользователь должен иметь доступ для установки разрешений. Добавление разрешения s3:PutObjectAcl в мою политику IAM устранило проблему.

Смежные вопросы