Open ptaylor10 opened 4 years ago
I can confirm that the Fargate service does not have the passed connections.addSecuritGroup() SG once it's running
this is a problem for regular ECS clusters as well. I can't find any way to actually add security group ingress settings to a CDK-created cluster, which is pretty wild. imho this is a high-pri bug. I would also say that we're seeing too many of these strange bugs and behaviors, more often than not forcing us to work with low-level cfn
classes instead, since these are far more robust. I don't mind it, but its a shame.
So the issue here is that ECS Clusters don't have security groups. When using ECS with EC2 (not fargate), the connections
object on ecs.Cluster
dictates the security groups on the EC2 instances within the cluster. This is something the CDK setup for convenience but its kinda confusing when you're using fargate or just in general when you see a connections
object on the cluster when it doesn't really go there.
To set the security groups for your fargate services, you can do so using the connections
object on the ecs.FargateService
. You can access this on the .service
property of your ALB/NLB fargate services in ecs-patterns.
This is pretty confusing for users imo. @SoManyHs @uttarasridhar @kohidave you guys might have an opinion here.
relates to #7400
To set the security groups for your fargate services, you can do so using the
connections
object on theecs.FargateService
. You can access this on the.service
property of your ALB/NLB fargate services in ecs-patterns.
If I do ecs.FargateService.connections.addSecurityGroup where ecs.FargateService is created by ecs-patterns.ApplicationLoadBalancedFargateService, the result is that the added SecurityGroup is added to the ALB in front, not on the Fargate service itself.
The above behaviour is quite confusing since it's added on service.connections, but there is also a loadBalancer.connections object that exposes the same addSecurityGroup method, neither of those results in a SecurityGroup added to the FargateService.
Is this a bug? Judging from the methods and the conversations here, service.connections.addSecurityGroup should result in a SecurityGroup on the Fargate service itself, not on the LoadBalancer?
(cdk 1.38.0)
Not sure if related or should be it's own ticket, but rdsInstance.connections.addSecurityGroup
also does not add the passed securitygroup to the databases securitygroups.
I think I have noticed the same issue. Fargate construct allows to define security group only when creating an instance. Using connections.addSecurityGroup
does not alter the cloudformation. But I will verify it again :)
To set the security groups for your fargate services, you can do so using the
connections
object on theecs.FargateService
. You can access this on the.service
property of your ALB/NLB fargate services in ecs-patterns.If I do ecs.FargateService.connections.addSecurityGroup where ecs.FargateService is created by ecs-patterns.ApplicationLoadBalancedFargateService, the result is that the added SecurityGroup is added to the ALB in front, not on the Fargate service itself.
The above behaviour is quite confusing since it's added on service.connections, but there is also a loadBalancer.connections object that exposes the same addSecurityGroup method, neither of those results in a SecurityGroup added to the FargateService.
Is this a bug? Judging from the methods and the conversations here, service.connections.addSecurityGroup should result in a SecurityGroup on the Fargate service itself, not on the LoadBalancer?
(cdk 1.38.0)
can confirm this behavior for NetworkLoadBalancedFargateService
and I think it affects all NLB constructs in ecs-patterns module.
If we call the addSecurityGroup()
method on Connections
object of the fargate service, the security group does not get added to the networkConfiguration
property of the service , instead its just added to the VPC.
To add a security group to the fargate service's networkConfiguration
, we need to pass the SG in SecurityGroups
or securityGroup
property of the underlying FargateService construct, which is not possible in NetworkLoadBalancedFargateService
.
Since the networkConfiguration
property, configureAwsVpcNetworking ()
method & configureAwsVpcNetworkingWithSecurityGroups ()
method are protected , they cannot be accessed directly outside the BaseService
class , we can't manually add SGs to it.
I am willing to send a PR for this by including an optional securityGroups
prop that will get passed to the underlying ECS service. Let me know. Thanks .
@ap00rv that is very interesting. This feels like a bug with the design of the connections
on the construct where the networkConfiguration
property should actually be a lazy value that computes the list of security groups from the connections property before synth.
If that makes sense and is possible, I believe it would be the preferred solution. Keeping the number of input properties down, especially on the higher level constructs like those in patterns, is something that we are trying to do. It would be easy to expose every single property of the underlying constructs as time goes on but then the abstraction of the pattern starts to become redundant.
If you're interested in exploring this in a PR definitely go for it. Some investigation may be necessary to see if we can accomplish this via connections. The connections object is used across constructs and if the patterns are not correctly leveraging it there may be other bugs stemming from this.
@ap00rv that sounds awesome if you could make that PR. If the security group configurations can be initialized independently for the load balancer and service, that should provide a workaround to the immediate issue described here.
Above and beyond, ideally, adding a security group via albService.service.connections
should also add security groups to the service rather than (or perhaps in addition to?) the LB, but this might end up being a breaking change, particularly considering that changing the service networking configuration requires resource replacement (whereas LB SG changes do not).
This is still an active issue, FWIW. @ap00rv have you been able to make any progress on it?
It's wild that this is still an issue 4 years later. Similar to @MichaelHindley, I've also seen this in the RDS construct. Are they related?
I was not able to add another security group to the ECS Pattern for ALB Fargate service using Fargate.cluster.connections.addSecurityGroup() method.
Reproduction Steps
ecs-fargate.ts
db.ts
Error Log
No real error messages just don't see the security group in the cloud formation json nor will the application connect to the database.
Environment
Other
I am currently using this as a workaround as it has a similar effect:
ec2.SecurityGroup.fromSecurityGroupId(this, this.stackName+'_DBSecurityGroup', cdk.Fn.importValue('DBSecurityGroupId')).connections.allowFrom(fargateservice.service.connections, ec2.Port.tcp(3306))
This is :bug: Bug Report