如何添加 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);
}
}
请参考。
我正在阅读关于 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);
}
}
请参考