列出 AWS S3 存储桶中的所有对象
List all objects in AWS S3 bucket
我正在尝试找出如何列出 Swift 中 AWS S3 存储桶中的所有对象。我似乎无法在互联网上的任何地方找到信息,但也许我看起来不够努力。如果有人可以向我推荐允许我执行此操作的代码,那就太好了。
不知道你是否还需要它,但你可以:
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 提醒我不要使用已弃用的代码);)
Jan-Dawid 的答案很好 - 但是,如果您希望您的 Bucket 不 public 对所有人可用并且仍然获得 object-list 那么您必须做一些更多的东西(特别是在 AWS 设置中)为此发生(见下面你必须做的事情列表....)。
或者换句话说,您如何获得 Swift 中列出的所有对象,并将您的存储桶设置为 publicly 受限,如图所示(即无 public 访问权限)
有一种方法可以在 Swift 中执行此操作,而无需在您的应用程序中设置 AWS user-login:
创建一个 iOS 应用程序或打开您希望显示 bucket-object 列表的应用程序:
键入以下代码:
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 服务页面中执行一整套步骤,以便您的代码真正检索到所需的 bucket-objects 列表。这是一个 step-by-step 指南:
大致执行以下操作:
- 创建 S3 存储桶
- 向其中添加项目(您想要列出的对象)
- 在存储桶中Access-control关闭所有读写权限(如上图)
- 转到 AWS Cognito 主页并选择:管理联合身份
(顺便说一句,所有这些 AWS main-pages 最好在 AWS-Services page 中输入 "Cognito" 或 "IAM" 或 "S3"进入搜索栏。这3个就是你所需要的)
但让我们继续......
在 "Manage Federated Identities" 中,创建一个新的 identity pool
(即提供一个名称 - 不要忘记标记 "Enable access to unauthenticated identities"(您可以查看详细信息和保持不变)-> 按允许!
小额外:万一你弄乱了任何东西并想重新启动:上面的 step-Nr.6 有一个小的机会不能用相同的名字第二次工作。在这种情况下,我建议转到 "IAM" 主页,并在那里删除连接到您的身份池的 2 个角色(即在 IAM-main-page 中的角色下)。角色删除后,可以重新创建identity-pool!)
第二个小额外:在我们在这里所做的所有工作中,请确保您所有的 AWS-main-service 页面都在同一区域内!!! (通常 AWS-webpages 以 https://eu-central-1. or https://us-west2 等开头。确保它们始终保持一致!
但让我们继续:
创建 identity-pool 之后,您应该为其获取一个 ID(例如:eu-central-1:368293ad-f278-35ae-2678-6d40d48de2g5
(确保记下此 ID)
在 "IAM"- 主页中,在角色菜单下,您找到 2 个角色(由步骤 5-8 创建)- 单击两个角色之一的 Unauth (你看到有一个 Auth 和 Unauth 一个)
单击 Unauth 后,您将进入摘要页面:请记下角色 ARN(类似于 arn:aws:iam::274937169435:role/Cognito_YOURIDPOOLNAMEUnauth_Role
)
拿到手边的 id,转到 AWS-Policy-Generator 页面。
那里,开始填写 Policy-Generator 表格:
12a。 Select S3 Bucket Policy
作为类型
12b。选择效果 Allow
12c。在 prinicpal-field 中,粘贴您在步骤 10 中获得的 Role-ARN(类似于 arn:aws:iam::274937169435:role/Cognito_YOURIDPOOLNAMEUnauth_Role
)
12天。亚马逊服务字段应为 Amazon S3
(取消选择标签)
12e。操作应该是 ListObjects
(或 ListBuckets
,具体取决于您要执行的操作...)
12f。 Amazon 资源名称 (ARN) 应为 arn:aws:s3:::YOUR_BUCKET_NAME
(如果您希望存储桶中的所有文件最终都列在 Swift 中,则留空>
12克。按添加语句按钮
12 小时。按创建策略按钮(应该生成 JSON-file)
类似的东西:
{
"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-file,回到你的 "S3" 存储桶主页
在 "S3" 主页中,进入 --> "Persmissions" 并按标签 "Bucket Policy"
替换 Bucket Policy 选项卡编辑器中的任何内容 window - 并粘贴您的 Policy-JSON 文件(从步骤 12h 到其中)
完成 JSON 后,确保按 "Save"
---> 我们开始了! SWFIT 代码现在应该检索 RETURN 任务答案中的所有存储桶文件 !!!!!
- 可选:如果您的 iOS 应用程序中需要任何其他 AWS 服务,建议您在 info.plist 文件中使用以下条目(提供正确的 identity-pool id和地区)
如果您只想获取存储桶的对象列表,那么第 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>
我正在尝试找出如何列出 Swift 中 AWS S3 存储桶中的所有对象。我似乎无法在互联网上的任何地方找到信息,但也许我看起来不够努力。如果有人可以向我推荐允许我执行此操作的代码,那就太好了。
不知道你是否还需要它,但你可以:
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 提醒我不要使用已弃用的代码);)
Jan-Dawid 的答案很好 - 但是,如果您希望您的 Bucket 不 public 对所有人可用并且仍然获得 object-list 那么您必须做一些更多的东西(特别是在 AWS 设置中)为此发生(见下面你必须做的事情列表....)。
或者换句话说,您如何获得 Swift 中列出的所有对象,并将您的存储桶设置为 publicly 受限,如图所示(即无 public 访问权限)
有一种方法可以在 Swift 中执行此操作,而无需在您的应用程序中设置 AWS user-login:
创建一个 iOS 应用程序或打开您希望显示 bucket-object 列表的应用程序:
键入以下代码:
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 服务页面中执行一整套步骤,以便您的代码真正检索到所需的 bucket-objects 列表。这是一个 step-by-step 指南:
大致执行以下操作:
- 创建 S3 存储桶
- 向其中添加项目(您想要列出的对象)
- 在存储桶中Access-control关闭所有读写权限(如上图)
- 转到 AWS Cognito 主页并选择:管理联合身份
(顺便说一句,所有这些 AWS main-pages 最好在 AWS-Services page 中输入 "Cognito" 或 "IAM" 或 "S3"进入搜索栏。这3个就是你所需要的)
但让我们继续......
在 "Manage Federated Identities" 中,创建一个新的
identity pool
(即提供一个名称 - 不要忘记标记 "Enable access to unauthenticated identities"(您可以查看详细信息和保持不变)-> 按允许!小额外:万一你弄乱了任何东西并想重新启动:上面的 step-Nr.6 有一个小的机会不能用相同的名字第二次工作。在这种情况下,我建议转到 "IAM" 主页,并在那里删除连接到您的身份池的 2 个角色(即在 IAM-main-page 中的角色下)。角色删除后,可以重新创建identity-pool!)
第二个小额外:在我们在这里所做的所有工作中,请确保您所有的 AWS-main-service 页面都在同一区域内!!! (通常 AWS-webpages 以 https://eu-central-1. or https://us-west2 等开头。确保它们始终保持一致!
但让我们继续:
创建 identity-pool 之后,您应该为其获取一个 ID(例如:
eu-central-1:368293ad-f278-35ae-2678-6d40d48de2g5
(确保记下此 ID)在 "IAM"- 主页中,在角色菜单下,您找到 2 个角色(由步骤 5-8 创建)- 单击两个角色之一的 Unauth (你看到有一个 Auth 和 Unauth 一个)
单击 Unauth 后,您将进入摘要页面:请记下角色 ARN(类似于
arn:aws:iam::274937169435:role/Cognito_YOURIDPOOLNAMEUnauth_Role
)拿到手边的 id,转到 AWS-Policy-Generator 页面。
那里,开始填写 Policy-Generator 表格:
12a。 Select
S3 Bucket Policy
作为类型12b。选择效果
Allow
12c。在 prinicpal-field 中,粘贴您在步骤 10 中获得的 Role-ARN(类似于
arn:aws:iam::274937169435:role/Cognito_YOURIDPOOLNAMEUnauth_Role
)12天。亚马逊服务字段应为
Amazon S3
(取消选择标签)12e。操作应该是
ListObjects
(或ListBuckets
,具体取决于您要执行的操作...)12f。 Amazon 资源名称 (ARN) 应为
arn:aws:s3:::YOUR_BUCKET_NAME
(如果您希望存储桶中的所有文件最终都列在 Swift 中,则留空>12克。按添加语句按钮
12 小时。按创建策略按钮(应该生成 JSON-file)
类似的东西:
{
"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-file,回到你的 "S3" 存储桶主页
在 "S3" 主页中,进入 --> "Persmissions" 并按标签 "Bucket Policy"
替换 Bucket Policy 选项卡编辑器中的任何内容 window - 并粘贴您的 Policy-JSON 文件(从步骤 12h 到其中)
完成 JSON 后,确保按 "Save"
---> 我们开始了! SWFIT 代码现在应该检索 RETURN 任务答案中的所有存储桶文件 !!!!!
- 可选:如果您的 iOS 应用程序中需要任何其他 AWS 服务,建议您在 info.plist 文件中使用以下条目(提供正确的 identity-pool id和地区)
如果您只想获取存储桶的对象列表,那么第 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>