如何添加 Secrets Manager IAM 权限?

How do I add Secrets Manager IAM permission?

我正在阅读关于 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);
    }
}

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

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

1.导入现有角色

如果 Lambda 函数已被预定义(例如在不同的堆栈中),您可以通过先将其导入此 CDK 堆栈来向现有的 Lambda 执行角色添加额外的权限。

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 模块 here's the link to the documentation. Here 的更多信息,您可以了解有关 Lambda 执行角色本身的更多信息。

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

如果 lambda 函数已在此堆栈中的某处定义,您只需分别使用 dbReadSecret.grantRead(lambda.role)dbWriteSecret.grantRead(lambda.role) 通过其引用将权限附加到 Lambda 函数。

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);
    }
}

请参考