javascript - 如何添加 Secrets Manager IAM 权限?

标签 javascript amazon-web-services aws-cdk aws-secrets-manager

我正在阅读关于 SecretsManager 的 CDK 文档而且我不确定我是否误解了,但是我认为从他们的示例中可行的方法似乎并没有授予我预期的许可。本质上,我有一个包含一些 Lambda 的堆栈,我希望它们都能够从 SecretsManager 中读取两个 secret 。

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

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

最佳答案

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

1. 导入现有 Angular 色

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

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 documentationHere ,您可以了解有关 Lambda 执行 Angular 色本身的更多信息。

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

请查看 the answer to this question 以供引用。

关于javascript - 如何添加 Secrets Manager IAM 权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62245700/

相关文章:

javascript - Node.js - 请求数据库和延迟

Javascript 平台游戏碰撞检测

amazon-web-services - 使用 CloudFormation 更改集对正在运行的集群启用 AWS Redshift 加密

amazon-web-services - Aws CDK 跳过 IAM 语句更改

javascript - 从 Razor 输出 JavaScript

mongodb - 在 Mongo 的数据上运行 Map/Reduce 的最佳方法是什么?

amazon-web-services - 无论如何我可以修改get-login-password token 的到期时间吗?

amazon-web-services - 有没有办法在通过cdk制作RDS时设置默认密码

aws-cdk - AWS CDK 条件阶段部署

javascript - 轨道 3 jQuery : How to alert id of td