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

如何将aws s3中的对象从私有桶复制到公有桶而无需下载?

郑茂材
2023-03-14

这个请求使得在同一区域的s3中跨存储桶复制对象变得更加容易:

AmazonS3 pS3client = new AmazonS3Client(new BasicAWSCredentials(/*supressed*/));
String key = "key";
pS3client.copyObject("sourceBucket", key, "destinationBucket", key);

但是,当 sourceBucket 是私有访问存储桶并且需要预签名 url 来访问存储桶中的对象时,上述请求将失败。

由于私有访问,文件的访问被拒绝。

com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3;状态代码: 403;错误代码: 访问已死亡;请求 ID:

如何使s3请求或在CopObject请求中给出预签名参数以从私有桶复制到公共DestinationBucket

对于解决方法,明显的解决方案是使用 GeneratePresignedUrlRequest 并获取预签名的 url 来访问 sourceBucket 的对象,在临时文件中下载,并使用 putObject 在目标存储桶中上传。这是太多的网络 - 所以想知道如果有的话,什么是更好的选择?

共有1个答案

孙言
2023-03-14

< code>s3:CopyObject命令不能使用预签名的URL。

为了使用s3:CopyObject命令,所使用的AWS凭据只需要对源存储桶进行读访问,并对目标存储桶进行写访问。

如果这两个bucket在同一个AWS帐户中,那么这应该是直接的。

但是,如果存储桶在不同的帐户中,那么您需要在源存储桶上应用一个存储桶策略,将读取权限授予拥有目标存储桶的AWS帐户,并使用拥有目标存储桶的AWS帐户来执行复制。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "DelegateS3Access",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:root"
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::BUCKET_NAME",
                "arn:aws:s3:::BUCKET_NAME/*"
            ]
        }
    ]
}

BUCKET_NAME替换为源S3存储桶的名称,将123456789012替换为目标AWS帐户的AWS帐户ID。编辑后,将此策略应用于源S3存储桶。

 类似资料:
  • 我已经尝试了下面的代码,虽然采样器是传递,但文件是不复制的。然后我试着从本地上传到S3。由于我需要测试15GB以上的大文件,上传到S3需要很多时间。有没有从S3复制到S3的方法。

  • 我正在使用一个PHP库将一个文件上传到我的bucket中。我已经将ACL设置为public read write,它可以正常工作,但文件仍然是私有的。 我发现如果我把被授权人改成所有人,文件就会公开。我想知道的是,如何将bucket中所有对象的默认grante设置为“Everyone”。或者有没有另一种默认公开文件的解决方案? 我使用的代码如下:

  • 我正在使用python 2.7. x和Boto API 2. X连接到AWS S3桶。我有一个独特的情况,我想从S3桶下载文件,从一个特定的目录/文件夹说。但问题是我想在S3文件夹中留下一个最新的文件,而不是下载它。一旦,我在我的本地框中下载这些文件,我想将这些文件移动到同一个桶下的不同文件夹说。以前有人处理过类似的情况吗? 以下是一些解释: 将下载的文件从S3存储桶移动到同一存储桶下的不同文件夹

  • 有没有一种方法可以将文件列表从一个S3存储桶复制到另一个存储桶?两个S3存储桶都在同一个AWS帐户中。我可以使用aws cli命令一次复制一个文件: 然而,我有1000份文件要复制。我不想复制源存储桶中的所有文件,因此无法使用sync命令。有没有一种方法可以用需要复制的文件名列表来调用一个文件,从而自动化这个过程?

  • 我们有一个Lambda函数,需要能够访问私有的S3桶。 该存储桶已启用“阻止所有公共访问”,并具有以下资源策略: 我还将AmazonS3FullAccess策略直接附加到Lambda使用的IAM角色。但是,当Lambda函数尝试访问S3存储桶时,会出现访问被拒绝错误: 使用IAM用户凭据连接到S3的外部系统在尝试访问存储桶时也会收到相同的错误。 有人知道是什么导致了这个错误吗? 以下是发生错误的L

  • 我有几个Javascript原型。最初,实例将只填写ID,并为其他数据提供一些通用的位置持有者信息。然后,我将带有ID和对象类型的消息发送给服务器(使用jQuery的AJAX函数),服务器返回一个JSON对象,其中包含所有丢失的信息(但没有ID)。返回对象中的变量与现有对象中的变量具有完全相同的名称。 把它转移到现有空对象中最简单的方法是什么?我想出了几个选择 null