【问题标题】:aws cli copy between S3 regions on EC2EC2 上 S3 区域之间的 aws cli 复制
【发布时间】:2017-02-04 02:20:15
【问题描述】:

我正在尝试使用 EC2 服务器上的命令行界面在不同区域的两个 S3 存储桶之间进行复制。

地区信息:
EC2 实例:us-west-2
S3 来源:us-east-1
S3 目的地:us-west-2

以下命令可在 EC2 服务器上完美运行:
aws s3 cp s3://n-virginia/origin s3://n-virginia/destination --recursive --source-region us-east-1 --region us-east-1 --profile my_profile

aws s3 cp s3://oregon/origin s3://oregon/destination --recursive --source-region us-west-2 --region us-west-2 --profile my_profile

我需要从 EC2 服务器运行以下命令:
aws s3 cp s3://n-virginia/origin s3://oregon/destination --recursive --source-region us-east-1 --region us-west-2 --profile my_profile

如果我从本地计算机运行该命令,它可以工作,但如果我从用于前两个命令的 EC2 服务器运行它,我会收到以下错误:

错误:"A client error (AccessDenied) occurred when calling the CopyObject operation: VPC endpoints do not support cross-region requests"

我能够将文件从源存储桶复制到 EC2 服务器,然后从 EC2 服务器复制到目标存储桶,但这不是生产中可接受的解决方案。我不明白为什么它可以在本地机器上运行,但不能在 EC2 服务器上运行(“my_profile”在两台机器上是相同的)

【问题讨论】:

  • 您在 EC2 服务器上为 S3 使用 VPC 终端节点。我认为这是因为它位于 VPC 的私有子网中。因此,您在 EC2 服务器上通过与在本地计算机上不同的方法访问 S3。这就是为什么它的行为不同。如果 VPC 端点不支持您尝试执行的操作,那么除了首先将所有文件复制到 EC2 服务器之外,确实没有其他解决方法。
  • 如果我理解正确,请告诉我。第一个命令使用 VPC 端点连接到单个存储桶并且它可以工作。第二个命令使用不同的端点连接到不同的单个存储桶并且它可以工作。第三个命令使用之前的 vpc 端点之一尝试连接到两个不同的存储桶,但无法连接到其中一个?
  • 它与“连接到存储桶”的能力无关。第一个命令将文件从一个 S3 存储桶复制到另一个存储桶,其中两个存储桶位于同一区域。第二个命令将文件从一个 S3 存储桶复制到另一个存储桶,其中两个存储桶位于同一区域中。第三个命令将文件从一个 S3 存储桶复制到另一个存储桶,这些存储桶位于不同的区域。错误消息是说 VPC 端点不支持特定场景。
  • 启用跨区域复制,让亚马逊为您运行。
  • 看起来解决方案是关闭 VPC Endpoints,我不知道所有细节,我认为如果这是一次性操作,创建一个没有端点的新 VPC 并执行那里的操作。

标签: amazon-web-services amazon-s3 amazon-ec2


【解决方案1】:

正如 cmets 中所指出的,问题在于您的 VPC 有一个端点和cross region copies are not supported

要解决此问题,可以通过更新您的 VPC 路由表暂时禁用 VPC 终端节点,或者只创建一个没有 VPC 终端节点的新 VPC 并在那里启动 EC2。

跨区域复制是理想的,但正如指出的那样,这只影响存储桶中的新项目

您可能想要使用aws s3 sync,而不是使用aws s3 cp。同步只会复制更改的文件,因此您可以在中断时重新运行它。例如:

aws s3 sync s3://n-virginia/origin s3://oregon/destination

另请注意,cpsync保留 ACL。因此,如果您更改了单个文件的 ACL 权限,它们将在复制后全部设置为默认值。还有一些其他工具应该保留 ACL,例如 https://s3tools.org,这似乎对我有用。

【讨论】:

    【解决方案2】:

    如果由于需要磁盘空间而无法在本地下载整个存储桶,您可以下载、上传和删除 5 秒的文件。

    下面第一行shell sn -p 启动整个源bucket到本地磁盘的后台下载。当当前目录中有文件时,调用aws s3 mv,它将文件复制到目标存储桶并在本地删除。

    mkdir tempdir
    aws s3 sync s3://source-bucket . &
    sleep 5
    while [ $(ls | wc -l) -gt 0 ] ; do mv *.txt tempdir ; aws s3 mv --recursive tempdir/* s3://destination-bucket ; done
    

    aws s3 sync 命令在将文件写入磁盘时创建具有随机扩展名的临时文件。不幸的是,aws s3 mv 命令有时会上传这些文件。为避免这种情况,请移动一批文件,例如所有 .txt 文件,到一个临时目录并只上传它们。

    在实践中,我看到本地使用的磁盘不超过 50M(少于 500 个文件,每个文件小于 100k)

    【讨论】:

    • -1 这将问题从磁盘空间不足转移到占用带宽。每个文件都被复制,无论它是否已更改。两次。
    猜你喜欢
    • 1970-01-01
    • 2017-06-03
    • 2019-01-02
    • 2016-02-23
    • 1970-01-01
    • 2017-07-13
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    相关资源
    最近更新 更多