python-3.x 在AWS-CDK中使用负载平衡器侦听器定义ecs服务时避免循环依赖

70gysomp  于 2023-08-08  发布在  Python
关注(0)|答案(1)|浏览(69)

我有两个(和其他几个)堆栈创建循环依赖:

  • app.py
app = cdk.App()
vpc_stack = RcsVpcStack(app, "RcsVPCStack")
efs_stack = RcsEfsStack(app, "RcsEfsStack", vpc_stack=vpc_stack)
ecs_stack = RcsECSStack(app, "RcsECSStack", vpc_stack=vpc_stack, fileSystem=efs_stack.efs_filesystem)

elbv2_stack = RcsELBv2Stack(app, "RcsELBv2Stack", 
                            vpc_stack=vpc_stack,  
                            cert_arn=CERT_ARN
                            )
ecs_service_stack = RcsECSServiceStack(app, "RcsECSServiceStack", 
                   vpc_stack=vpc_stack, 
                   ecs_stack=ecs_stack,
                   elbv2_stack=elbv2_stack
                   )

字符串

  • Elbv2Stack

使用侦听器定义ApplicationLoadbalancer

self.domain_cert = certm.Certificate.from_certificate_arn(
      self,
      "rcs-domain-cert",
      cert_arn
  )
  self.elbv2_loadbalancer = elbv2.ApplicationLoadBalancer(
      self,
      "rcs-elastic-loadbalancer",
      load_balancer_name="rcs-elastic-loadbalancer",
      vpc=vpc_stack.vpc,
      vpc_subnets=ec2.SubnetSelection(
          subnets=vpc_stack.vpc.public_subnets
      ),
      idle_timeout=Duration.seconds(300),
      internet_facing=True
  )
  self.elbv2_loadbalancer_listener = self.elbv2_loadbalancer.add_listener(
      "rcs-elastic-loadbalancer-listener",
      port=443,
      protocol=elbv2.ApplicationProtocol.HTTPS,
      certificates=[elbv2.ListenerCertificate.from_certificate_manager(self.domain_cert)]
  )
  self.elbv2_loadbalancer_listener.add_targets(
      "rcs-default-target-group",
      port=80,
      protocol=elbv2.ApplicationProtocol.HTTP
  )

  • EcsStack

定义ECS容器服务

# ... service definitions 

  elbv2_stack.elbv2_loadbalancer_listener.add_targets(
      "rcs-api-backend-loadbalancer-target",
      port=80,
      targets=[
          ecs_service_stack.ecs_api_backend.load_balancer_target(
              container_name="testService",
              container_port=someContainerPort
          )
      ]
  )
  self.test_target_group = elbv2.ApplicationTargetGroup(
      self,
      "rcs-api-backend-target-group",
      vpc=vpc_stack.vpc,
      port=80,
      protocol=elbv2.ApplicationProtocol.HTTP,
      health_check=elbv2.HealthCheck(
          healthy_http_codes="200-299",
          interval=Duration.seconds(20),
          path="/health-check",
          protocol=elbv2.Protocol.HTTP,
          timeout=Duration.seconds(5),
          healthy_threshold_count=2
      )
  )
  elbv2_stack.elbv2_loadbalancer_listener.add_action(
      "rcs-api-backend-elbv2-action",
      action=elbv2.ListenerAction.forward(
          target_groups=[self.test_target_group],
      ),
      priority=2,
      conditions=[
          elbv2.ListenerCondition.path_patterns(["*"])
      ]
  )


错误:

RuntimeError: Error: 'RcsECSServiceStack' depends on 'RcsELBv2Stack' 
({RcsECSServiceStack/rcs-api-backend/Service}.addDependency({RcsELBv2Stack/rcs-elastic-loadbalancer/rcs-elastic-loadbalancer-listener/Resource}), 
{RcsECSServiceStack/rcs-api-backend/Service}.addDependency({RcsELBv2Stack/rcs-elastic-loadbalancer/rcs-elastic-loadbalancer-listener/rcs-default-target-groupGroup/Resource}), 
{RcsECSServiceStack/rcs-api-backend/Service}.addDependency({RcsELBv2Stack/rcs-elastic-loadbalancer/rcs-elastic-loadbalancer-listener/rcs-api-backend-loadbalancer-targetGroup/Resource}), 
{RcsECSServiceStack/rcs-api-backend/Service}.addDependency({RcsELBv2Stack/rcs-elastic-loadbalancer/rcs-elastic-loadbalancer-listener/rcs-api-backend-elbv2-actionRule/Resource})). Adding this dependency (RcsELBv2Stack -> RcsECSServiceStack/rcs-api-backend-target-group/Resource.Ref) would create a cyclic reference.


为了进行概述,最好在专用堆栈中定义容器服务及其目标组,但如果这样做,我会得到一个循环依赖关系。
是添加的动作有问题吗?
有没有可能的解决办法?

nlejzf6q

nlejzf6q1#

根据我们的经验,我们必须区分如何创建ECS服务和负载均衡器。我们最终拥有了一个ECS Service构造,即使没有连接到负载均衡器和目标组,也可以部署该构造。
我们创建的ECS服务构造具有可选参数,可以放入负载平衡器ARN和负载平衡器HTTPS侦听器ARN中。然后,我们使用LookUps来引用这些ALB和Listeners。

相关问题