Не удалось загрузить Amazon S3 - доступ запрещен - PullRequest
0 голосов
/ 03 февраля 2019

Я пытаюсь загрузить файлы через AWS Amplify в существующую корзину s3. Я не использую AWS MobileHub .Я создал новый Identity Pool в соответствии с этим руководством , и в конце концов это моя политика для этой роли:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:*",
                "mobileanalytics:PutEvents",
                "cognito-sync:*"
            ],
            "Resource": "*"
        }
    ]
}

В своем коде я настроил Amplify следующим образом:

Amplify.configure({
  'aws_cognito_identity_pool_id': 'us-east-2:f37baa...',
  'aws_cognito_region': 'us-east-2',
  'aws_user_files_s3_bucket': 'demo',
  'aws_user_files_s3_bucket_region': 'us-east-1',
});

И я получаю ошибку:

Error: Access Denied
    at Request.extractError (s3.js:580)
    at Request.callListeners (aws-sdk-core-react-native.js:3610)
    at Request.emit (aws-sdk-core-react-native.js:3582)
    at Request.emit (aws-sdk-core-react-native.js:7723)
    at Request.transition (aws-sdk-core-react-native.js:7062)
    at AcceptorStateMachine.runTo (aws-sdk-core-react-native.js:7867)
    at aws-sdk-core-react-native.js:7879
    at Request.<anonymous> (aws-sdk-core-react-native.js:7078)
    at Request.<anonymous> (aws-sdk-core-react-native.js:7725)
    at Request.callListeners (aws-sdk-core-react-native.js:3620)

UPDATE

import Amplify from 'aws-amplify';
import { Storage } from 'aws-amplify';

Amplify.configure({
  'aws_cognito_identity_pool_id': 'us-east-2:f37...',
  'aws_cognito_region': 'us-east-2',
  'aws_user_files_s3_bucket': 'demo',
  'aws_user_files_s3_bucket_region': 'us-east-1',
});

export default class App extends Component<Props> {
...
uploadImage = async uri => {
    const fileName = 'example.jpg';
    await Storage.put(fileName, blob, {
      contentType: 'image/jpeg',
      level: 'public'
    }).then(data => console.log(data))
      .catch(err => console.log(err))

Это весь код, и я просто не добавил файл для получения, но он работает точно.Когда я использую мобильный концентратор aws-exports.js, я могу выгружать файлы, но MobileHub создает некоторую корзину, и мой сценарий использования включает использование моей существующей корзины.

1 Ответ

0 голосов
/ 03 февраля 2019

Так что, если я правильно понимаю, ваш код пытается получить доступ к существующим корзинам S3, а не к тому, который создан Amplify / Mobile Hub?

Если я прав, вам нужно обновить политики Cognito, чтобы предоставить пользователям доступ к существующему S3 Bucket.

В консоли IAM -> Roles вы найдете две роли, созданные Amplify.Имена ролей YOUR_PROJECT____DATE_TAG___[un]authrole Например, в моей консоли: photoalbums-20190202155011-unauthRole и photoalbums-20190202155011-authRole

В зависимости от того, хотите ли вы предоставить доступ аутентифицированным или не прошедшим проверку пользователям, измените соответствующую роль или обе роли, если хотитеИ аутентифицированный, и не аутентифицированный пользователь имеют доступ к S3.

Добавление управляемой политики S3 AmazonS3ReadOnlyAccess предоставит вашему пользователю доступ только для чтения к вашей корзине.(Пожалуйста, не добавляйте AmazonS3FullAccess или s3:*, поскольку это даст пользователю возможность создавать и удалять корзины и объекты в вашей учетной записи)

...