Лямбда, которая копирует объект из одной корзины в другую в разных учетных записях, используя AWS метод copyobject SDK в javascript - PullRequest
0 голосов
/ 09 июля 2020

Я хотел бы скопировать объекты из сегмента в account-1 в другие сегменты в account-2, используя метод copyObject AWSJavaScriptSDK в лямбде. Прямо сейчас он работает, позволяя лямбда-роли в account-1 записывать в корзину учетной записи account-2 с использованием политик корзины s3. Дело в том, что в account-2 у нас много сегментов, и мы не хотим добавлять разрешение для каждого из них каждый раз, когда мы создаем лямбда, которая записывает или читает в одном из них.

I ' м пытаюсь, чтобы лямбда в account-1 взяла на себя роль с разрешениями на запись и чтение в account-2 следующим образом.

  1. В 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": {}
       }
     ]
    }
    
    
  2. В 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"
            }
        ]
    }
    
  3. В лямбде я принимаю на себя следующие роли:

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.

1 Ответ

1 голос
/ 09 июля 2020

Вам нужно выполнить S3 с разрешениями предполагаемой роли, которые вы только что получили, я думаю, что вам его не хватает :)

var s3 = new AWS.S3(accessparams2);

В качестве бонуса:

  • Вы принимают роль и создают экземпляр объекта s3 при каждом выполнении лямбда, это не обязательно, вы можете сделать это из своей функции обработчика, чтобы повысить производительность
  • nodejs SDK использует метод .promise() для каждого объект, поэтому вы, вероятно, можете сделать что-то вроде следующего, чтобы избежать уродливой вещи Promise / callback в вашей функции getCrossAccountCredentials (как вы делаете с вашим вызовом s3): const data = await sts.assumeRole(sts_params).promise();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...