【问题标题】:How do I add Secrets Manager IAM permission?如何添加 Secrets Manager IAM 权限?
【发布时间】:2020-06-08 01:41:33
【问题描述】:

我正在阅读有关 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 的事情?

【问题讨论】:

  • 您是在部署 Lambda 后添加的吗?如果是这样,它可能已经承担并且需要再次承担该角色。此外,此代码正在创建角色,但未将其与 Lambda 关联:(
  • 您是否将此角色添加到 Lambda 函数作为其执行角色?
  • 我确实在土地已经部署后添加了这个。 @DennisTraub 您将如何将附加角色与 Lamda 相关联?
  • 一个 Lambda 函数只能承担一个执行角色。您要么必须将具有上述权限的策略添加到现有角色,要么将附加到现有 Lambda 函数的角色替换为新角色。
  • @DennisTraub 谢谢!你有任何例子的链接吗?或者,如果您通过示例弹出答案并且它有效,那么我可以接受:)

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


【解决方案1】:

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

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 documentationHere,您可以了解有关 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);
    }
}

请查看the answer to this question 以供参考。

【讨论】:

  • 谢谢,请继续跟进。这是修改角色写的?当这个 CDK 堆栈本身最有可能首先创建 roleArn 时,我如何获得它?
  • 我了解到 Lambda 函数已经存在。这意味着应该存在关联的现有角色。
  • 请说明 Lambda 函数是否是堆栈的一部分,或者 Lambda 函数是否已经存在。
  • 请看这个问题的答案以供参考:stackoverflow.com/questions/52636929/…
  • 乐于助人。让我知道你是否还有什么遗漏。关于文档:这是一个开源项目,所以请随时贡献 ;-)
猜你喜欢
  • 2021-10-08
  • 1970-01-01
  • 2022-10-24
  • 1970-01-01
  • 2019-11-28
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
  • 2018-12-06
相关资源
最近更新 更多