我正在尝试将文件从A帐户中的存储桶复制到B帐户中的另一个存储桶。当我尝试使用命令
同步文件时 aws s3 sync s3://BUCKET_A s3://BUCKET_B
它返回以下输出:
copy failed: s3://BUCKET_A to s3://BUCKET_B An error occurred (AccessDenied) when calling the CopyObject operation: Access Denied
这是在B帐户中创建的用户所附加的政策(将从存储区A中复制文件):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::BUCKET_A",
"arn:aws:s3::: BUCKET_A/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::BUCKET_B",
"arn:aws:s3:::BUCKET_B/*"
]
}
]
}
可能我缺少一些权限?我找不到要添加到我的用户/存储桶策略中的权限CopyObject
答案 0 :(得分:0)
在IAM角色政策方面,您将需要以下内容:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::BUCKET_A",
"arn:aws:s3::: BUCKET_A/*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:PutObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::BUCKET_B",
"arn:aws:s3:::BUCKET_B/*"
]
}
]
}
您需要将这些权限添加到BUCKET_B
{
"Sid": "Example permissions",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::your_iam_policy"
},
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:PutObject",
"s3:PutObjectAcl"
],
],
"Resource": [
"arn:aws:s3:::BUCKET_B"
]
}
答案 1 :(得分:0)
您需要使用B帐户上的IAM用户在本地计算机上配置AWS CLI。
您可以在本地cli配置上拥有任意数量的配置文件。有关更多详细信息,请参见AWS CLI configuration。
现在在复制时,将--profile参数添加到您的同步命令中。例如。
aws s3 sync s3://BUCKET_A s3://BUCKET_B --profile <NEW-AWS-CLI-PROFILE-FOR-ACCOUNT-B>
答案 2 :(得分:0)
就我而言,我对某些对象没有任何问题,但是其中一个对象具有问题中所述的相同 CopyObject 错误。我也在跨账户存储桶之间使用同步命令。
所以我查看了 AWS CloudTrail 中的事件历史记录(因为我设置了 cloudtrail) - 这有助于了解正在调用哪些 API 调用。但是我没有 event logging for S3 buckets and objects enabled,所以我尝试了一些更改,从 put* 开始,它起作用了。然后我迅速缩小到我需要的那个。
最终,这让我可以将此权限添加到我的存储桶策略中:s3:PutObjectTagging。
希望这也能帮到你!
答案 3 :(得分:0)
这可能与目标存储桶中对象的加密有关。查看您粘贴的 IAM 角色,似乎授予了所有必需的权限。
要解决此问题,请运行相同的命令并添加 --sse AES256
。
aws s3 sync s3://BUCKET_A s3://BUCKET_B --sse AES256
要检查目标bucket的加密设置,你必须检查bucket policy,它应该有条件:
...
"Condition": {
"StringNotEquals": {
"s3:x-amz-server-side-encryption": "AES256"
}
}
...
进入目标存储桶后,您可以在 S3 GUI 的 Permissions
=> Bucket policy
选项卡中找到存储桶策略。
答案 4 :(得分:0)
您缺少此处概述的 s3:GetObjectTagging
和 s3:PutObjectTagging
权限:https://medium.com/collaborne-engineering/s3-copyobject-access-denied-5f7a6fe0393e。
答案 5 :(得分:-1)
AWSS3MIGRATION
1。运行命令aws_s3_sync_bucketsource_bucketdest的帐户的CREATECREDENTIAL: awsgui,mysecuritycredential,acess_keys,create_new_access_key;
1b。在bash shell中运行命令:aws_configure;
2。 awsgui,s3,bucket_x1,概述,选择所有目录,操作,make_everything_public;
3。 awsgui,s3,bucket_x1,权限,control_list,公共访问权限;
4。 awsgui,s3,bucket_x1,概述,选择所有目录,操作,并将storege类更改为标准。
5。也为bucket_2做第二,第三,第四点。
说明:bucket_x1是源,bucket_x2是目的地。
答案 6 :(得分:-1)
1 - 禁用阻止公共访问 2 - 保持桶未加密 3 - 查找您的公共 IP: 4 - 将以下策略添加到 s3 存储桶
{
"Version": "2008-10-17",
"Id": "Policy1357935677554",
"Statement": [
{
"Sid": "Stmt1357935647218",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::YOUR-S3-BUCKET-NAME",
"Condition": {
"IpAddress": {
"aws:SourceIp": "YOUR-PUBLIC-IP/32"
}
}
},
{
"Sid": "Stmt1357935676138",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::YOUR-S3-BUCKET-NAME/*",
"Condition": {
"IpAddress": {
"aws:SourceIp": "YOUR-PUBLIC-IP/32"
}
}
}
]
}