#amazon-web-services #aws-lambda #aws-codecommit
#amazon-веб-сервисы #aws-lambda #aws-codecommit
Вопрос:
Usecase
У меня есть репозиторий codecommit в учетной записи A. У меня есть моя лямбда-функция в учетной записи B. Мне нужно получить доступ к репозиторию codecommit из моего lambda, который находится в учетной записи B.
Что я сделал
- Я создал роль с именем
CrossAccountRole
в учетной записи A с помощью managedcodedcommitReadOnlypolicy
и назначил ей доверительные отношения с учетной записью B, чтобы учетная запись B могла взять на себя эту роль. -
В учетной записи 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": "*" } ] }
и прикрепил это к моим пользовательским разрешениям.
- А также я создал базовую роль выполнения для лямбда-функции и прикрепил к ней
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;
}
};
Надеюсь, это будет полезно для других