我试图打印桶中的所有对象,但我得到一个错误。
线程“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());
}
}
我在亚马逊的网站上找到了这个解决方案。
有人知道我错过了什么吗?
似乎您的桶“apireleasecandidate1”不在us-west-1区域。我认为这是在美国的经典地区。您应该修改代码以删除setRegion()调用。
对于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访问管理和策略的文档,但我很难找到这些特定的信息。文档中是否说明了在内联策略中指定资源的限制?