Swift 列出AWS S3 bucket中的所有对象

Swift 列出AWS S3 bucket中的所有对象,swift,amazon-web-services,amazon-s3,bucket,Swift,Amazon Web Services,Amazon S3,Bucket,我试图找出如何在Swift中列出AWS S3存储桶中的所有对象。我似乎在互联网上的任何地方都找不到这些信息,但可能是我找得不够仔细。如果有人能让我参考允许我这样做的代码,那就太好了。不知道您是否还需要它,但现在您可以开始了: let credentialsProvider = AWSStaticCredentialsProvider(accessKey: "ACCESS KEY", secretKey: "SECRET KEY") let configuration = AWSServi

我试图找出如何在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公开给所有人,并且仍然可以获得对象列表,那么你必须做更多的事情(特别是在AWS设置中)来实现这一点(请参阅下面的事情列表…)

或者换句话说,您如何使Swift中列出的所有对象将您的存储桶设置为公共限制,如图所示(即,无公共访问权)

有一种方法可以在Swift中实现,而无需在应用程序中设置AWS用户登录:

创建iOS应用程序或打开希望bucket对象列表显示的应用程序:

键入以下代码:

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列表。以下是一个分步指导:

大致上,请执行以下操作:

  • 创建一个S3存储桶
  • 向其中添加项目(要列出的对象)
  • 在bucket访问控制中,关闭所有读写访问(如上图所示)
  • 转到AWS Cognito主页并选择:管理联合身份
  • (顺便说一句,所有这些AWS主页都可以在上找到,并在搜索栏中键入“Cognito”或“IAM”或“S3”。这3个是您所需要的全部)

    但让我们继续

  • 在“管理联合身份”中,创建一个新的
    身份池
    (即提供一个名称-不要忘记标记“启用对未经身份验证身份的访问”(您可以查看详细信息并保持不变)->按允许

  • 额外提示:如果您把事情搞砸了,想要重新启动:以上步骤第6步很有可能在同名的情况下第二次不起作用。在这种情况下,我建议转到“IAM”主页,并在那里删除连接到您的身份池的2个角色(即IAM主页中的角色下)。删除角色后,您可以重新开始创建标识池!)

  • 第二点额外注意:在我们这里所做的所有工作中,请确保您的所有AWS主要服务页面都位于同一区域!!!(通常AWS网页以.or.等开头。确保它们在整个过程中保持一致

  • 但让我们继续:

  • 创建标识池后,您应该为其获取一个id(例如:
    eu-central-1:368293ad-f278-35ae-2678-6d40d48de2g5
    (请确保记下此id)

  • 在“IAM”-主页面的“角色”菜单下,您可以找到两个角色(由步骤5-8创建)-单击两个角色中的“未授权”一个(您可以看到有一个“授权”和“未授权”)

  • 单击Unauth后,您将进入摘要页面:请注意角色ARN(类似于
    ARN:aws:iam::274937169435:Role/Cognito_youridpoolnameunath_Role

  • 把身份证拿在手里,转到页面

  • 在这里,开始填写策略生成器表单:

    12a.选择
    S3 Bucket Policy
    作为类型

    12b.选择效果
    Allow

    12c.在prinicpal字段中,粘贴您在步骤10中获得的角色ARN(类似于
    ARN:aws:iam::274937169435:Role/Cognito_youridpoolnameunath_Role

    12d.Amazon服务字段应为
    Amazon S3
    (取消选择离开标记)

    12e.操作应该是
    ListObjects
    (或者
    listBucket
    ,具体取决于您想做什么…)

    12f.亚马逊资源名称(ARN)应该是
    ARN:aws:s3:::您的_BUCKET_Name
    (如果您希望存储桶中的所有文件最终都列在Swift中,请留空>

    12g.按添加语句按钮

    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”bucket主页

  • 在“S3”主页内,进入-->“任务”下,然后按选项卡“Bucket Policy”

  • 替换Bucket Policy选项卡编辑器窗口中写入的任何内容,并粘贴策略JSON文件(从步骤12h.开始)

  • 在跳过JSON后,确保按“保存”

  • --->我们开始了!!SWFIT代码现在应该检索返回任务答案中的所有BUCKET文件

  • 可选:如果您需要iOS应用程序中的任何其他AWS服务,建议您在info.plist文件中使用以下条目(提供正确的标识池id和区域)
  • 如果您只想获取bucket的对象列表,那么步骤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>
    
    AWS
    证书提供者
    同源性
    违约
    普利德
    eu-central-1:368293ad-f278-35ae-2678-6d40d48de2g5
    区域
    欧盟-中央-1
    S3TransferUtility
    违约
    区域
    欧盟-中央-1
    
    帮了大忙-谢谢!(不要忘了
    区域
    !!与两个键一样重要-当然还有桶名)。一个问题:提供的解决方案是否真的有