2016-06-30 2 views
3

Я выполнил первые шаги here для настройки учетных данных и ведомости S3. Тогда, в моем коде, у меня есть:AWS SDK для iOS: невозможно отобразить файлы в ведре S3

func setupCredentialsProvider() { 
    let credentialsProvider = AWSCognitoCredentialsProvider(regionType:.USEast1, identityPoolId:identityPoolIdStr) 
    let configuration = AWSServiceConfiguration(region:.USEast1, credentialsProvider:credentialsProvider) 
    AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = configuration 

    AWSServiceConfiguration(region: AWSRegionType.USEast1, credentialsProvider: credentialsProvider) 
} 

func listObjects() { 
    let s3 = AWSS3.defaultS3() 

    let listObjectsRequest = AWSS3ListObjectsRequest() 
    listObjectsRequest.bucket = S3BucketName 
    s3.listObjects(listObjectsRequest).continueWithBlock { (task) -> AnyObject! in 
     if let error = task.error { 
      print("listObjects failed: [\(error)]") 
     } 
     if let exception = task.exception { 
      print("listObjects failed: [\(exception)]") 
     } 
} 

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

listObjects failed: [Error Domain=com.amazonaws.AWSServiceErrorDomain Code=11 "(null)" UserInfo={HostId=, Message=Access Denied, Code=AccessDenied, RequestId=}]

Что мне не хватает?

+0

ли ваша Cognito роль имеет разрешение перечислить s3 ведро? – Karthik

ответ

0

Если это что-то вроде проблемы, с которой я столкнулся, ваш аутентифицированный пользователь Cognito не имеет разрешения на доступ к определенному ведро S3. Чтение Understanding Amazon Cognito Authentication Part 3: Roles and Policies дал мне ключ мне нужно, а именно:

When you create your identity pool via the Cognito console, it will create two roles for you, one for authenticated users and one for unauthenticated users, but you can visit the IAM Console and create more roles than just these. You can also modify the existing roles to add support for additional services such as Amazon S3 or Amazon DynamoDB, depending on your use case.

Поэтому я решил изменить созданную роль для авторизованных пользователей, чтобы разрешить доступ к моему S3 ведро:

  1. переключитесь на IAM консоли и найти роль под названием что-то вроде: xxxx_auth_yyy - auth Подстрока является важной частью, так как она идентифицирует роль как для аутентифицированных пользователей.
  2. Используйте эту роль для назначения разрешений для аутентифицированных пользователей:
  3. Создайте политику (Политики -> Создать политику), чтобы предоставить доступ к определенному ведру.
  4. «Приложить» эту политику к аутентифицированной роли (Роли -> xxxx_auth_yyy -> Приложить политику).
  5. Ваш код должен теперь иметь возможность перечислять файлы в определенном ведре S3.

Пример политики (этап 3):

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Effect": "Allow", 
      "Action": [ 
       "s3:ListBucket", 
       "s3:GetObject", 
       "s3:PutObject" 
      ], 
      "Resource": [ 
       "arn:aws:s3:::BUCKET_NAME*" 
      ] 
     } 
    ] 
} 
Смежные вопросы