我正在为一个有两个独立AWS账户的客户进行一些工作。我们需要将其中一个S3帐户上存储桶中的所有文件移动到第二个帐户上的新存储桶。
我们认为可以使用s3cmd来完成此操作,格式如下:
s3cmd cp s3://bucket1 s3://bucket2 --recursive
然而这只允许我使用一个账户的密钥,我无法指定第二个账户。
有没有一种方法可以在不下载文件并重新上传到第二个账户的情况下完成这个操作?
我正在为一个有两个独立AWS账户的客户进行一些工作。我们需要将其中一个S3帐户上存储桶中的所有文件移动到第二个帐户上的新存储桶。
我们认为可以使用s3cmd来完成此操作,格式如下:
s3cmd cp s3://bucket1 s3://bucket2 --recursive
然而这只允许我使用一个账户的密钥,我无法指定第二个账户。
有没有一种方法可以在不下载文件并重新上传到第二个账户的情况下完成这个操作?
您不必向所有人开放权限。使用以下 Bucket 策略来从一个帐户的存储桶复制到另一个帐户,使用 IAM 用户:
要复制的 Bucket: SourceBucket
要复制到的 Bucket: DestinationBucket
源 AWS 帐户 ID: XXXX–XXXX-XXXX
源 IAM 用户: src–iam-user
以下策略意味着 - IAM 用户 - XXXX–XXXX-XXXX:src–iam-user
在 SourceBucket/*
上具有 s3:ListBucket
和 s3:GetObject
权限,同时在 DestinationBucket/*
上具有 s3:ListBucket
和 s3:PutObject
权限。
在 SourceBucket 上的策略应该如下:
{
"Id": "Policy1357935677554",
"Statement": [{
"Sid": "Stmt1357935647218",
"Action": ["s3:ListBucket"],
"Effect": "Allow",
"Resource": "arn:aws:s3:::SourceBucket",
"Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
}, {
"Sid": "Stmt1357935676138",
"Action": ["s3:GetObject"],
"Effect": "Allow",
"Resource": "arn:aws:s3:::SourceBucket/*",
"Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
}]
}
目标存储桶的策略应为:
{
"Id": "Policy1357935677555",
"Statement": [{
"Sid": "Stmt1357935647218",
"Action": ["s3:ListBucket"],
"Effect": "Allow",
"Resource": "arn:aws:s3:::DestinationBucket",
"Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
}, {
"Sid": "Stmt1357935676138",
"Action": ["s3:PutObject"],
"Effect": "Allow",
"Resource": "arn:aws:s3:::DestinationBucket/*",
"Principal": {"AWS": "arn:aws:iam::XXXXXXXXXXXX:user/src–iam-user"}
}]
}
需要运行的命令是s3cmd cp s3://SourceBucket/File1 s3://DestinationBucket/File1
在AWS中,带宽不计算,因此只要存储桶在同一区域内,您就可以从AWS内部的一个盒子中完成所有操作,从而节省时间和金钱。
至于在不让文件在某个计算机上落地的情况下完成操作 - 应该是不可能的。
除非:由于他们从邮寄给他们的硬盘进行批量上传,所以他们也可能为您提供桶到桶传输的相同服务。
即使角色和策略是一种非常优雅的方式,我还有另一个解决方案:
在您的本地计算机(桌面或任何位于AWS之外的服务器)上使用源存储桶帐户的凭据创建一个新配置文件。
aws --profile ${YOUR_CUSTOM_PROFILE} configure
填写aws_access_key_id和aws_secret_access_key(您可以跳过Region和Output)
将目标存储桶凭据保存为环境变量
export AWS_ACCESS_KEY_ID=AKI...
export AWS_SECRET_ACCESS_KEY=CN...
现在进行同步,但添加关键的"profile"参数
aws --profile ${YOUR_CUSTOM_PROFILE} s3 sync s3://${SOURCE_BUCKET_NAME} s3://${DESTINATION_BUCKET_NAME}
好的,找到了答案。可能有其他方法来做到这一点,但这种方式非常简单。
我能够使用s3cmd实用程序实现此操作,但类似的工具也可以实现。
当您配置s3cmd时,请使用您的帐户访问密钥和秘密访问密钥进行配置。
使用您要转移至的桶的帐户登录S3 Web控制台。
访问S3 Web控制台。
https://console.aws.amazon.com/s3/home
点击您的存储桶,然后选择“操作”,再选择“属性”。
在“权限”选项卡下方,单击“添加更多权限”。
Set "Grantee" to Everyone
Check "List" and "Upload/Delete"
Save
要传输,请从您的终端运行
s3cmd cp s3://from_account_bucket s3://to_account_bucket --recursive
当传输完成后,您应该立即再次访问S3控制台,并删除您为存储桶添加的权限。
显然这里存在安全问题。我们要传输到的存储桶是对所有人开放的。找到您的存储桶名称的机会很小,但确实存在。
您可以使用存储桶策略作为另一种只开放给特定帐户访问的替代方法,但我觉得那太麻烦了,所以我把它留给需要解决这个问题的人练习。
希望这有所帮助。