Доступ к codecommit в учетной записи A из лямбда-функции в учетной записи B?

#amazon-web-services #aws-lambda #aws-codecommit

#amazon-веб-сервисы #aws-lambda #aws-codecommit

Вопрос:

Usecase

У меня есть репозиторий codecommit в учетной записи A. У меня есть моя лямбда-функция в учетной записи B. Мне нужно получить доступ к репозиторию codecommit из моего lambda, который находится в учетной записи B.

Что я сделал

  1. Я создал роль с именем CrossAccountRole в учетной записи A с помощью managed codedcommitReadOnlypolicy и назначил ей доверительные отношения с учетной записью B, чтобы учетная запись B могла взять на себя эту роль.
  2. В учетной записи B я создал ASSUMEROLE политику, подобную этой

     {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "VisualEditor0",
                "Effect": "Allow",
                "Action": [
                    "sts:AssumeRole",
                    "sts:GetFederationToken"
                ],
                "Resource": "arn:aws:iam::134952096518:role/CrossAccountRole"
            },
            {
                "Sid": "VisualEditor1",
                "Effect": "Allow",
                "Action": "sts:GetCallerIdentity",
                "Resource": "*"
            }
        ]
    }
      

    и прикрепил это к моим пользовательским разрешениям.

  3. А также я создал базовую роль выполнения для лямбда-функции и прикрепил к ней ASSUMEROLE политику.

Я уверен, что все работает нормально. Потому что, когда я попытался переключить роль из консоли в AccountB, я смог увидеть codecommit Repos , которые находятся в AccountA.

Но я все еще не могу подключиться к репозиториям AccountA codecommit из моей лямбда-функции в AccountB.

Моя лямбда-функция выглядит следующим образом в учетной записи B

 const AWS = require('aws-sdk');
AWS.config.region = 'ap-south-1';
var codecommit = new AWS.CodeCommit({apiVersion: '2015-04-13'});
var params = {
  commitId: 'xxx', 
  repositoryName: 'new' 
};
  var sts = new AWS.STS();
  var sts_params = {
    RoleArn: "arn:aws:iam::AccountA:role/CrossAccountRole",
    RoleSessionName: "ThisCanBeAnyName"
  };
exports.handler = async (event) => {
    // TODO implement
try {
       const creds = await sts.assumeRole(sts_params).promise();
       console.log(creds);
    AWS.config.update({
      accessKeyId: creds.Credentials.AccessKeyId,
      secretAccessKey: creds.Credentials.SecretAccessKey,
      sessionToken: creds.Credentials.SessionToken
    });
   const response = await codecommit.getCommit(params).promise();
   const email = response.commit.committer.email;
    console.log(response);
  } catch (err) {
    console.log(err.message);
    throw err;
  }
};
  

Я получаю ошибку типа new Repository not exist . Поскольку он выполняет поиск в учетной записи B, это происходит из-за этой ошибки.

Любая помощь приветствуется, спасибо

Ответ №1:

С соответствующими ролями IAM все в порядке. Необходимо внести некоторые изменения в мой лямбда-код. В моем лямбда-коде мне нужно передать temporary credentials службе, которая есть codecommit , чего я не делал в приведенном выше коде. ИТАК, вот рабочий пример

 const AWS = require('aws-sdk');
AWS.config.region = 'ap-south-1';
var params = {
   commitId: 'abc',
  repositoryName: 'new' 
};
  var sts = new AWS.STS();
  var sts_params = {
    RoleArn: "arn:aws:iam::xx:role/CrossAccountRole",
    RoleSessionName: "crossaccountRole"
  };
exports.handler = async (event) => {
    // TODO implement
try {
      const creds = await sts.assumeRole(sts_params).promise();
      const accessparams2 = {
    accessKeyId: creds.Credentials.AccessKeyId,
    secretAccessKey: creds.Credentials.SecretAccessKey,
    sessionToken: creds.Credentials.SessionToken,
  };
   const codecommit = await new AWS.CodeCommit(accessparams2);
   const response = await codecommit.getCommit(params).promise();
    return response;
  } catch (err) {
    console.log(err.message);
    throw err;
  }
};
  

Надеюсь, это будет полезно для других