繁体   English   中英

列出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不向所有人公开,并且仍然可以获得对象列表,那么你必须做更多的事情(特别是在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服务页面内执行一系列步骤,以便您的代码真正检索所需的存储桶对象列表。 以下是分步指导:

粗略地,执行以下操作:

  1. 创建一个S3 Bucket
  2. 添加项目(您要列出的对象)
  3. 在存储桶中,访问控制关闭所有读写访问权限(如上图所示)
  4. 转到AWS Cognito主页,然后选择:管理联合身份

(顺便说一句,所有这些AWS主页最好找到AWS-Services页面,并在搜索栏中输入“Cognito”或“IAM”或“S3”字样。这些都是您需要的3个)

在此输入图像描述

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

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

  2. Little EXTRA:如果你搞砸了什么并且想要重新启动:上面的步骤Nr.6有可能第二次使用相同的名称。 在这种情况下,我建议转到“IAM”主页,同时删除连接到您的身份池的2个角色(即在IAM-main-page中的Roles下)。 删除角色后,可以重新开始创建标识池!)

  3. 第二个小额外的东西:我们在这里做的就是,请确保您所有的AWS主服务页面都在同一个区域! (通常情况下,AWS网页以https:// eu-central-1https:// us-west2开头 。确保它们始终保持一致!

但是让我们继续:

  1. 创建身份池后,你应该得到一个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. 在那里,开始填写政策生成者表格:

    12A。 选择S3 Bucket Policy作为类型

    12B。 选择效果Allow

    12C。 在prinicpal-field中,粘贴你在Step-10中获得的Role-ARN(类似于arn:aws:iam::274937169435:role/Cognito_YOURIDPOOLNAMEUnauth_Role

    12D。 亚马逊服务字段应为Amazon S3 (取消选择保留标记)

    12E。 动作应该是ListObjects (或ListBuckets取决于你想做什么......)

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

    12克。 按添加语句按钮

    12小时。 按Create Policy按钮(应生成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"
        ]
      }
    }
  ]
}
  1. 有了这个Policy JSON文件,请返回“S3”存储桶主页

  2. 在“S3”主页面下,转到 - >“Persmissions”,然后按“Bucket Policy”选项卡

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

  4. 在设置JSON之后,请确保按“保存”

--->这里我们去!! SWFIT代码现在应该在返回任务中回收所有桶文件!!!!!

  1. 可选:如果您的iOS应用程序中需要任何其他AWS服务,建议您在info.plist文件中使用以下条目(提供正确的标识池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>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM