Amazon web services Lambda,它使用javascript中的AWS SDK copyobject方法将对象从一个bucket复制到不同帐户中的另一个bucket

Amazon web services Lambda,它使用javascript中的AWS SDK copyobject方法将对象从一个bucket复制到不同帐户中的另一个bucket,amazon-web-services,amazon-s3,aws-lambda,Amazon Web Services,Amazon S3,Aws Lambda,我想使用lambda中AWSJavaScriptSDK的copyObject方法将对象从account-1中的bucket复制到account-2中的其他bucket。现在,它的工作原理是允许account-1中的lambda角色使用s3 bucket策略写入accountaccount-2中的bucket。问题是在account-2中,我们有很多bucket,我们希望避免每次创建写入或读取其中一个bucket的lambda时都向每个bucket添加权限 我正在尝试让account-1中的lam

我想使用lambda中AWSJavaScriptSDK的
copyObject
方法将对象从
account-1
中的bucket复制到
account-2
中的其他bucket。现在,它的工作原理是允许
account-1
中的lambda角色使用s3 bucket策略写入account
account-2
中的bucket。问题是在
account-2
中,我们有很多bucket,我们希望避免每次创建写入或读取其中一个bucket的lambda时都向每个bucket添加权限

我正在尝试让
account-1
中的lambda承担具有在
account-2
中写入和读取权限的角色,如下所示

  • account-2
    中,我的角色名为
    s3-account-2-full-access
    ,具有
    AmazonS3FullAccess
    策略和以下信任关系:

     "Version": "2012-10-17",
     "Statement": [
       {
         "Effect": "Allow",
         "Principal": {
           "AWS": "arn:aws:iam::11111111111:role/lambda-account-1-role"
         },
         "Action": "sts:AssumeRole",
         "Condition": {}
       }
     ]
    }
    
    
  • account-1
    中,我有
    lambda-account-1-role
    ,并附上以下政策

        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "VisualEditor0",
                "Effect": "Allow",
                "Action": "sts:AssumeRole",
                "Resource": "arn:aws:iam::22222222222:role/s3-account-2-full-access"
            }
        ]
    }
    
  • 在lambda中,我承担以下角色:


  • 这里的问题是,在
    copyObject
    期间,我得到了错误
    AccessDenied
    。也许我误解了什么,但我不知道如何将对象从account-1复制到account-2,而不必编辑account-2中的bucket策略。

    您需要使用刚刚获得的假定角色权限执行S3,我认为您缺少它:)

    作为奖励积分:

    • 您在每个lambda执行中都扮演角色并实例化s3对象,这不是必需的,您可以通过处理程序函数来提高性能
    • nodejs SDK用于为每个对象提供一个
      .promise()
      方法,因此您可能可以执行以下操作,以避免在
      getCrossAccountCredentials
      函数中出现丑陋的承诺/回调(就像您在s3调用中所做的那样):
      const data=wait sts.assumeRole(sts_params).promise()

    您能分享您遇到的错误吗?它是承担角色还是访问s3?错误是访问s3。在角色扮演期间,假设我没有错误<代码>“errorType”:“AccessDenied”我看到您正在创建
    accessparams2
    。但具体在哪里使用?在我看来,您仍然在使用lambda角色,而不是创建
    var s3=new AWS.s3()时假定的角色
    @RogerMP谢谢你的帮助。我刚刚在
    var s3=new AWS.s3()中添加了de
    accessparams2
    在访问S3的过程中,我仍然收到
    AccessDenied
    。使用
    listObjects
    方法,我可以从其他帐户读取存储桶。但是我不能使用
    copyObject
    方法。嗨,我终于找到了解决方案。此外,在解决方案中,还有一件事是向要复制的对象添加所需的权限。例如,在我的例子中,我已经公开了对象,最后,我可以设法将对象复制到另一个帐户
    const sts = new AWS.STS();
    
    exports.handler = async (event) => {
        const timestamp = (new Date()).getTime();
        var sts_params = {
            RoleArn: 'arn:aws:iam::22222222222:role/s3-account-2-full-access',
            RoleSessionName: `id-${timestamp}`,
            DurationSeconds: 3600,
         };
        const { Credentials } =  await  sts.assumeRole(sts_params).promise();
        const { AccessKeyId, SecretAccessKey, SessionToken } = Credentials;
    
        const accessparams2 = {
          accessKeyId: AccessKeyId,
          secretAccessKey: SecretAccessKey,
          sessionToken: SessionToken,
        };
        
        var s3 = new AWS.S3(accessparams2);
        var params = {
            Bucket: "account-2-bucket", 
            CopySource: "/account-1-bucket/file.txt", 
            Key: "file.txt"
        };
        const result = await s3.copyObject(params).promise();
    
        const response = {
            statusCode: 200,
            body: JSON.stringify(result),
        };
        return response;
    };
    
    var s3 = new AWS.S3(accessparams2);