我有两个(和其他几个)堆栈创建循环依赖:
- 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.
型
为了进行概述,最好在专用堆栈中定义容器服务及其目标组,但如果这样做,我会得到一个循环依赖关系。
是添加的动作有问题吗?
有没有可能的解决办法?
1条答案
按热度按时间nlejzf6q1#
根据我们的经验,我们必须区分如何创建ECS服务和负载均衡器。我们最终拥有了一个ECS Service构造,即使没有连接到负载均衡器和目标组,也可以部署该构造。
我们创建的ECS服务构造具有可选参数,可以放入负载平衡器ARN和负载平衡器HTTPS侦听器ARN中。然后,我们使用LookUps来引用这些ALB和Listeners。