Перечислите все объекты в ведре AWS S3

Я пытаюсь выяснить, как составить список всех объектов из корзины AWS S3 в Swift. Я не могу найти информацию где-либо в Интернете, но, возможно, я не выглядел достаточно усердно. Если бы кто-нибудь мог направить меня к коду, который позволил бы мне сделать это, это было бы здорово.

2 ответа

Решение

Не знаю, нужно ли вам это, но вот, пожалуйста

let credentialsProvider = AWSStaticCredentialsProvider(accessKey: "ACCESS KEY", secretKey: "SECRET KEY")
    let configuration = AWSServiceConfiguration(region: .USWest2, credentialsProvider: credentialsProvider)
    AWSS3.registerS3WithConfiguration(configuration, forKey: "defaultKey")
    let s3 = AWSS3.S3ForKey("defaultKey")

    let listRequest: AWSS3ListObjectsRequest = AWSS3ListObjectsRequest()
    listRequest.bucket = "BUCKET"

    s3.listObjects(listRequest).continueWithBlock { (task) -> AnyObject? in
        print("call returned")
        let listObjectsOutput = task.result;
        for object in (listObjectsOutput?.contents)! {

            print(object.key)
        }

        return nil
    }

(Спасибо Дэниелу за напоминание не использовать устаревший код);)

Ответ Яна-Давида великолепен - однако, если вы хотите, чтобы ваш Bucket НЕ был общедоступным и все еще получал список объектов, вам нужно сделать еще кое-что (особенно в настройках AWS), чтобы это произошло (см. Список вещей, которые вы должны сделать ниже....).

Или, другими словами, как вы получаете все объекты, перечисленные в Swift, если ваша корзина публично ограничена, как показано на этом изображении (то есть НЕТ общедоступного доступа)

Есть способ, которым вы можете сделать это в Swift без настройки входа пользователя AWS, необходимой в вашем приложении:

Создайте приложение для iOS или откройте приложение, в котором должен отображаться список объектов:

Введите следующий код:

let myIdentityPoolId = "eu-central-1:368293ad-f278-35ae-2678-6d40d48de2g5"
let credentialsProvider:AWSCognitoCredentialsProvider = AWSCognitoCredentialsProvider(regionType: .YOUR_REGION, identityPoolId: myIdentityPoolId)
let configuration = AWSServiceConfiguration(region: .YOUR_REGION, credentialsProvider:credentialsProvider)
AWSServiceManager.default().defaultServiceConfiguration = configuration

AWSS3.register(with: configuration!, forKey: "defaultKey")
let s3 = AWSS3.s3(forKey: "defaultKey")

let listRequest: AWSS3ListObjectsRequest = AWSS3ListObjectsRequest()
listRequest.bucket = "YOUR_BUCKET_NAME"

s3.listObjects(listRequest).continueWith { (task) -> AnyObject? in
    for object in (task.result?.contents)! {
        print("Object key = \(object.key!)")
    }
    return nil
}

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

Убедитесь, что вы импортировали AWSS3:

import AWSS3

После этого вам необходимо выполнить целый набор шагов на страницах Сервиса AWS, чтобы ваш код действительно извлек список нужных объектов корзины. Вот пошаговое руководство:

Примерно сделайте следующее:

  1. Создать S3 Bucket
  2. Добавить элементы к нему (объекты, которые вы хотите иметь в списке)
  3. В корзине Access-control отключите все права на чтение и запись (как на картинке выше)
  4. Перейдите на главную страницу AWS Cognito и выберите "Управление федеративными удостоверениями".

(Кстати, все эти главные страницы AWS лучше всего найти, перейдя на страницу AWS-Services и введя слова "Cognito", "IAM" или "S3" в строку поиска. Эти 3 - все, что вам нужно)

