我正在尝试使用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”相同)
答案 0 :(得分:2)
如注释中所指出,问题是您的VPC具有端点和cross region copies are not supported。
要解决此问题,请通过更新VPC路由表来暂时禁用VPC端点,或者只创建一个没有VPC端点的新VPC并在那里启动EC2。
跨区域复制是理想的选择,但要指出的是,这只会影响存储桶中的新项目
您可能不想使用aws s3 cp
,而不是使用aws s3 sync
。同步只会复制更改的文件,因此,如果同步被中断,您可以再次重新运行它。例如:
aws s3 sync s3://n-virginia/origin s3://oregon/destination
请注意,cp
和sync
都不保留ACL。因此,如果您更改了单个文件的ACL权限,则复制后它们都将设置为默认值。还有一些其他应该保留ACL的工具,例如https://s3tools.org似乎对我有用。
答案 1 :(得分:0)
如果由于需要磁盘空间而无法在本地下载整个存储桶,则可以下载,上传和删除5秒钟的文件。
下面的外壳程序代码的第一行开始将整个源存储桶后台下载到本地磁盘。当前目录中有文件时,请调用aws s3 mv
,它将文件复制到目标存储桶并在本地将其删除。
aws s3 sync s3://source-bucket . &
sleep 5
while [ $(ls | wc -l) -gt 0 ] ; do aws s3 mv --recursive . s3://destination-bucket ; done
实际上,我看到本地使用的磁盘不超过50M(少于500个文件,每个文件少于100k)