Хобрук: Ваш путь к мастерству в программировании

Загрузка файлов на AWS S3 Bucket [студия Android]

Я пытаюсь загрузить файлы из студии Android в AWS S3 Bucket. Я создал новую учетную запись AWS. Похоже, это проблема с кодом проверки / авторизации. Может ли кто-нибудь помочь в выяснении основной причины этого и как это можно решить?

Пожалуйста, дайте мне знать, если потребуется дополнительная информация.

Спасибо,

Политика ведра:

{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:PutObject"

            ],
            "Resource": "arn:aws:s3:::mybucket/*"
        }
    ]
}

Предупреждение в журнале отладки:

D/CognitoCachingCredentialsProvider﹕ Loading credentials from SharedPreferences
D/CognitoCachingCredentialsProvider﹕ No valid credentials found in SharedPreferences
I/AmazonHttpClient﹕ Unable to execute HTTP request: Read timed out
    java.net.SocketTimeoutException: Read timed out
            at com.android.org.conscrypt.NativeCrypto.SSL_read(Native Method)
            at com.android.org.conscrypt.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketImpl.java:674)
            at com.android.okio.Okio$2.read(Okio.java:113)
            at com.android.okio.RealBufferedSource.indexOf(RealBufferedSource.java:147)
            at com.android.okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:94)
            at com.android.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:175)
            at com.android.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:101)
            at com.android.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:616)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:379)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:323)
            at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponseMessage(HttpURLConnectionImpl.java:487)
            at com.android.okhttp.internal.http.DelegatingHttpsURLConnection.getResponseMessage(DelegatingHttpsURLConnection.java:109)
            at com.android.okhttp.internal.http.HttpsURLConnectionImpl.getResponseMessage(HttpsURLConnectionImpl.java:25)
            at com.amazonaws.http.UrlHttpClient.execute(UrlHttpClient.java:62)
            at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:353)
            at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:196)
            at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4234)
            at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1644)
            at com.amazonaws.mobileconnectors.s3.transfermanager.internal.UploadCallable.uploadInOneChunk(UploadCallable.java:134)
            at com.amazonaws.mobileconnectors.s3.transfermanager.internal.UploadCallable.call(UploadCallable.java:126)
            at com.amazonaws.mobileconnectors.s3.transfermanager.internal.UploadMonitor.upload(UploadMonitor.java:182)
            at com.amazonaws.mobileconnectors.s3.transfermanager.internal.UploadMonitor.call(UploadMonitor.java:140)
            at com.amazonaws.mobileconnectors.s3.transfermanager.internal.UploadMonitor.call(UploadMonitor.java:54)
            at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:818)

Код:

// Variables Values:
private static final String AWS_ACCOUNT_ID = "078xxxxxxx91";
    private static final String COGNITO_POOL_ID = "eu-west-1:9xxxxx16-4xx2-4xxa-axx1-44cxxxxxxxf5";
    private static final String COGNITO_ROLE_UNAUTH = "arn:aws:iam::078xxxxxxx91:role/Cognito_ABCUnauth_Role";
    private static final String BUCKET_NAME = "mybucket";

   private void uploadImagesToServer() {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    AWSCredentialsProvider credProvider = null;
                    credProvider = getCredProvider(credProvider, getApplicationContext());
                    TransferManager transferManager = new TransferManager(credProvider);
            for(int i=0; i<imagesPath.size(); i++) {
                File file = new File(imagesPath.get(i));
                String fileName = file.getName();
                Upload upload = transferManager.upload(BUCKET_NAME, fileName, file);                        
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
});
thread.start();
}

public static AWSCredentialsProvider getCredProvider(AWSCredentialsProvider sCredProvider,
                                                     Context appContext) {
    if(sCredProvider == null) {
        sCredProvider = new CognitoCachingCredentialsProvider(
                appContext,
                AWS_ACCOUNT_ID, COGNITO_POOL_ID, COGNITO_ROLE_UNAUTH,
                null, Regions.EU_WEST_1);
        sCredProvider.refresh();
    }
    return sCredProvider;
}

Ответы:


1

Журнал показывает Request ARN is invalid. Это потому, что COGNITO_ROLE_UNAUTH - пустая строка. Получите роль arn из IAM или скопируйте образец кода с консоли.

Затем вы видите Not authorized to perform sts:AssumeRoleWithWebIdentity исключение. Это происходит, когда провайдер учетных данных запрашивает у STS роль, которую вы указали для учетных данных сеанса, но ваша роль не настроена на доверие Cognito.

Судя по названию, роль была создана вами, а не той, которая создается Cognito в консоли. Я считаю, что вы забываете о доверительных отношениях. Перейдите в консоль IAM, отредактируйте роль, прокрутите вниз до конца и нажмите «Изменить отношения доверия». Убедитесь, что у вас есть что-то вроде следующего (замените идентификатор пула идентификатором пула идентификаторов Cognito).

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Federated": "cognito-identity.amazonaws.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "cognito-identity.amazonaws.com:aud": "us-east-1:<pool_id>"
        },
        "ForAnyValue:StringLike": {
          "cognito-identity.amazonaws.com:amr": "unauthenticated"
        }
      }
    }
  ]
}
12.05.2015
  • Привет, спасибо за ваш комментарий. Я попытался добавить значение для строки COGNIT O_ROLE_UNAUTH, журнал предупреждений теперь изменен на проблему с авторизацией. Я не уверен, нужно ли мне вводить значение ARN пользователя IAM или значение ARN роли. Я пробовал оба. но не уверен, что ввожу правильные значения. Не могли бы вы помочь здесь? Спасибо. 13.05.2015
  • Это ошибка аутентификации из-за политики сегмента? 13.05.2015
  • Включили ли вы несанкционированный доступ для своего пула удостоверений? Он отключен по умолчанию при создании пула удостоверений. Проверьте настройку пула идентификаторов в консоли AWS. 13.05.2015
  • Спасибо, Yangfan, поле «Разрешить доступ к неавторизованным удостоверениям» уже отмечено (доступно в «Изменить пул удостоверений» - ›Настройки неаутентифицированных отступов), и проблема все еще существует. 13.05.2015
  • Вы проверили доверительные отношения роли? Смотрите мой ответ. 14.05.2015
  • Надежные отношения роли (Cognito_ABCAuthRole и Cognito_ABCUnAuthRole) точно такие же, как вы указали. 14.05.2015
  • Хм, сложно сказать, что пошло не так. Мне не нравится делать это предложение, но, возможно, стоит попробовать: воссоздайте новый пул идентификаторов, позвольте консоли сгенерировать для вас роли IAM, а затем измените роли, чтобы разрешить доступ S3. 15.05.2015
  • Пробовал еще кое-что. Но теперь я получаю это (измененный журнал в исходном запросе) как ошибку в журнале отладки. Любые предложения по решению этой проблемы, пожалуйста? 23.05.2015
  • Журнал показывает время ожидания соединения при подтверждении связи SSL с AWS. Похоже, он успешно получает учетные данные от Cognito, но не может подключиться к S3. Он все время терпит неудачу? Вы находитесь за брандмауэром или прокси-сервером? Какая модель и уровень API у вашего устройства? 26.05.2015
  • Вроде теперь нормально работает. Спасибо за вашу помощь и поддержку. 26.05.2015
  • Новые материалы

    Я собираюсь научить вас Python шаг за шагом
    Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..

    Альтернатива шаблону исходящих сообщений для архитектуры микросервисов
    Познакомьтесь с двухэтапным сообщением В этой статье предлагается альтернативный шаблон для папки Исходящие : двухэтапное сообщение. Он основан не на очереди сообщений, а на..

    React on Rails
    Основное приложение Reverb - это всеми любимый монолит Rails. Он отлично обслуживает наш API и уровень просмотра трафика. По мере роста мы добавляли больше интерактивных элементов..

    Что такое гибкие методологии разработки программного обеспечения
    Что представляют собой гибкие методологии разработки программного обеспечения в 2023 году Agile-методологии разработки программного обеспечения заключаются в следующем: И. Введение A...

    Ториго  — революция в игре Го
    Наш следующий вызов против ИИ и для ИИ. Сможет ли он победить людей в обновленной игре Го? Обратите внимание, что в следующей статье AI означает искусственный интеллект, а Goban  —..

    Простое развертывание моделей с помощью Mlflow — Упаковка классификатора обзоров продуктов NLP от HuggingFace
    Как сохранить свои модели машинного обучения в формате с открытым исходным кодом с помощью MLFlow, чтобы позже получить возможность легкого развертывания. Сегодня модели упаковки имеют несколько..

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