Amazon s3 Lambda跨帐户对象复制-头对象操作:未找到

Amazon s3 Lambda跨帐户对象复制-头对象操作:未找到,amazon-s3,aws-lambda,amazon-iam,Amazon S3,Aws Lambda,Amazon Iam,我正在尝试将使用KMS加密的S3对象复制到另一个帐户。 将执行复制操作的Lambda驻留在存在S3 Bucket with object的同一帐户中。 以下是相同的架构图: 我想将对象从帐户B复制到帐户A 为了开展活动,我已执行了以下步骤 帐户A操作: 在帐户a中创建S3存储桶(已启用服务器端加密) 为帐户B创建具有信任策略的IAM角色:请分别参阅随附的角色策略和信任策略 角色策略 { "Version": "2012-10-17",

我正在尝试将使用KMS加密的S3对象复制到另一个帐户。 将执行复制操作的Lambda驻留在存在S3 Bucket with object的同一帐户中。 以下是相同的架构图: 我想将对象从帐户B复制到帐户A

为了开展活动,我已执行了以下步骤

帐户A操作:

  • 在帐户a中创建S3存储桶(已启用服务器端加密)
  • 为帐户B创建具有信任策略的IAM角色:请分别参阅随附的角色策略和信任策略
角色策略

    {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": "arn:aws:s3:::Account-A-Bucket/*"
        }
    ]   }
    {
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Action": "sts:AssumeRole",
        "Resource": "arn:aws:iam::Account-A:role/S3_Cross_Account_Access"
    }
}
信任政策

    {
    "Version": "2012-10-17",
    "Statement": [{
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::Account-B:role/COPY-LAMBDA-ROLE"
        },
        "Action": "sts:AssumeRole",
        "Condition": {
            "StringEquals": {
                "sts:ExternalId": "demo"
            }
        }
    }]
}
  • 帐户存储桶的存储桶策略

     {
     "Version": "2012-10-17",
     "Statement": [
         {
             "Sid": "DelegateS3Access",
             "Effect": "Allow",
             "Principal": {
                 "AWS": "arn:aws:iam::Account-B:role/COPY-LAMBDA-ROLE"
             },
             "Action": "s3:PutObject",
             "Resource": [
                 "arn:aws:s3:::Account-A-Bucket/*",
                 "arn:aws:s3:::Account-A-Bucket"
             ]
         }
     ]  }
    
帐户B操作:

  • Lambda IAM角色(承担角色并访问S3)
承担角色策略

    {
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:*"
            ],
            "Resource": "arn:aws:s3:::Account-A-Bucket/*"
        }
    ]   }
    {
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Action": "sts:AssumeRole",
        "Resource": "arn:aws:iam::Account-A:role/S3_Cross_Account_Access"
    }
}
S3访问策略

{
"Version": "2012-10-17",
"Statement": [
    {
        "Action": [
            "s3:Put*",
            "s3:List*",
            "s3:Get*"
        ],
        "Resource": "arn:aws:s3:::Account-A-Bucket/*",
        "Effect": "Allow",
        "Sid": "S3"
    }
]   }
  • 要从帐户B复制到帐户A的Lambda代码

    def lambda_handler(event, context):
    
         file_key_name = event['Records'][0]['s3']['object']['key']
    
         src_bucket_name='Account-B-Bucket'
    
         s3 = boto3.resource('s3')
    
         copy_source = {
           'Bucket': src_bucket_name,
           'Key': file_key_name
         }
         des_bucket = s3.Bucket('Account-A-Bucket')
         des_bucket.copy(copy_source, file_key_name)
    
我面临以下错误:

[ERROR] ClientError: An error occurred (404) when calling the HeadObject operation: Not Found

这里我还缺少什么?

要使用一个api调用进行复制,您需要一个对这两个bucket都有权限的角色

基本上,您需要目标帐户中的一个角色,该角色允许访问这两个bucket。允许此角色使用bucket策略访问源bucket。让lambda或else承担目标帐户中的角色并调用复制api

我指的是这篇AWS文章:


对于每个使用假定角色的人,有一个一般提示:像您这样的角色,可以使用
sts:assumeRole
策略假定,需要明确假定!Lambda承担执行角色,并且无法猜测在另一个帐户中承担哪个角色来完成某个作业,因此显式地承担该角色

要使用一个api调用进行复制,您需要一个对两个bucket都有权限的角色

基本上,您需要目标帐户中的一个角色,该角色允许访问这两个bucket。允许此角色使用bucket策略访问源bucket。让lambda或else承担目标帐户中的角色并调用复制api

我指的是这篇AWS文章:

对于每个使用假定角色的人,有一个一般提示:像您这样的角色,可以使用
sts:assumeRole
策略假定,需要明确假定!Lambda承担执行角色,并且无法猜测在另一个帐户中承担哪个角色来完成某个作业,因此显式地承担该角色