Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

260
Visualizações
Resolución de dependencias cíclicas entre pilas de AWS CDK CloudFormation

Contexto, tengo una aplicación CDK con dos pilas usando la siguiente configuración:

 Stack_A: StateMachine_A Lambda_A S3Bucket_A IAMRole_A Stack_B: StateMachine_B SageMakerTrainJob_B IAMRole_B

StateMachine_A ejecuta Lambda_A mediante el rol de ejecución IAMRole_A. Un paso separado en StateMachine_A escribe datos en S3Bucket_A. StateMachine_B ejecuta SageMakerTrainJob_B mediante el rol de ejecución IAMRole_B. El propósito de Lambda_A es iniciar la ejecución de StateMachine_B, cuyo SageMakerTrainJob_B necesita leer desde S3Bucket_A. Por lo tanto, tenemos que configurar los siguientes permisos:

  • IAMRole_A necesita permisos de ejecución de inicio en StateMachine_B.
  • IAMRole_B necesita permisos de lectura en S3Bucket_A.

Intentamos modelar esto en CDK creando una dependencia directa en Stack_B en Stack_A, usando referencias a IAMRole_A y S3Bucket_A dentro de la definición de Stack_B para otorgar los permisos necesarios en el código. Sin embargo, esto generó el siguiente error:

Error: 'Stack_B' depends on 'Stack_A' (dependency added using stack.addDependency()). Adding this dependency (Stack_A -> Stack_B/IAMRole_B/Resource.Arn) would create a cyclic reference.

Del mismo modo, tratar de modelar la dependencia en la otra dirección dio el mismo error:

Error: 'Stack_A' depends on 'Stack_B' (dependency added using stack.addDependency()). Adding this dependency (Stack_B -> Stack_A/S3Bucket_A/Resource.Arn) would create a cyclic reference.

¿Hay alguna forma de evitar esto usando dependencias de código? ¿Existen mejores prácticas recomendadas para situaciones como esta? Algunas opciones que hemos considerado incluyen:

  • Usar una tercera pila que depende de ambas para dar acceso a Stack_A y Stack_B a los recursos de cada uno.
  • Crear funciones de acceso adicionales para los recursos necesarios dentro de cada pila y mantener los permisos de asumir funciones para las funciones de Lambda/SageMaker en algún lugar fuera de CDK.
  • Poniéndolos todos en una pila. No es excelente para la organización y hace que los recursos estén muy estrechamente acoplados: es posible que no queramos que StateMachine_A sea el único punto de entrada a StateMachine_B en el futuro.

Además, veo que hubo problemas similares durante el desarrollo de CDK con CodeCommit/CodePipeline y APIGateway/Lambda . ¿Se trata de un error relacionado o simplemente estamos tratando de hacer algo que no es compatible?

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Las referencias circulares siempre son complicadas. Este no es un problema exclusivo del CDK. A medida que explica el problema lógicamente, ve dónde las cosas comienzan a descomponerse. CloudFormation debe crear cualquier recurso del que dependa otro recurso antes de poder crear el recurso dependiente. No hay una solución que se ajuste a todos los enfoques para esto, pero daré algunas ideas que funcionan.

  1. Promover recursos compartidos a otra pila. En su caso, el depósito S3 debe ser utilizado por ambas pilas, por lo que si está en una pila que se ejecuta antes que ambas, puede crear el depósito S3, usar una exportación/importación en la pila B para hacer referencia al depósito S3 y usar y exportar /import en la pila A para hacer referencia tanto al depósito S3 como a la máquina de estado en B.
  2. Utilice comodines en los permisos. A menudo, puede conocer el nombre, o una parte suficiente del nombre, de un recurso para usar comodines en sus permisos. Desea mantener los permisos con un alcance estricto, pero con frecuencia una coincidencia de nombre parcial es lo suficientemente buena. Utilice esta opción con precaución, por supuesto. También tenga en cuenta que muchos recursos pueden ser nombrados por usted. Muchos prefieren no hacer esto nunca, y algunos recursos no deberían hacerlo (como el depósito S3), pero a menudo encuentro que es más fácil nombrar las cosas.
  3. Cree un recurso personalizado para unir las cosas. Si tiene una verdadera dependencia circular que no se puede resolver (incluso en la misma pila), es posible que deba usar un recurso personalizado para que haga el trabajo por usted. Un excelente ejemplo de esto son los eventos de depósito de S3 .
over 4 years ago · Santiago Trujillo Relatório

0

Además de las pautas de Jason, me gustaría mencionar una cuarta opción:

También puede intentar desacoplar las dos pilas moviéndose más hacia una arquitectura basada en eventos. Si bien no puede resolver la dependencia de IAMRole_B needs read permissions on S3Bucket_A en este ejemplo, puede resolver la dependencia IAMRole_A needs startExecution permissions on StateMachine_B . La pila A podría presentar un EventBridge donde StateMachine_A genera un evento tan pronto como finaliza. StateMachine_B puede suscribirse a este evento y comenzar tan pronto como se haya generado. Las pilas se verían así:

 Stack_A: StateMachine_A Event_A S3Bucket_A IAMRole_A Stack_B: StateMachine_B SageMakerTrainJob_B IAMRole_B

Todavía tendrías dos dependencias:

  • IAMRole_B necesita permisos de lectura en Event_A.
  • IAMRole_B necesita permisos de lectura en S3Bucket_A.
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda