Skip to content

Commit b07423d

Browse files
committed
feat: add sg to ingress & egress
1 parent 1db052e commit b07423d

File tree

3 files changed

+63
-12
lines changed

3 files changed

+63
-12
lines changed

easyecs/cloudformation/template/__init__.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,20 @@ def create_load_balancer(stack, ecs_manifest: EcsFileModel, vpc):
128128
),
129129
description=egress_rule.name,
130130
)
131+
elif egress_rule.security_group_id:
132+
lb_security_group.add_egress_rule(
133+
peer=SecurityGroup.from_security_group_id(
134+
stack,
135+
"egress_rule_sg",
136+
security_group_id=egress_rule.security_group_id,
137+
),
138+
connection=(
139+
Port.tcp(egress_rule.port)
140+
if egress_rule.port != -1
141+
else Port.all_traffic()
142+
),
143+
description=egress_rule.name,
144+
)
131145
if ecs_manifest.load_balancer.security_group_rules.ingress:
132146
for (
133147
ingress_rule
@@ -156,6 +170,20 @@ def create_load_balancer(stack, ecs_manifest: EcsFileModel, vpc):
156170
),
157171
description=ingress_rule.name,
158172
)
173+
elif ingress_rule.security_group_id:
174+
lb_security_group.add_ingress_rule(
175+
peer=SecurityGroup.from_security_group_id(
176+
stack,
177+
"ingress_rule_sg",
178+
security_group_id=ingress_rule.security_group_id,
179+
),
180+
connection=(
181+
Port.tcp(ingress_rule.port)
182+
if ingress_rule.port != -1
183+
else Port.all_traffic()
184+
),
185+
description=ingress_rule.name,
186+
)
159187
listener = lb.add_listener(
160188
"NlbListener", port=ecs_manifest.load_balancer.listener_port
161189
)

easyecs/cloudformation/template/task_definition.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import re
2-
from easyecs.model.ecs import EcsFileSecretModelV2
2+
from easyecs.model.ecs import EcsFileSecretModel, EcsFileSecretModelV2
33

44

55
def create_task_definition(
@@ -121,13 +121,13 @@ def extract_container_config(stack, container_definition, log_configuration, run
121121
command = ["sleep", "infinity"]
122122

123123
environment = {}
124-
if isinstance(container_definition.env, List):
124+
if isinstance(container_definition.env, list):
125125
environment = {
126126
env_definition.name: env_definition.value
127127
for env_definition in container_definition.env
128128
if env_definition.active
129129
}
130-
elif isinstance(container_definition.env, Dict):
130+
elif isinstance(container_definition.env, dict):
131131
environment = container_definition.env
132132

133133
secrets = extract_secrets(stack, container_definition.secrets, name)
@@ -173,16 +173,22 @@ def extract_secrets(stack, secret_definitions, container_name):
173173
ecs_secret = ECSSecret.from_secrets_manager(secret, secret_definition.field)
174174
secrets[secret_name] = ecs_secret
175175
elif isinstance(secret_definition, EcsFileSecretModelV2):
176-
arn_fields = dict(re.finditer(r"^arn:aws:secretsmanager:(?P<region_name>[a-z0-9-]+):(?P<account_id>\d{12}):secret:(?P<secret_name>[^:]+)(?::(?P<field>[^:]*))?(?::([^:]*))?(?::([^:]*))?$", secret_definition.valueFrom))
176+
arn_fields = list(
177+
re.finditer(
178+
r"^^(?P<secret_complete_arn>arn:aws:secretsmanager:(?P<region_name>[a-z0-9-]+):(?P<account_id>\d{12}):secret:(?P<secret_name>[^:]+))(?::(?P<field>[^:]*))?(?::([^:]*))?(?::([^:]*))?$", # noqa
179+
secret_definition.valueFrom,
180+
)
181+
)
177182
if not arn_fields:
178183
raise ValueError(f"Invalid ARN format: {secret_definition.valueFrom}")
179-
field = arn_fields[0].group_dict()["field"]
180-
import pdb; pdb.set_trace()
184+
secret_complete_arn = arn_fields[0].groupdict()["secret_complete_arn"]
185+
field = arn_fields[0].groupdict()["field"]
186+
print(secret_definition.valueFrom)
181187
secret_name = secret_definition.name
182188
secret = Secret.from_secret_complete_arn(
183-
stack, f"{secret_name}_{container_name}", secret_definition.valueFrom
189+
stack, f"{secret_name}_{container_name}", secret_complete_arn
184190
)
185-
ecs_secret = ECSSecret.from_secrets_manager(secret)
191+
ecs_secret = ECSSecret.from_secrets_manager(secret, field=field)
186192
secrets[secret_name] = ecs_secret
187193
else:
188194
raise Exception("Unsupported secret type")

easyecs/model/ecs.py

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -155,13 +155,30 @@ class SecurityGroupRule(BaseModel):
155155
port: int
156156
cidr: Optional[str] = None
157157
prefix_list: Optional[str] = None
158+
security_group_id: Optional[str] = None
158159

159160
@model_validator(mode="after")
160161
def validate_cidr(self):
161-
if self.prefix_list is not None and self.cidr is not None:
162-
raise ValueError("A rule is either a CIDR or a prefix list, not both!")
163-
if self.prefix_list is None and self.cidr is None:
164-
raise ValueError("A rule is either a CIDR or a prefix list, not none!")
162+
has_at_least_two_true = lambda lst: sum(lst) >= 2 # noqa: E731
163+
if has_at_least_two_true(
164+
[
165+
self.prefix_list is not None,
166+
self.cidr is not None,
167+
self.security_group_id is not None,
168+
]
169+
):
170+
raise ValueError(
171+
"A rule is either a CIDR, a security group id or a prefix list!"
172+
)
173+
if (
174+
self.prefix_list is None
175+
and self.cidr is None
176+
and self.security_group_id is None
177+
):
178+
raise ValueError(
179+
"A rule is either a CIDR, a security group id or a prefix list, not"
180+
" none!"
181+
)
165182
return self
166183

167184

0 commit comments

Comments
 (0)