Estoy leyendo los documentos de CDK sobre SecretsManager y no estoy seguro de haber entendido mal, pero lo que pensé que funcionaría a partir de su ejemplo no parece otorgar el permiso que esperaba. Esencialmente, tengo una pila que contiene algunas Lambdas y me gustaría que todas pudieran leer dos secretos del 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); } }Si lo entendí correctamente, simplemente debería crear este rol y darle permisos para acceder a los secretos. Sin embargo, mi Lambda todavía falló cuando traté de ejecutarlos. ¿Debo hacer algo más que no se menciona en los documentos que estaba leyendo sobre la asignación explícita de ese rol a las Lambdas también?
Dependiendo de su contexto real, hay dos variantes posibles.
1. Importar rol existente
Si la función de Lambda se ha predefinido (p. ej., en una pila diferente), puede agregar permisos adicionales a la función de ejecución de Lambda existente importándola primero a esta pila de 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); } } Para obtener más información sobre el uso del módulo aws-iam CDK, aquí está el enlace a la documentación . Aquí puede obtener más información sobre el propio rol de ejecución de Lambda.
2. Función Lambda definida como parte de la pila
Si la función lambda se definió en algún lugar de esta pila, simplemente puede adjuntar los permisos a la función Lambda a través de su referencia usando dbReadSecret.grantRead(lambda.role) y dbWriteSecret.grantRead(lambda.role) respectivamente.
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); } }Por favor, eche un vistazo a la respuesta a esta pregunta como referencia.