列出AWS S3存储桶中的所有对象

Inf*_*911 2 amazon-s3 bucket amazon-web-services swift

我试图找出如何在Swift中列出AWS S3存储桶中的所有对象.我似乎无法在互联网上找到任何信息,但也许我看起来不够努力.如果有人可以推荐我的代码,这将允许我做这将是伟大的.

Jan*_*odt 11

不知道你是否仍然需要它但是你去了:

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
    }
Run Code Online (Sandbox Code Playgroud)

(感谢Daniel提醒我不要使用弃用的代码);)


iKK*_*iKK 5

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
}
Run Code Online (Sandbox Code Playgroud)

(当然,您需要做一些化妆品来处理不会出现任何结果的情况-但我将视您情况而定。

确保确保已导入AWSS3:

import AWSS3
Run Code Online (Sandbox Code Playgroud)

之后,您需要在AWS Service页面中执行一整套步骤,以使您的代码真正检索所需的存储对象列表。这是分步指导:

大致执行以下操作:

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

(顺便说一句,最好在AWS服务页面找到所有这些AWS 主页,然后在搜索栏中输入单词“ Cognito”或“ IAM”或“ S3”。这三个都是您所需要的)

在此处输入图片说明

但是,让我们继续。

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

  2. 小小额外:如果您弄乱了任何东西并想重新启动:上面的步骤Nr.6再次使用相同的名称可能无法正常工作。在这种情况下,我建议转到“ IAM”主页,然后删除连接到您的身份池的2个角色(即IAM主页中的“角色”下)。删除角色后,您可以重新创建身份池!)

  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创建)-单击“取消身份验证”中的两个(您看到其中有一个“身份验证”和“取消身份验证”之一)。

  3. 单击“取消身份验证”后,您会进入“摘要”页面:在此处请注意Role ARN(类似arn:aws:iam::274937169435:role/Cognito_YOURIDPOOLNAMEUnauth_Role

  4. 保留您的ID,然后转到AWS-Policy-Generator页面。

  5. 在那里,开始填写“策略生成器”表单:

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

    12b。选择效果Allow

    12c。在Prinicpal字段中,粘贴您在步骤10中获得的Role-ARN(类似arn:aws:iam::274937169435:role/Cognito_YOURIDPOOLNAMEUnauth_Role

    12天 “亚马逊服务”字段应为Amazon S3(取消选择标记)

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

    12楼 亚马逊资源名称(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"
        ]
      }
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)
  1. 拥有此Policy JSON文件后,返回“ S3”存储桶主页

  2. 在“ S3”主页内,转到->“权限”,然后按“ Bucket Policy”标签

  3. 替换在“存储桶策略”标签的编辑器窗口中写入的所有内容,然后粘贴您的Policy-JSON文件(来自步骤12h。)

  4. 粘贴JSON后,请确保按“保存”

--->我们在这里!SWFIT代码现在应该在返回任务答案中检索所有存储桶文件!!!!

  1. 可选:如果您的iOS App中需要任何其他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>
Run Code Online (Sandbox Code Playgroud)