Но давайте продолжим....

  1. Внутри "Управление федеративными удостоверениями" создайте новый identity pool (т. е. укажите имя - И НЕ ЗАБЫВАЙТЕ НА TAG "Разрешить доступ к неаутентифицированным личностям" (вы можете просмотреть детали и оставить их без изменений) -> Нажмите Разрешить!

  2. Немного ДОПОЛНИТЕЛЬНО: Если вы что-то напутали и хотите перезапустить: Существует небольшая вероятность того, что вышеприведенный шаг №6 не будет работать второй раз с тем же именем. В этом случае я рекомендую перейти на главную страницу "IAM" и там также удалить 2 роли, связанные с вашим пулом удостоверений (т. Е. В разделе "Роли на главной странице IAM"). После удаления ролей вы можете перезапустить создание идентификационного пула!)

  3. Еще одно маленькое ДОПОЛНИТЕЛЬНО: обо всем, что мы делаем прямо здесь, убедитесь, что все ваши страницы основного сервиса AWS находятся в одном регионе!!! (обычно веб-страницы AWS начинаются с чего-то вроде https://eu-central-1/. или https://us-west2/. и т. д. Убедитесь, что они согласованы во всем!

Но давайте продолжим:

  1. После создания пула идентичности вы должны получить для него идентификатор (то есть что-то вроде: eu-central-1:368293ad-f278-35ae-2678-6d40d48de2g5 (убедитесь, что вы запомнили этот идентификатор)

  2. На главной странице "IAM" в меню "Роли" вы найдете 2 роли (которые были созданы в шаге 5-8) - нажмите на Unauth одну из двух (вы видите, что есть Auth и Unauth одна)

  3. После нажатия кнопки Unauth вы попадаете на страницу "Сводка": там, пожалуйста, запомните роль ARN (что-то вроде arn:aws:iam::274937169435:role/Cognito_YOURIDPOOLNAMEUnauth_Role)

  4. Получив идентификатор, который вы сохранили, перейдите на страницу Генератор политик AWS.

  5. Там начните заполнять форму Генератор политик:

    12а. Выбрать S3 Bucket Policy как тип

    12b. Выбранный эффект Allow

    12с. В поле prinicpal вставьте Role-ARN, полученный на шаге 10 (что-то вроде arn:aws:iam::274937169435:role/Cognito_YOURIDPOOLNAMEUnauth_Role)

    12г. Поле Amazon Service должно быть Amazon S3 (оставить метку снятой)

    12е. Действия должны быть ListObjects (или же ListBuckets в зависимости от того, что вы хотите сделать...)

    12f. Название ресурса Amazon (ARN) должно быть arn:aws:s3:::YOUR_BUCKET_NAME(если вы хотите, чтобы все файлы из вашей корзины в конечном итоге были перечислены в Swift, оставьте поле пустым>

    12г. Нажмите кнопку Добавить выписку

    12h. Нажмите кнопку "Создать политику" (которая должна сгенерировать JSON-файл)

Что-то вроде того:

{
  "Id": "Policy2846208763429",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt98475983711245435",
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME",
      "Principal": {
        "AWS": [
          "arn:aws:iam::274937169435:role/Cognito_YOURIDPOOLNAMEUnauth_Role"
        ]
      }
    }
  ]
}
  1. Имея этот JSON-файл политики, вернитесь на главную страницу корзины S3.

  2. На главной странице "S3" перейдите в раздел -> "Разрешения" и нажмите вкладку "Политика в ведре"

  3. Замените все, что написано в окне редактора вкладки Bucket Policy, и вставьте в него файл Policy-JSON (начиная с шага 12h).

  4. После вставки JSON убедитесь, что вы нажали "Сохранить"

---> ЗДЕСЬ МЫ ИДЕМ!! SWFIT-КОД ДОЛЖЕН СЕЙЧАС ПОЛУЧИТЬ ВСЕ ВЕДРО-ФАЙЛЫ В ВОЗВРАЩЕНИИ ОТВЕТА НА ЗАДАЧУ!!!!!

  1. Необязательно: Если вам нужны какие-либо другие сервисы AWS в вашем приложении для iOS, рекомендуется использовать следующую запись в файле info.plist (предоставляя правильный идентификатор пула идентификаторов и регион)

Шаг № 17 не является действительно необходимым, если вы хотите получить только список объектов вашего сегмента.

    <key>AWS</key>
    <dict>
        <key>CredentialsProvider</key>
        <dict>
            <key>CognitoIdentity</key>
            <dict>
                <key>Default</key>
                <dict>
                    <key>PoolId</key>
                    <string>eu-central-1:368293ad-f278-35ae-2678-6d40d48de2g5</string>
                    <key>Region</key>
                    <string>eu-central-1</string>
                </dict>
            </dict>
        </dict>
        <key>S3TransferUtility</key>
        <dict>
            <key>Default</key>
            <dict>
                <key>Region</key>
                <string>eu-central-1</string>
            </dict>
        </dict>
    </dict>
Другие вопросы по тегам