Búsqueda de sitios web

typescript - Ejecutando recurso personalizado de AWS CDK para la configuración de la base de datos después de que se crea la instancia de RDS


¿Cómo puedo activar una función Lambda usando AWS CDK después de que una instancia RDS esté activa?

Estoy configurando un sistema con una instancia RDS y un clúster EKS usando AWS CDK y Typescript. Después de que se cree la instancia RDS, me gustaría configurar algunos usuarios en la instancia de la base de datos para que sean utilizados por microservicios en EKS.

Creé un Recurso Personalizado respaldado por una función Lambda para esto, también implementada en Typescript. La función Lambda recupera el secreto generado por CDK para la instancia de RDS más algunos secretos para mis usuarios de la base de datos, se conecta a la base de datos y crea los usuarios de la base de datos. Idealmente, el recurso personalizado se ejecuta después de que la instancia de la base de datos esté activa y antes de que se instalen los microservicios. ¿Cómo puedo lograr esto?

No he encontrado una manera de declarar explícitamente la dependencia y mi Lambda técnicamente no requiere una dependencia (aparte de usar secret.grantRead(lambda)). Solo ejecutar un bucle de reintento en Lambda hasta que todo esté activo probablemente no funcionará debido a los largos tiempos de creación. Cualquier fragmento de código/ejemplo/... es muy apreciado, hasta ahora solo he encontrado referencias sobre el enfoque general.

Actualiza con detalles en respuesta a @jogold: Con

    const database = new rds.DatabaseInstance(this, 'db', {
      instanceIdentifier: conf.systemName,
      engine: rds.DatabaseInstanceEngine.POSTGRES,
      instanceType: ec2.InstanceType.of(ec2.InstanceClass.BURSTABLE3, ec2.InstanceSize.MICRO),
      masterUsername: MASTER_USER,
      allocatedStorage: 20, maxAllocatedStorage: 100,
      multiAz: conf.isProduction,
      storageEncrypted: true,
      backupRetention: cdk.Duration.days(7),
      deletionProtection: false, 
      vpc, securityGroups: [ rdsSG ]
    });

CDK generará un secreto con un nombre más o menos aleatorio con las credenciales de acceso a la base de datos. Intenté adjuntar el secreto directamente a mi Lambda:

    new cdk.CustomResource(this, 'preinstall', { 
      serviceToken: preinstallProvider.serviceToken,
      properties: { secret: database.secret }
    });

Pero eso me da

    Error: Resolution error: Resolution error: Trying to resolve() a Construct at /Resources/${Token[td000.preinstall.Default.LogicalID.221]}/Properties/dbSecret/node/_actualNode.

Además, parece que la interfaz ISecret no tiene el ID/nombre del secreto, así que no sabría qué hacer con él en la Lambda.

Respuesta #1

CDK normalmente intentará adivinar las dependencias por ti y asegurarse de que se creen en el orden correcto. Cuando esto no funciona (como en tu ejemplo), puedes declarar explícitamente que un recurso depende de otro. Por ejemplo:

const customResource = new cdk.CustomResource(this, 'preinstall', { 
  serviceToken: preinstallProvider.serviceToken,
  properties: { secret: database.secret }
});

customResource.node.addDependency(database);

Consulta la documentación para más detalles https://docs.aws.amazon.com/cdk/api/latest/docs/core-readme.html#construct-dependencies

Artículos relacionados