Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services EC2上S3区域之间的aws cli复制_Amazon Web Services_Amazon S3_Amazon Ec2 - Fatal编程技术网

Amazon web services EC2上S3区域之间的aws cli复制

Amazon web services EC2上S3区域之间的aws cli复制,amazon-web-services,amazon-s3,amazon-ec2,Amazon Web Services,Amazon S3,Amazon Ec2,我试图使用EC2服务器上的命令行界面在不同区域的两个S3存储桶之间进行复制 地区信息: EC2实例:us-west-2 S3来源:美国东部1号 S3目的地:美国西部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

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

地区信息:
EC2实例:us-west-2
S3来源:美国东部1号
S3目的地:美国西部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服务器上运行该命令,则会出现以下错误:

错误:
“调用CopyObject操作时发生客户端错误(AccessDenied):VPC端点不支持跨区域请求”


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

正如评论中指出的,问题是您的VPC有一个端点和一个连接点

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

跨区域复制是理想的,但正如所指出的,这只会影响bucket中的新项目

您可能希望使用aws s3 sync,而不是使用
aws s3 cp
。同步将只复制已更改的文件,从而允许您在中断时重新运行它。例如:

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

还请注意,
cp
sync
都会保留ACL。因此,如果您更改了单个文件的ACL权限,则在复制后,这些文件都将设置为默认值。还有一些其他的工具可以保存ACL,这对我来说似乎很有用。

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

下面的shell代码段的第一行开始将整个源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文件)移动到临时目录,并仅上载它们


实际上,我看到本地使用的磁盘不超过50万个(每个文件小于100k的文件不超过500个)

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