如何添加 Secrets Manager IAM 权限?

Ian*_*Ian 3 javascript amazon-web-services aws-secrets-manager aws-cdk

我正在阅读有关SecretsManager的 CDK 文档,我不确定我是否误解了,但是我认为从他们的示例中可以看到的内容似乎并未授予我预期的权限。本质上,我有一个包含一些 Lambda 的堆栈,我希望它们都能从 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,我应该简单地创建这个角色并授予它访问机密的权限?然而,当我尝试运行它们时,我的 Lambda 仍然失败。我是否还需要执行我正在阅读的有关将该角色明确分配给 Lambda 的文档中未提及的任何其他操作?

Den*_*aub 5

根据您的实际情况,有两种可能的变体。

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

有关aws-iamCDK 模块使用的更多信息,请访问文档链接在这里,您可以了解有关 Lambda 执行角色本身的更多信息。

2. Lambda 函数定义为堆栈的一部分

如果已在此堆栈中的某处定义了 lambda 函数,则您可以分别使用dbReadSecret.grantRead(lambda.role)和简单地通过其引用将权限附加到 Lambda 函数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);
    }
}
Run Code Online (Sandbox Code Playgroud)

请查看此问题的答案以供参考。