列出 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 指南:

大致执行以下操作:

  1. 创建 S3 存储桶
  2. 向其中添加项目(您想要列出的对象)
  3. 在存储桶中Access-control关闭所有读写权限(如上图)
  4. 转到 AWS Cognito 主页并选择:管理联合身份

(顺便说一句,所有这些 AWS main-pages 最好在 AWS-Services page 中输入 "Cognito" 或 "IAM" 或 "S3"进入搜索栏。这3个就是你所需要的)

但让我们继续......

  1. 在 "Manage Federated Identities" 中,创建一个新的 identity pool(即提供一个名称 - 不要忘记标记 "Enable access to unauthenticated identities"(您可以查看详细信息和保持不变)-> 按允许!

  2. 小额外:万一你弄乱了任何东西并想重新启动:上面的 step-Nr.6 有一个小的机会不能用相同的名字第二次工作。在这种情况下,我建议转到 "IAM" 主页,并在那里删除连接到您的身份池的 2 个角色(即在 IAM-main-page 中的角色下)。角色删除后,可以重新创建identity-pool!)

  3. 第二个小额外:在我们在这里所做的所有工作中,请确保您所有的 AWS-main-service 页面都在同一区域内!!! (通常 AWS-webpages 以 https://eu-central-1. or https://us-west2 等开头。确保它们始终保持一致!

但让我们继续:

  1. 创建 identity-pool 之后,您应该为其获取一个 ID(例如:eu-central-1:368293ad-f278-35ae-2678-6d40d48de2g5(确保记下此 ID)

  2. 在 "IAM"- 主页中,在角色菜单下,您找到 2 个角色(由步骤 5-8 创建)- 单击两个角色之一的 Unauth (你看到有一个 Auth 和 Unauth 一个)

  3. 单击 Unauth 后,您将进入摘要页面:请记下角色 ARN(类似于 arn:aws:iam::274937169435:role/Cognito_YOURIDPOOLNAMEUnauth_Role

  4. 拿到手边的 id,转到 AWS-Policy-Generator 页面。

  5. 那里,开始填写 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"
        ]
      }
    }
  ]
}
  1. 有了这个政策 JSON-file,回到你的 "S3" 存储桶主页

  2. 在 "S3" 主页中,进入 --> "Persmissions" 并按标签 "Bucket Policy"

  3. 替换 Bucket Policy 选项卡编辑器中的任何内容 window - 并粘贴您的 Policy-JSON 文件(从步骤 12h 到其中)

  4. 完成 JSON 后,确保按 "Save"

---> 我们开始了! SWFIT 代码现在应该检索 RETURN 任务答案中的所有存储桶文件 !!!!!

  1. 可选:如果您的 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>