-
Notifications
You must be signed in to change notification settings - Fork 39
Description
I'd like to suggest a centralized place for interface definitions and a more use-oriented scheme for Outputs naming. I assume you were trying to simplify/standardize the interfaces when creating cfn-modules, but I've already run into a case that worries me. I bring it up since interface design gets harder and harder to fix the longer you wait.
Background: The next ECS Service I need to integrate requires an inbound TCP connection so I'm forced to implement an NLB stack in addition to our "existing" ALB stack.
Issue: This lead me to use/compare alb-listener and ecs-nlb-listener-and-target. While both expose an -Arn output,
- In
alb-listenerthe ARN is theListener - In
ecs-nlb-listener-and-targetthe ARN is theTargetGroup
The ambiguity is especially pronounced since ecs-nlb-listener-and-target also has a Listener with an Arn that could be exposed. Technically, the interface for the two is different (i.e. ExposeArn vs Target) so they're not "incompatible", but I don't think the ExposeArn interface is useful/scalable.
Proposal: It seems to me that interfaces should not just indicate but enforce compatibility. E.G. a parameter named TargetModule should (in theory) accept any module that implements the Target interface. Like a puzzle piece, this relationship is enforced by ensuring that exports should only be compatible with each other (e.g. TargetArn and TargetSg).
If a Resource can be used in multiple ways, it can be exposed at several endpoints. For example,
- An ECS Service would exposed its Security Group at
IngressSgto indicate where to attach an Ingress rule for access to the service. - The ECS Service would expose the same Security Group at
EgressSgas the group that gets authorized e.g. access to the RDS database. - An
AlbListenercould expose the ALB's-LoadBalancerSgatIngressSgsince this is the group that would be used to access the listener - An
AlbTargetwould expose the same-LoadBalancerSgatEgressSgsince this group would be authorized to e.g. the ECS Service as the source of traffic. - A more complex module (e.g. ALB + ECS) could expose the ALB SG at
IngressSgand the ECS SG atEgressSg
Obviously, it'd be easier to see/plan/enforce these relationships if they were listed e.g. here in the docs module.