Как добавить разрешение Secrets Manager IAM?

Я читаю документы CDK о SecretsManager и я не уверен, что неправильно понял, но то, что я думал, будет работать на их примере, похоже, не дает ожидаемого разрешения. По сути, у меня есть стек, содержащий несколько лямбда-выражений, и я бы хотел, чтобы все они могли считывать два секрета из SecretsManager.

class CdkStack extends cdk.Stack {
    /**
     *
     * @param {cdk.Construct} scope
     * @param {string} id
     * @param {cdk.StackProps=} props
     */
    constructor(scope, id, props) {
        super(scope, id, props);

        // eslint-disable-next-line no-new
        new APIServices(this, "APIServices");

        const role = new iam.Role(this, "SecretsManagerRead", {
            assumedBy: new iam.AccountRootPrincipal(),
        });

        const dbReadSecret = new secretsmanager.Secret(this, "databaseReader");
        const dbWriteSecret = new secretsmanager.Secret(this, "databaseWriter");

        dbReadSecret.grantRead(role);
        dbWriteSecret.grantRead(role);
    }
}

Если я правильно понял, я должен просто создать эту роль и дать ей разрешение на доступ к секретам? Однако моя лямбда по-прежнему не работала, когда я пытался их запустить. Нужно ли мне делать что-то еще, не упомянутое в документах, которые я читал о явном назначении этой роли лямбда-выражениям?


person Ian    schedule 07.06.2020    source источник
comment
Вы добавили это после развертывания Lambda? Если это так, он, возможно, уже принял на себя роль и должен был бы снова взять на себя эту роль. Также этот код создает роль, но не связывает ее с Lambda :(   -  person Chris Williams    schedule 07.06.2020
comment
Вы добавили эту роль в функцию Lambda в качестве роли ее выполнения?   -  person Dennis Traub    schedule 07.06.2020
comment
Я добавил это после того, как земли уже были развернуты. @DennisTraub, как бы вы связали дополнительную роль с Lamda?   -  person Ian    schedule 07.06.2020
comment
Функция Lambda может выполнять только одну роль. Вам нужно либо добавить политику с указанными выше разрешениями к существующей роли, либо заменить роль, прикрепленную к существующей функции Lambda, новой.   -  person Dennis Traub    schedule 07.06.2020
comment
@DennisTraub спасибо! У вас есть ссылки на примеры? Или, если вы вставите ответ с примером, и он сработает, я могу принять :)   -  person Ian    schedule 07.06.2020
comment
Я создал ответ, показывающий, как вы можете добавить разрешения к существующей роли.   -  person Dennis Traub    schedule 07.06.2020


Ответы (1)


В зависимости от вашего фактического контекста есть два возможных варианта.

<сильный>1. Импортировать существующую роль

Если функция Lambda была предварительно определена (например, в другом стеке), вы можете добавить дополнительные разрешения к существующей роли выполнения Lambda, сначала импортировав ее в этот стек CDK.

class CdkStack extends cdk.Stack {
    constructor(scope, id, props) {
        // ...

        // Import the existing role into the stack
        const roleArn = 'arn:aws:iam::123456789012:role/MyExistingLambdaExecutionRole'
        const role = iam.Role.fromRoleArn(this, 'Role', roleArn, {
            mutable: true,
        });

        const dbReadSecret = new secretsmanager.Secret(this, "databaseReader");
        const dbWriteSecret = new secretsmanager.Secret(this, "databaseWriter");

        dbReadSecret.grantRead(role);
        dbWriteSecret.grantRead(role);
    }
}

Для получения дополнительной информации об использовании модуля aws-iam CDK, вот ссылка на документацию. Здесь вы можете узнать больше о самой роли выполнения Lambda.

<сильный>2. Лямбда-функция определена как часть стека

Если лямбда-функция была определена где-то в этом стеке, вы можете просто прикрепить разрешения к лямбда-функции через ее ссылку, используя dbReadSecret.grantRead(lambda.role) и dbWriteSecret.grantRead(lambda.role) соответственно.

class CdkStack extends cdk.Stack {
    constructor(scope, id, props) {
        // ...

        // Create the function or retrieve the reference if 
        // it has been defined somewhere else in the stack

        const lambda = ...

        const dbReadSecret = new secretsmanager.Secret(this, "databaseReader");
        const dbWriteSecret = new secretsmanager.Secret(this, "databaseWriter");

        dbReadSecret.grantRead(lambda.role);
        dbWriteSecret.grantRead(lambda.role);
    }
}

Посмотрите ответ на этот вопрос для справки.

person Dennis Traub    schedule 07.06.2020
comment
Спасибо, так что просто продолжение. Это изменение роли написать? Как мне получить roleArn, когда сам этот стек CDK, скорее всего, создает его в первую очередь? - person Ian; 07.06.2020
comment
Я понял, что функция Lambda уже существует. Это означает, что должна быть связана существующая роль. - person Dennis Traub; 07.06.2020
comment
Пожалуйста, уточните, является ли функция Lambda частью стека или функция Lambda уже существует. - person Dennis Traub; 07.06.2020
comment
Да извини. APIServices определяет как функцию Lamda, так и ApiGateway. - person Ian; 07.06.2020
comment
Затем вы можете просто прикрепить разрешения к функции Lambda через ее ссылку, используя dbReadSecret.grantRead(lambda.role) и dbWriteSecret.grantRead(lambda.role) соответственно. - person Dennis Traub; 07.06.2020
comment
Я включил свои комментарии выше в ответ. - person Dennis Traub; 07.06.2020
comment
Спасибо, скоро посмотрю и приму, если это решит мою проблему, что, я думаю, будет сканировать. Документы CDK не так хороши, как я нахожу - person Ian; 07.06.2020
comment
Рад помочь. Дайте мне знать, если вам все еще чего-то не хватает. Что касается документации: это проект с открытым исходным кодом, поэтому, пожалуйста, не стесняйтесь вносить свой вклад ;-) - person Dennis Traub; 07.06.2020
comment
Огромное спасибо. Это сработало, в конце концов мне пришлось использовать Secret.fromSecretArn(), так как секрет не был частью стека, и я не осознавал, что создаю новые. Но в основном мне не хватало бита grantRead. - person Ian; 07.06.2020
comment
Большой! Спасибо, что сообщили мне, что у вас получилось. - person Dennis Traub; 08.06.2020
comment
Только что заглянул в ваш профиль — уверен, в ближайшие недели вы увидите гораздо больше моих вопросов :D - person Ian; 08.06.2020