Доступ к codecommit в учетной записи A из лямбда-функции в учетной записи B? - PullRequest
0 голосов
/ 22 марта 2019

USECASE

У меня есть REPOM Codecommit в учетной записи A. У меня есть лямбда-код в учетной записи B. Мне нужен доступ к репо Codecommit из моей лямбды, которая находится в учетной записи B.

Что я сделал

  1. Я создал роль с именем CrossAccountRole в учетной записи A с управляемым 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.

Но я все еще не могу подключиться к репозиториям CodeCmit из AccountA из моей лямбда-функции в 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 Ответ

0 голосов
/ 23 марта 2019

С соответствующими ролями 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;
  }
};

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

...