当前位置: 首页 > 知识库问答 >
问题:

在aws存储桶中列出对象

拓拔坚
2023-03-14

我试图打印桶中的所有对象,但我得到一个错误。

线程“main”com中出现异常。amazonaws。服务。s3.型号。AmazonS3异常:状态代码:301,AWS服务:Amazon S3,AWS请求ID:758A7CBF1A29FD74,AWS错误代码:PermanentRedirect,AWS错误消息:您尝试访问的存储桶必须使用指定的endpoint寻址。请将所有未来的请求发送到此终结点。,S3

目前我只有以下代码:

public class S3Download {

    /**
     * @param args
     */
    public static void main(String[] args) {
        AmazonS3 s3 = new AmazonS3Client(new ClasspathPropertiesFileCredentialsProvider());
        Region usWest2 = Region.getRegion(Regions.US_WEST_2);
        s3.setRegion(usWest2);
        String bucketName = "apireleasecandidate1";

        ListObjectsRequest listObjectRequest = new ListObjectsRequest().withBucketName(bucketName);
        ObjectListing objectListing;

        do{
            objectListing = s3.listObjects(listObjectRequest);
            for(S3ObjectSummary objectSummary : objectListing.getObjectSummaries()){
                System.out.println(" - " + objectSummary.getKey() + " " + "(size = " +
            objectSummary.getSize() + ")");
            }
            listObjectRequest.setMarker(objectListing.getNextMarker());
        }while(objectListing.isTruncated());
    }

}

我在亚马逊的网站上找到了这个解决方案。

有人知道我错过了什么吗?

共有2个答案

姬天宇
2023-03-14

似乎您的桶“apireleasecandidate1”不在us-west-1区域。我认为这是在美国的经典地区。您应该修改代码以删除setRegion()调用。

陆涵畅
2023-03-14

对于Scala开发人员来说,这是一个递归函数,可以使用官方的AWS Java SDK对AmazonS3存储桶的内容执行完整扫描和映射

import com.amazonaws.services.s3.AmazonS3Client
import com.amazonaws.services.s3.model.{S3ObjectSummary, ObjectListing, GetObjectRequest}
import scala.collection.JavaConversions.{collectionAsScalaIterable => asScala}

def map[T](s3: AmazonS3Client, bucket: String, prefix: String)(f: (S3ObjectSummary) => T) = {

  def scan(acc:List[T], listing:ObjectListing): List[T] = {
    val summaries = asScala[S3ObjectSummary](listing.getObjectSummaries())
    val mapped = (for (summary <- summaries) yield f(summary)).toList

    if (!listing.isTruncated) mapped.toList
    else scan(acc ::: mapped, s3.listNextBatchOfObjects(listing))
  }

  scan(List(), s3.listObjects(bucket, prefix))
}

要调用上面咖喱map()函数,只需在第一个参数列表中传递已经构造(并正确初始化)的Amazon S3Client对象(参考官方的AWS SDK获取JavaAPI参考)、桶名和前缀名。还要传递要应用的函数f()来映射第二个参数列表中的每个对象摘要。

比如说

map(s3, bucket, prefix)(s => println(s))

将打印所有文件

val tuple = map(s3, bucket, prefix)(s => (s.getKey, s.getOwner, s.getSize))

将返回该存储桶/前缀中的完整元组列表(键、所有者、大小)

val totalSize = map(s3, "bucket", "prefix")(s => s.getSize).sum

将返回其内容的总大小(注意表达式末尾应用的附加sum()折叠函数;-)

您可以将map()与许多其他函数相结合,就像在函数编程中通常通过单子实现的那样

 类似资料:
  • 问题内容: 使用Java获取S3存储桶中所有项目列表的最简单方法是什么? 本示例仅返回1000个项目。 问题答案: 可能是一种解决方法,但这解决了我的问题:

  • 问题内容: 我需要列出S3存储桶中某个文件夹中包含的所有文件。 文件夹结构如下 我有与用户有关的文件和与某个用户的联系人有关的文件。我需要同时列出两者。 要列出文件,我使用以下代码: 要列出某个用户的文件,我使用以下前缀: 并且我正确地获得了除子目录之外的目录中的所有文件,例如: 要列出某个用户联系人的文件,我使用以下前缀: 但是在这种情况下,我还将目录本身作为返回的对象: 为什么我会得到这种行为

  • 我试图列出我存储项目中的所有(甚至一些)桶。如果我知道一个水桶的名字,“水桶”功能就会得到这个水桶。但是我不能用"桶"来列出项目中的桶: 我的服务帐户具有“存储管理员”角色。我很困惑。注意:我使用的是PHP5.6,以防万一。Composer在安装GCS库时没有遇到问题,所以我认为这没问题。 好吧,我一定是错过了什么。使用我得到一个桶的测试用例,我使用了$one_桶- 进一步信息:当点击迭代器(fo

  • 我有一个aws组织,有几个S3桶和成员帐户。我在其中一个S3 bucket中添加了bucket策略,允许根据aws在下面URL中提供的文档从成员帐户访问它。 但是在登录了特定的会员账号之后,我仍然无法在那里看到S3的bucket。所以请告诉我这里出了什么问题。

  • 问题内容: 我正在尝试在AWS ECS上设置Jenkins服务器,但是我必须发出将S3挂载到我的Docker容器的信息。 谁能为我提供可以在ECS服务中安装s3存储桶的任务定义?soi可以将我的Jenkins工作区存储在s3上 问题答案: 您可以在EC2实例中安装s3fs(或者可以将自定义AMI用于ECS群集)。将S3存储桶安装在EC2实例中,然后您就可以始终共享主机路径。

  • 我发现,当我在IAM策略中使用NotResource作为掩码并将其附加到bucket时,受策略影响的资源是那个bucket中没有在NotResource子句中指定的所有资源。我需要指出一个文档,它清楚地表明情况是这样的。我一直在查看内联策略的文档,以及s3访问管理和策略的文档,但我很难找到这些特定的信息。文档中是否说明了在内联策略中指定资源的限制?