Перечислите все объекты в ведре 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, чтобы ваш код действительно извлек список нужных объектов корзины. Вот пошаговое руководство:
Примерно сделайте следующее:
- Создать S3 Bucket
- Добавить элементы к нему (объекты, которые вы хотите иметь в списке)
- В корзине Access-control отключите все права на чтение и запись (как на картинке выше)
- Перейдите на главную страницу AWS Cognito и выберите "Управление федеративными удостоверениями".
(Кстати, все эти главные страницы AWS лучше всего найти, перейдя на страницу AWS-Services и введя слова "Cognito", "IAM" или "S3" в строку поиска. Эти 3 - все, что вам нужно)
Но давайте продолжим....
Внутри "Управление федеративными удостоверениями" создайте новый
identity pool
(т. е. укажите имя - И НЕ ЗАБЫВАЙТЕ НА TAG "Разрешить доступ к неаутентифицированным личностям" (вы можете просмотреть детали и оставить их без изменений) -> Нажмите Разрешить!Немного ДОПОЛНИТЕЛЬНО: Если вы что-то напутали и хотите перезапустить: Существует небольшая вероятность того, что вышеприведенный шаг №6 не будет работать второй раз с тем же именем. В этом случае я рекомендую перейти на главную страницу "IAM" и там также удалить 2 роли, связанные с вашим пулом удостоверений (т. Е. В разделе "Роли на главной странице IAM"). После удаления ролей вы можете перезапустить создание идентификационного пула!)
Еще одно маленькое ДОПОЛНИТЕЛЬНО: обо всем, что мы делаем прямо здесь, убедитесь, что все ваши страницы основного сервиса AWS находятся в одном регионе!!! (обычно веб-страницы AWS начинаются с чего-то вроде https://eu-central-1/. или https://us-west2/. и т. д. Убедитесь, что они согласованы во всем!
Но давайте продолжим:
После создания пула идентичности вы должны получить для него идентификатор (то есть что-то вроде:
eu-central-1:368293ad-f278-35ae-2678-6d40d48de2g5
(убедитесь, что вы запомнили этот идентификатор)На главной странице "IAM" в меню "Роли" вы найдете 2 роли (которые были созданы в шаге 5-8) - нажмите на Unauth одну из двух (вы видите, что есть Auth и Unauth одна)
После нажатия кнопки Unauth вы попадаете на страницу "Сводка": там, пожалуйста, запомните роль ARN (что-то вроде
arn:aws:iam::274937169435:role/Cognito_YOURIDPOOLNAMEUnauth_Role
)Получив идентификатор, который вы сохранили, перейдите на страницу Генератор политик AWS.
Там начните заполнять форму Генератор политик:
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"
]
}
}
]
}
Имея этот JSON-файл политики, вернитесь на главную страницу корзины S3.
На главной странице "S3" перейдите в раздел -> "Разрешения" и нажмите вкладку "Политика в ведре"
Замените все, что написано в окне редактора вкладки Bucket Policy, и вставьте в него файл Policy-JSON (начиная с шага 12h).
После вставки JSON убедитесь, что вы нажали "Сохранить"
---> ЗДЕСЬ МЫ ИДЕМ!! SWFIT-КОД ДОЛЖЕН СЕЙЧАС ПОЛУЧИТЬ ВСЕ ВЕДРО-ФАЙЛЫ В ВОЗВРАЩЕНИИ ОТВЕТА НА ЗАДАЧУ!!!!!
- Необязательно: Если вам нужны какие-либо другие сервисы 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>