【发布时间】:2015-10-23 02:42:26
【问题描述】:
我试图弄清楚如何在 Swift 中列出 AWS S3 存储桶中的所有对象。我似乎无法在互联网上的任何地方找到信息,但也许我看起来不够努力。如果有人可以向我推荐允许我这样做的代码,那就太好了。
【问题讨论】:
标签: swift amazon-web-services amazon-s3 bucket
我试图弄清楚如何在 Swift 中列出 AWS S3 存储桶中的所有对象。我似乎无法在互联网上的任何地方找到信息,但也许我看起来不够努力。如果有人可以向我推荐允许我这样做的代码,那就太好了。
【问题讨论】:
标签: swift amazon-web-services amazon-s3 bucket
不知道你是否还需要它,但你去吧:
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
}
(感谢 Daniel 提醒我不要使用已弃用的代码);)
【讨论】:
region !!!! 与两个键同样重要——当然还有存储桶名称)。一个问题:是否确实提供了您的解决方案,需要将存储桶设置为public-read(即允许列表对象)?如果是,是否有更好的解决方案可以将存储桶设为私有但仍使用您提供的解决方案??
Jan-Dawid 的回答很好 - 但是,如果您不希望您的 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 服务页面中执行一整套步骤,以便您的代码真正检索所需的存储桶对象列表。以下是分步指南:
大致如下:
(顺便说一句,所有这些 AWS 主页都可以在 AWS-Services page 上找到,然后在搜索栏中输入“Cognito”或“IAM”或“S3”这些词。这三个就是你所需要的)
但是让我们继续......
在“管理联合身份”中,创建一个新的identity pool(即提供一个名称 - 并且不要忘记标记“启用对未经身份验证的身份的访问”(您可以查看详细信息并保持不变) -> 按允许!
Little EXTRA:万一你搞砸了,想重新开始:上面的步骤-Nr.6 有可能在第二次使用相同的名称时不起作用。在这种情况下,我建议转到“IAM”主页并在那里删除连接到您的身份池的 2 个角色(即在 IAM 主页中的角色下)。删除角色后,您可以重新开始创建身份池!)
第二个小额外:通过我们在这里所做的一切,请确保您所有的 AWS 主要服务页面都在同一区域内!!! (通常,AWS 网页以 https://eu-central-1. 或 https://us-west2. 等开头。确保它们始终保持一致!
但让我们继续:
创建身份池后,您应该获得一个 ID(例如:eu-central-1:368293ad-f278-35ae-2678-6d40d48de2g5(确保记下此 ID)
在“IAM”主页面的“角色”菜单下,您会找到 2 个角色(由步骤 5-8 创建) - 单击两个角色中的一个(您会看到有一个Auth 和 Unauth 一个)
单击 Unauth 后,您将进入摘要页面:请注意角色 ARN(类似于 arn:aws:iam::274937169435:role/Cognito_YOURIDPOOLNAMEUnauth_Role)
手头有您保存的 ID,转到 AWS-Policy-Generator 页面。
在那里,开始填写策略生成器表单:
12a。选择S3 Bucket Policy作为类型
12b。选择效果Allow
12c。在 prnicpal-field 中,粘贴您在步骤 10 中获得的 Role-ARN(类似于arn:aws:iam::274937169435:role/Cognito_YOURIDPOOLNAMEUnauth_Role)
12 天。亚马逊服务字段应为Amazon S3(取消选中标签)
12e。操作应为ListObjects(或ListBuckets,具体取决于您想要做什么......)
12 楼。 Amazon 资源名称 (ARN) 应为 arn:aws:s3:::YOUR_BUCKET_NAME
(如果您希望存储桶中的所有文件最终都在 Swift 中列出,请留空>
12 克。按添加语句按钮
12 小时。按创建策略按钮(应该生成一个 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 代码现在应该在返回任务答案中检索所有存储桶文件!!!!!!
如果您只想获取存储桶的对象列表,则实际上不需要步骤 Nr17。
<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>
【讨论】: