2013-12-05 10 views
5

Я вижу другое поведение AWS s3 Ls и AWS s3api список-ковширазличное поведение для "AWS s3 LS" и "AWS s3api список-объектов"

Вот первый один:

$ aws s3 ls s3://demo.for.customers 

Bucket: demo.for.customers 
Prefix: 

     LastWriteTime  Length Name 
     -------------  ------ ---- 
          PRE 5CE4D191-FD14-4C85-8146-9FB8C29B7A7B/ 
          PRE FFBC4675-F864-40E9-8AB8-BDF7A0437010/ 

Итак, я могу перечислить все объекты в ведре demo.for.customers

Теперь, когда я бегу то же самое, используя s3api, я получаю доступ запрещен:

$ aws s3api list-objects --bucket demo.for.customers 
A client error (AccessDenied) occurred: Access Denied 

ВОПРОС: Почему я получаю доступ запрещен для перечисления объектов с помощью s3api.

Причина, по которой я поднимаю эту проблему, заключается в том, что у меня такая же проблема, если я использую AWS S3 Ruby SDK.

Однако все в порядке, когда я использую aws s3 ls.

Так AWS S3 рубин SDK и AWS s3api выставляют такое же поведение. Итак, я вставляю только aws s3api CLI.

Кстати, здесь IAM политика, которая была применена к пользователю, который работает все выше команды:

{ 
    "Statement": [ 
    { 
     "Action": [ 
     "s3:ListAllMyBuckets", 
     "s3:GetBucketLocation" 
     ], 
     "Effect": "Allow", 
     "Resource": [ 
     "arn:aws:s3:::" 
     ] 
    }, 
    { 
     "Action": [ 
     "s3:ListBucket" 
     ], 
     "Effect": "Allow", 
     "Resource": [ 
     "arn:aws:s3:::demo.for.customers" 
     ], 
     "Condition": { 
     "StringEquals": { 
      "s3:prefix": [ 
      "", 
      "FFBC4675-F864-40E9-8AB8-BDF7A0437010/" 
      ], 
      "s3:delimiter": [ 
      "/" 
      ] 
     } 
     } 
    }, 
    { 
     "Effect": "Allow", 
     "Action": [ 
     "s3:PutObject", 
     "s3:GetObject", 
     "s3:DeleteObject" 
     ], 
     "Resource": [ 
     "arn:aws:s3:::demo.for.customers/FFBC4675-F864-40E9-8AB8-BDF7A0437010/" 
     ] 
    } 
    ] 
} 

А вот рубин код, который производит ту же самую ошибку;

#!/usr/bin/ruby 

require 'aws-sdk' 
require 'awesome_print' 
AWS.config(:access_key_id  => 'whatever', 
      :secret_access_key => 'again whatever', 
      :region    => 'us-west-2') 

s3 = AWS.s3 
buckets = s3.client.list_objects(:bucket_name => "demo.for.customers") 
ap buckets 

и выход:

# ruby s3policies.rb 
/var/lib/gems/1.9.1/gems/aws-sdk-1.14.1/lib/aws/core/client.rb:366:in `return_or_raise': Access Denied (AWS::S3::Errors::AccessDenied) 
+2

Я столкнулся с этим вопросом ранее сегодня. Я перешел к моему ведру и выбранным свойствам и изменил разрешения на «Аутентифицированные пользователи», и теперь все хорошо. –

ответ

4

На основе роли вы определили, вызов к списку-объектов требует как префикс и Разделитель.

Следующая команда будет работать для вас:

aws s3api list-objects --bucket demo.for.customers --prefix "" --delimiter "/" 

Если удалить условие Разделитель в пределах вашей политики ListBucket, то это будет работать для вас:

aws s3api list-objects --bucket demo.for.customers --prefix "" 

И если вы также удалить Префикс, то это будет работать на вас:

aws s3api list-objects --bucket demo.for.customers 

Хороший способ проверить выше - дублировать свою политическую политику и постепенно удалять Условия до тех пор, пока она не будет функционировать должным образом.

-1

Убедитесь, что из местоположения (каталога), в котором выполняется эта утилита, установлены соответствующие разрешения.

В каталоге должно быть правильное владение (владелец должен быть пользователем, использующим эту утилиту, а не root или любым другим пользователем) и иметь достаточные разрешения для создания каталогов.

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