Ошибка загрузки Amazon S3 - доступ запрещен

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

{
    "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)



ОБНОВЛЕНИЕ

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 создает некоторое количество сегментов, и мой вариант использования предполагает использование моего существующего сегмента.


person 1110    schedule 03.02.2019    source источник
comment
Вы уверены, что эта ошибка связана с S3? Ничего не показывает в трассировке стека. Можете ли вы добавить отрывок из кода к вопросу? Также: это ваша демо-версия? Имена сегментов глобально уникальны, и я был бы удивлен, что у вас есть ведро с именем demo. Команда aws s3 ls --region us-east-1 отобразит ваше ведро. Я держу пари, что вы пытаетесь получить доступ к ведру, которое вам не принадлежит.   -  person Sébastien Stormacq    schedule 03.02.2019
comment
Я обновил вопрос. Если я добавлю мобильный концентратор и экспортирую из него конфигурацию, он будет работать, но создаст несколько дополнительных сегментов, и мне нужно добавить усиление в существующий проект. Никакая демонстрация - это просто пустышка, например, у нее другое название. Где мне набрать эту команду?   -  person 1110    schedule 03.02.2019


Ответы (1)


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

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

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

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

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

person Sébastien Stormacq    schedule 03.02.2019
comment
Что вы имеете в виду под «ролями, созданными с помощью усиления»? Я просто установил его в свой проект, больше ничего - person 1110; 03.02.2019
comment
Amplify - это инструмент командной строки для предоставления облачных ресурсов и библиотеки для использования в вашем клиентском приложении для легкого доступа к этим ресурсам. Ознакомьтесь с разделом «Начало работы» в ampify, чтобы узнать, как его использовать aws-amplify.github.io/docs/js/ Если вы пытаетесь использовать библиотеки Amplify со своими собственными серверными службами, вам потребуется настроить многие службы вручную, что приведет к потенциальным ошибкам. . Если вы используете Amplify в своем коде, проще позволить ему создавать и ваши облачные ресурсы. - person Sébastien Stormacq; 03.02.2019
comment
Роль, которую вы разместили в начале своего вопроса, кажется нормальной (хотя и слишком разрешительной, сущности, получающие эти разрешения, будут иметь возможность делать все на S3, включая изменение разрешений и удаление материалов, это, вероятно, не то, что Вы имели в виду). К какому объекту прикреплена эта роль? Как вы привязываете эту роль к своему коду / пользователям? Я предполагаю, что вы используете пул пользователей Cognito для аутентификации своих пользователей. Как пользователи когнитивной системы получают указанное вами разрешение? - person Sébastien Stormacq; 03.02.2019
comment
Я подумал, что будет проще использовать усилитель, чтобы подключить его и загружать файлы. Я буду продолжать использовать заранее подписанный URL. Я думаю, что лучше, если вокруг этого будет слишком много конфигураций - person 1110; 03.02.2019