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 在两个不同帐户的两个存储桶之间复制对象需要什么权限?_Amazon Web Services_Amazon S3_Aws Lambda - Fatal编程技术网

Amazon web services 在两个不同帐户的两个存储桶之间复制对象需要什么权限?

Amazon web services 在两个不同帐户的两个存储桶之间复制对象需要什么权限?,amazon-web-services,amazon-s3,aws-lambda,Amazon Web Services,Amazon S3,Aws Lambda,我正在使用javascript SDK和lambda函数将文件从源帐户复制到lambda所在的当前帐户。在调用copyObjectapi之前,我将担任跨帐户访问源帐户S3 bucket的角色。但我的访问被拒绝了!以下是我的跨账户角色: { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:ListAllMyBuckets"

我正在使用javascript SDK和lambda函数将文件从源帐户复制到lambda所在的当前帐户。在调用
copyObject
api之前,我将担任跨帐户访问源帐户S3 bucket的角色。但我的访问被拒绝了!以下是我的跨账户角色:

{
"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权限,然后无法将文件复制到目标。非常感谢您的帮助

您似乎有:

  • Account-A
  • Account-B
  • Account-B
  • Lambda函数可以承担的
    Account-A
    中的IAM角色(
    Role-A
您的要求是让Lambda函数将对象从
Bucket-A
复制到
Bucket-B

使用
CopyObject
命令时,凭据必须具有:

  • Bucket-A的读取权限
  • Bucket-B的写入权限
但是,虽然
Role-A
Bucket-A
具有读取权限,但它没有写入
Bucket-B
的权限

因此,您有两种选择:

  • 选项1:
    Bucket-B
    添加一个Bucket策略,该策略向
    Role-a
    授予写入权限,或
  • 选项2:通过在
    Bucket-A
    上创建Bucket策略,
    Account-A
    Bucket-A
    的管理员可以将
    Bucket-A
    的读取权限授予Lambda函数正在使用的IAM角色,而不是使用
    Role-A
    。也就是说,Lambda函数不承担
    角色-A
    。它只是使用自己的角色直接从
    Bucket-A
    读取
选项2更好,因为它涉及的活动部件更少。也就是说,没有必要承担任何角色。我建议您在使用
AssumeRole
方法之前尝试此方法

如果您确实希望继续使用
Role-A
,请注意
CopyObject()
命令将需要将
ACL
设置为
bucket owner full control
。如果未执行此操作,
帐户B
将无权访问/删除复制的对象。(如果使用第二种方法,则将使用
Account-B
凭据复制对象,因此不需要此方法。)


底线:对于您描述的涉及
Role-A
的场景,
Bucket-B
添加一个Bucket策略,向
Role-A

授予写入权限。您是对的,当您担任跨帐户角色时,您将失去当前的权限。如果要保持这种工作方式,您需要承担跨帐户角色,将文件本地复制到lambda环境中,重新承担lambda角色并将文件放入目标存储桶。或者您可以将所有策略放入lambda使用的相同角色中,并在bucket上放置一个允许此跨帐户角色从中获取对象的策略。谢谢您的回答。我还可以选择承担角色A并调用getObject(),然后承担lambda角色并调用putObject()使其工作。使用这两个操作而不是单个copyObject()操作是否有任何性能差异?
copyObject()
操作将直接在S3存储桶之间进行。这甚至可以在区域之间工作!它比下载和上传要高效得多。我怀疑它还会复制其他信息,比如元数据和创建日期。这比下载和上传要好得多。