首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用javascript中的AWS版权对象方法将对象从一个桶复制到另一个不同帐户的Lambda

使用javascript中的AWS版权对象方法将对象从一个桶复制到另一个不同帐户的Lambda
EN

Stack Overflow用户
提问于 2020-07-09 09:30:15
回答 1查看 1.5K关注 0票数 1

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

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

  1. In account-2 I具有一个名为s3-account-2-full-access的角色,它具有AmazonS3FullAccess策略和以下信任关系:

“版本”:"2012-10-17",“声明”:{“效果”:“允许”,“主体”:{ "AWS":"arn:aws:iam::11111111111:role/lambda-account-1-role“},”操作“:"sts:AssumeRole",”条件“:{} }

  1. In account-1 I有一个带有以下策略的lambda-account-1-role

“版本”:"2012-10-17",“声明”:{ "Sid":"VisualEditor0",“效果”:“允许”,“行动”:"sts:AssumeRole",“资源”:"arn:aws:iam::22222222222:role/s3-account-2-full-access“}

  1. 在lambda中我承担的角色如下:

代码语言:javascript
复制
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;
};

这里的问题是,我在AccessDenied过程中得到了错误的copyObject。也许我误解了什么,但我不知道如何才能将对象从帐户1复制到帐户2,而不需要编辑帐户2中的桶策略。

EN

回答 1

Stack Overflow用户

发布于 2020-07-09 12:03:39

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

代码语言:javascript
复制
var s3 = new AWS.S3(accessparams2);

加分如下:

在每个lambda执行中,您要承担角色并实例化performance

  • nodejs对象,这是不必要的,您可以使用处理程序函数来改进 SDK,以便为每个对象使用.promise()方法,因此您可能可以执行如下操作,以避免getCrossAccountCredentials函数中的丑陋承诺/回调(就像对s3调用那样):
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62811782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档