我正在使用javascript SDK和lambda函数将文件从源帐户复制到我的lambda所在的当前帐户。在我调用copyObject
api之前,我假设有一个跨帐户访问源帐户S3存储桶的角色。但是我被拒绝访问!这是我的跨帐户角色:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets"
],
"Resource": [
"*"
]
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::sourceBucket/*"
]
}
]
}
这是我的lambda权限:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::destinationbucket/*",
"Effect": "Allow"
},
{
"Action": [
"sts:*"
],
"Resource": "*",
"Effect": "Allow"
}
]
}
我认为当我承担交叉帐户角色时,我放弃了lambda权限,然后无法将文件复制到目标位置。任何帮助深表感谢。
答案 0 :(得分:1)
您似乎有:
Bucket-A
中的源存储桶(Account-A
)Bucket-B
中的目标存储区(Account-B
)Account-B
中的AWS Lambda函数Role-A
中的IAM角色(Account-A
)您的要求是让Lambda函数将对象从Bucket-A
复制到Bucket-B
。
使用CopyObject
命令时,凭据必须具有:
Bucket-A
上的权限Bucket-B
上写权限但是,尽管Role-A
确实具有对Bucket-A
的读取权限,但它没有写入Bucket-B
的权限。
因此,您有两种选择:
Bucket-B
添加存储桶策略,该策略授予Role-A
,或 Role-A
,Bucket-A
中Account-A
的管理员可以向IAM角色授予Bucket-A
的读取权限通过在Bucket-A
上创建存储桶策略来被Lambda函数使用。也就是说,Lambda函数不假定Role-A
。它只是使用自己的角色直接从Bucket-A
中读取。 选项2更好,因为它涉及的运动部件较少。即,不需要扮演角色。建议您在使用AssumeRole
方法之前尝试此方法。
如果您希望继续使用Role-A
,请注意,CopyObject()
命令将需要将ACL
设置为bucket-owner-full-control
。如果不这样做,Account-B
将无权访问/删除复制的对象。 (如果使用第二种方法,则将使用Account-B
凭据复制对象,因此不是必需的。)
底线:对于涉及Role-A
的描述情况,向Bucket-B
添加存储桶策略,以授予对Role-A
的写权限。